استخدام Vertex AI: استخدام سلاسل إجراءات التوقّع المخصّصة من خلال Sklearn لمعالجة البيانات مسبقًا وبعد المعالجة للحصول على التوقّعات

1. نظرة عامة

في هذا الدرس، ستتعرّف على كيفية استخدام إجراءات التوقّعات المخصّصة في Vertex AI لكتابة منطق مخصّص للمعالجة المُسبَقة والمعالجة اللاحقة. على الرغم من أنّ هذا العيّنة يستخدم Scikit-learn، يمكن أن تعمل إجراءات التوقّعات المخصّصة مع إطارات عمل الذكاء الاصطناعي الأخرى في Python، مثل XGBoost وPyTorch وTensorFlow.

ما ستتعرّف عليه

ستتعرّف على كيفية:

  • كتابة منطق توقّعات مخصّص باستخدام إجراءات توقّعات مخصّصة
  • اختبار حاوية تقديم الطعام المخصّصة ونموذجها محليًا
  • اختبار حاوية العرض المخصّصة على توقعات Vertex AI

تبلغ التكلفة الإجمالية لتنفيذ هذا البرنامج التدريبي على Google Cloud حوالي 1 دولار أمريكي.

2. مقدمة عن Vertex AI

يستخدم هذا المختبر أحدث منتجات الذكاء الاصطناعي المتاحة على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة في Google Cloud في تجربة تطوير سلسة. في السابق، كان بالإمكان الوصول إلى النماذج المدربة باستخدام AutoML والنماذج المخصّصة من خلال خدمات منفصلة. ويجمع العرض الجديد بين الاثنين في واجهة برمجة تطبيقات واحدة، إلى جانب منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI.

تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم سير عمل تعلُّم الآلة من البداية إلى النهاية. سيركّز هذا الدرس التطبيقي على التوقّعات وWorkbench.

نظرة عامة على منتجات Vertex

3- نظرة عامة على حالة الاستخدام

حالة الاستخدام

سوف تنشئ في هذا التمرين المعملي نموذج انحدار عشوائي للغابات للتنبؤ بسعر المعين بناءً على سمات مثل القطْع والوضوح والحجم.

ستكتب منطقًا مخصّصًا للمعالجة المُسبَقة للتحقّق من أنّ البيانات في وقت العرض بالتنسيق المتوقّع من النموذج. ستكتب أيضًا منطقًا مخصّصًا للمعالجة اللاحقة لتقريب التوقّعات وتحويلها إلى سلاسل. لكتابة هذا المنطق، ستستخدم إجراءات التنبؤ المخصّصة.

مقدمة عن سلاسل إجراءات التوقّعات المخصّصة

تعالج حاويات Vertex AI المُنشأة مسبقًا طلبات التوقّعات من خلال تنفيذ عملية التوقّع لإطار عمل تعلُّم الآلة. قبل تنفيذ الإجراءات الروتينية المخصَّصة للتوقّعات، إذا أردت معالجة الإدخال مسبقًا قبل تنفيذ التوقّع، أو ما بعد معالجة توقّع النموذج قبل عرض النتيجة، ستحتاج إلى إنشاء حاوية مخصّصة.

يتطلب إنشاء حاوية عرض مخصّصة كتابة خادم HTTP يلتف النموذج المُدرَّب، ويترجم طلبات HTTP إلى مدخلات النماذج، ويحول مخرجات النموذج إلى استجابات.

من خلال إجراءات التوقّعات المخصّصة، توفّر لك Vertex AI المكوّنات ذات الصلة بالعرض، ما يتيح لك التركيز على النموذج وعمليات تحويل البيانات.

4. إعداد البيئة

ستحتاج إلى مشروع على Google Cloud Platform تم تفعيل ميزة الفوترة فيه لتشغيل هذا الدليل التعليمي. لإنشاء مشروع، اتّبِع التعليمات الواردة هنا.

الخطوة 1: تفعيل واجهة برمجة تطبيقات Compute Engine

انتقِل إلى Compute Engine (محرك الحوسبة) واختَر تفعيل إذا لم يكن مفعّلاً. ستحتاج إلى هذا لإنشاء مثيل دفتر الملاحظات.

الخطوة 2: تفعيل واجهة برمجة التطبيقات Artifact Registry API

انتقِل إلى سجلّ العناصر واختَر تفعيل إذا لم يكن مفعّلاً. ستستخدم هذا الإجراء لإنشاء حاوية عرض مخصّصة.

الخطوة 3: تفعيل واجهة برمجة التطبيقات Vertex AI API

انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة برمجة التطبيقات Vertex AI API.

لوحة بيانات Vertex AI

الخطوة 4: إنشاء مثيل Vertex AI Workbench

من قسم Vertex AI في Cloud Console، انقر على Workbench:

قائمة Vertex AI

فعِّل واجهة برمجة التطبيقات Notebooks API إذا لم تكن مفعَّلة.

Notebook_api

بعد تفعيل هذه الميزة، انقر على النُسخ، ثم على إنشاء نسخة جديدة.

اقبل الخيارات التلقائية وانقر على إنشاء.

عندما يصبح الجهاز جاهزًا، انقر على فتح JUPYTERLAB لفتح الجهاز.

5- كتابة رمز التدريب

الخطوة 1: إنشاء حزمة في السحابة الإلكترونية

ستخزّن النموذج والعناصر التي تم إنشاؤها في مرحلة ما قبل المعالجة في حزمة على Cloud Storage. إذا كان لديك حزمة في مشروعك تريد استخدامها، يمكنك تخطّي هذه الخطوة.

من مشغّل التطبيقات، افتح جلسة طرفية جديدة.

Open_terminal

من وحدة التحكّم الطرفية، نفِّذ ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:

PROJECT_ID='your-cloud-project'

بعد ذلك، نفِّذ ما يلي في Terminal لإنشاء حزمة جديدة في مشروعك.

BUCKET="gs://${PROJECT_ID}-cpr-bucket"
gsutil mb -l us-central1 $BUCKET

الخطوة 2: تدريب النموذج

من الوحدة الطرفية، أنشِئ دليلاً جديدًا باسم cpr-codelab وأضِفه إلى القرص المضغوط.

mkdir cpr-codelab
cd cpr-codelab

في متصفّح الملفات، انتقِل إلى دليل cpr-codelab الجديد ثم استخدِم مشغّل التطبيقات لإنشاء دفتر ملاحظات Python 3 جديد باسم task.ipynb.

file_browser

من المفترض أن يظهر دليل cpr-codelab الآن على النحو التالي:

+ cpr-codelab/
    + task.ipynb

في دفتر الملاحظات، الصِق الرمز التالي.

أولاً، اكتب ملف requirements.txt.

%%writefile requirements.txt
fastapi
uvicorn==0.17.6
joblib~=1.0
numpy~=1.20
scikit-learn>=1.2.2
pandas
google-cloud-storage>=1.26.0,<2.0.0dev
google-cloud-aiplatform[prediction]>=1.16.0

سيحتوي النموذج الذي يتم نشره على مجموعة مختلفة من التبعيات المثبَّتة مسبقًا عن بيئة دفتر البيانات. لهذا السبب، عليك إدراج جميع الملحقات للنموذج في requirements.txt ثم استخدام pip لتثبيت الملحقات نفسها في دفتر البيانات. لاحقًا، ستختبر النموذج على الجهاز قبل نشره على Vertex AI للتأكّد من تطابق البيئتَين.

تثبِّت أداة Pip التبعيات في دفتر البيانات.

!pip install -U --user -r requirements.txt

يُرجى العِلم أنّه عليك إعادة تشغيل kernel بعد اكتمال عملية التثبيت باستخدام pip.

restart_kernel

بعد ذلك، أنشِئ الأدلة التي ستخزن فيها النموذج وعناصر المعالجة المسبقة.

USER_SRC_DIR = "src_dir"
!mkdir $USER_SRC_DIR
!mkdir model_artifacts

# copy the requirements to the source dir
!cp requirements.txt $USER_SRC_DIR/requirements.txt

من المفترض أن يظهر دليل cpr-codelab الآن على النحو التالي:

+ cpr-codelab/
    + model_artifacts/
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

بعد إعداد بنية الدليل، حان وقت تدريب نموذج.

أولاً، استورِد المكتبات.

import seaborn as sns
import numpy as np
import pandas as pd

from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer

import joblib
import logging

# set logging to see the docker container logs
logging.basicConfig(level=logging.INFO)

بعد ذلك، حدِّد المتغيّرات التالية. احرص على استبدال PROJECT_ID برقم تعريف مشروعك وBUCKET_NAME بالحزمة التي أنشأتها في الخطوة السابقة.

REGION = "us-central1"
MODEL_ARTIFACT_DIR = "sklearn-model-artifacts"
REPOSITORY = "diamonds"
IMAGE = "sklearn-image"
MODEL_DISPLAY_NAME = "diamonds-cpr"

# Replace with your project
PROJECT_ID = "{PROJECT_ID}"

# Replace with your bucket
BUCKET_NAME = "gs://{BUCKET_NAME}"

حمِّل البيانات من مكتبة seaborn، ثم أنشئ إطارَي بيانات، أحدهما يتضمّن الميزات والآخر يتضمّن التصنيف.

data = sns.load_dataset('diamonds', cache=True, data_home=None)

label = 'price'

y_train = data['price']
x_train = data.drop(columns=['price'])

لنلقِ نظرة على بيانات التدريب. يمكنك ملاحظة أنّ كل صف يمثّل مربّعًا.

x_train.head()

والتسميات، وهي الأسعار المتجاوبة.

y_train.head()

الآن، حدِّد تحويل عمود في sklearn لتشفير السمات الفئوية بترميز واحد ساخن وتوسيع نطاق السمات الرقمية.

column_transform = make_column_transformer(
    (preprocessing.OneHotEncoder(), [1,2,3]),
    (preprocessing.StandardScaler(), [0,4,5,6,7,8]))

تحديد نموذج الغابة العشوائية

regr = RandomForestRegressor(max_depth=10, random_state=0)

بعد ذلك، أنشئ مسار عمل sklearn. وهذا يعني أنّ البيانات التي يتمّ نقلها إلى هذه السلسلة من الإجراءات ستتمّ أولاً تشفيرها/تصغيرها ثمّ تمريرها إلى النموذج.

my_pipeline = make_pipeline(column_transform, regr)

تطبيق مسار الإحالة الناجحة على بيانات التدريب

my_pipeline.fit(x_train, y_train)

لنختبر النموذج للتأكّد من أنّه يعمل على النحو المتوقّع. استخدِم طريقة predict في النموذج مع إدخال عيّنة اختبارية.

my_pipeline.predict([[0.23, 'Ideal', 'E', 'SI2', 61.5, 55.0, 3.95, 3.98, 2.43]])

يمكننا الآن حفظ مسار الإحالة الناجحة في الدليل model_artifacts، ثم نسخه إلى حزمة Cloud Storage.

joblib.dump(my_pipeline, 'model_artifacts/model.joblib')

!gsutil cp model_artifacts/model.joblib {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

الخطوة 3: حفظ عنصر معالجة ما قبل التشغيل

بعد ذلك، ستقوم بإنشاء عنصر ما قبل المعالجة. سيتم تحميل هذا العنصر في الحاوية المخصّصة عند بدء تشغيل خادم النماذج. يمكن أن يكون العنصر الذي تمّت معالجته مسبقًا بأي شكل تقريبًا (مثل ملف pickle)، ولكن في هذه الحالة، ستكتب قاموسًا في ملف JSON.

clarity_dict={"Flawless": "FL",
              "Internally Flawless": "IF",
              "Very Very Slightly Included": "VVS1",
              "Very Slightly Included": "VS2",
              "Slightly Included": "S12",
              "Included": "I3"}

كانت ميزة clarity في بيانات التدريب دائمًا بالشكل المختصر (أي "FL" بدلاً من "Flawless"). في وقت العرض، نريد التأكّد من أنّ بيانات هذه الميزة يتم اختصارها أيضًا. ويعود السبب في ذلك إلى أنّ نموذجنا يعرف كيفية ترميز "FL" بترميز واحد ساخن، ولكن ليس "Flawless". ستكتب هذا المنطق المخصص للمعالجة المسبقة لاحقًا. في الوقت الحالي، ما عليك سوى حفظ جدول البحث هذا في ملف json ثم كتابته في حزمة Cloud Storage.

import json
with open("model_artifacts/preprocessor.json", "w") as f:
    json.dump(clarity_dict, f)

!gsutil cp model_artifacts/preprocessor.json {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

من المفترض أن يظهر دليل cpr-codelab المحلي الآن على النحو التالي:

+ cpr-codelab/
    + model_artifacts/
        + model.joblib
        + preprocessor.json
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

6- إنشاء حاوية عرض مخصّصة باستخدام خادم نماذج معالجة الطلبات

بعد تدريب النموذج وحفظ العنصر المخصّص للمعالجة المُسبَقة، حان وقت إنشاء حاوية العرض المخصّصة. عادةً ما يتطلب إنشاء حاوية عرض كتابة رمز الخادم النموذجي. ومع ذلك، باستخدام إجراءات التوقّعات المخصّصة، تنشئ ميزة "توقّعات Vertex AI" خادمًا للنموذج وتُنشئ لك صورة حاوية مخصّصة.

تحتوي حاوية عرض مخصّصة على القطع الثلاث التالية من الرمز:

  1. خادم النماذج (سيتم إنشاؤه تلقائيًا بواسطة حزمة SDK وسيتم تخزينه في scr_dir/)
    • خادم HTTP الذي يستضيف النموذج
    • المسؤول عن إعداد المسارات/المنافذ/غير ذلك
  2. معالج الطلبات
    • مسؤول عن جوانب خادم الويب المتعلقة بالتعامل مع الطلب، مثل إلغاء تسلسل نص الطلب، وتسلسل الرد، وضبط عناوين الاستجابة، وما إلى ذلك
    • في هذا المثال، ستستخدم معالِج الطلبات التلقائي google.cloud.aiplatform.prediction.handler.PredictionHandler المقدَّم في حزمة تطوير البرامج (SDK).
  3. المتنبّؤ
    • مسؤول عن منطق تعلُّم الآلة لمعالجة طلب التوقّعات.

يمكن تخصيص كل مكوّن من هذه المكوّنات وفقًا لمتطلبات حالة الاستخدام. في هذا المثال، ستنفّذ العنصر المقدِّر فقط.

يكون العنصر المقدِّر مسؤولاً عن منطق تعلُّم الآلة لمعالجة طلب التوقّع، مثل المعالجة المُسبَقة المخصّصة والمعالجة اللاحقة. لكتابة منطق توقّعات مخصّص، عليك إنشاء فئة فرعية لواجهة أداة توقّعات Vertex AI.

يتضمّن هذا الإصدار من إجراءات التنبؤ المخصّصة أدوات توقّع XGBoost وSklearn القابلة لإعادة الاستخدام، ولكن إذا كنت بحاجة إلى استخدام إطار عمل مختلف، يمكنك إنشاء إطار عملك الخاص من خلال إنشاء فئة فرعية لأداة التوقّع الأساسية.

يمكنك الاطّلاع أدناه على مثال على أداة توقّع Sklearn. هذه هي كل الرموز التي ستحتاج إلى كتابتها لإنشاء خادم النموذج المخصّص هذا.

sklearn_predictor

في دفتر الملاحظات، ألصِق الرمز البرمجي التالي أدناه لإنشاء فئة فرعية من SklearnPredictor وكتابتها في ملف Python في src_dir/. يُرجى العلم أنّنا في هذا المثال نُخصّص فقط طُرق load وpreprocess وpostprocess، وليس طريقة predict.

%%writefile $USER_SRC_DIR/predictor.py

import joblib
import numpy as np
import json

from google.cloud import storage
from google.cloud.aiplatform.prediction.sklearn.predictor import SklearnPredictor


class CprPredictor(SklearnPredictor):

    def __init__(self):
        return

    def load(self, artifacts_uri: str) -> None:
        """Loads the sklearn pipeline and preprocessing artifact."""

        super().load(artifacts_uri)

        # open preprocessing artifact
        with open("preprocessor.json", "rb") as f:
            self._preprocessor = json.load(f)


    def preprocess(self, prediction_input: np.ndarray) -> np.ndarray:
        """Performs preprocessing by checking if clarity feature is in abbreviated form."""

        inputs = super().preprocess(prediction_input)

        for sample in inputs:
            if sample[3] not in self._preprocessor.values():
                sample[3] = self._preprocessor[sample[3]]
        return inputs

    def postprocess(self, prediction_results: np.ndarray) -> dict:
        """Performs postprocessing by rounding predictions and converting to str."""

        return {"predictions": [f"${value}" for value in np.round(prediction_results)]}

لنلقِ نظرة أكثر تفصيلاً على كلّ من هذه الطرق.

  • يتم تحميل طريقة load في عنصر المعالجة المسبقة، وهو في هذه الحالة قاموس يعيّن قيم وضوح الماسة إلى اختصاراتها.
  • تستخدِم طريقة preprocess هذا العنصر لضمان ظهور ميزة الوضوح بتنسيقها المختصر في وقت العرض. وإذا لم يكن الأمر كذلك، فإنه تحول السلسلة الكاملة إلى اختصارها.
  • تعرض الطريقة postprocess القيمة المتوقّعة كسلسلة مع علامة دولار أمريكي وتُقرب القيمة.

بعد ذلك، استخدِم حزمة تطوير البرامج (SDK) Vertex AI Python لإنشاء الصورة. باستخدام إجراءات التوقّعات المخصّصة، سيتم إنشاء ملف Dockerfile وإنشاء الصورة نيابةً عنك.

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

import os

from google.cloud.aiplatform.prediction import LocalModel

from src_dir.predictor import CprPredictor  # Should be path of variable $USER_SRC_DIR

local_model = LocalModel.build_cpr_model(
    USER_SRC_DIR,
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor=CprPredictor,
    requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)

اكتب ملف اختبار يتضمّن عيّنتين للتنبؤ. تحتوي إحدى النُسخ على اسم clarity المختصر، ولكن يجب تحويل النسخة الأخرى أولاً.

import json

sample = {"instances": [
  [0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
  [0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}

with open('instances.json', 'w') as fp:
    json.dump(sample, fp)

اختبِر الحاوية محليًا من خلال نشر نموذج محلي.

with local_model.deploy_to_local_endpoint(
    artifact_uri = 'model_artifacts/', # local path to artifacts
) as local_endpoint:
    predict_response = local_endpoint.predict(
        request_file='instances.json',
        headers={"Content-Type": "application/json"},
    )

    health_check_response = local_endpoint.run_health_check()

يمكنك الاطّلاع على نتائج التوقّع باستخدام:

predict_response.content

7- نشر النموذج على Vertex AI

بعد اختبار الحاوية محليًا، حان وقت دفع الصورة إلى Artifact Registry وتحميل النموذج إلى Vertex AI Model Registry.

أولاً، عليك ضبط Docker للوصول إلى Artifact Registry.

!gcloud artifacts repositories create {REPOSITORY} --repository-format=docker \
--location=us-central1 --description="Docker repository"


!gcloud auth configure-docker {REGION}-docker.pkg.dev --quiet

بعد ذلك، ادفع الصورة.

local_model.push_image()

ثم حمّل النموذج.

model = aiplatform.Model.upload(local_model = local_model,
                                display_name=MODEL_DISPLAY_NAME,
                                artifact_uri=f"{BUCKET_NAME}/{MODEL_ARTIFACT_DIR}",)

عند تحميل النموذج، من المفترض أن يظهر لك في وحدة التحكّم:

model_registry

بعد ذلك، عليك نشر النموذج حتى تتمكّن من استخدامه لإجراء توقّعات على الإنترنت. وتعمل سلاسل الإجراءات المخصّصة للتوقّعات مع التوقّعات المجمّعة أيضًا، فإذا كانت حالة الاستخدام لا تتطلّب توقّعات على الإنترنت، لن تحتاج إلى نشر النموذج.

endpoint = model.deploy(machine_type="n1-standard-2")

وأخيرًا، اختبر النموذج المنشور من خلال الحصول على تنبؤ.

endpoint.predict(instances=[[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43]])

🎉 تهانينا. 🎉

لقد تعلّمت كيفية استخدام Vertex AI لتنفيذ ما يلي:

  • كتابة منطق مخصّص للمعالجة المُسبَقة والمعالجة اللاحقة باستخدام إجراءات التنبؤ المخصّصة

لمزيد من المعلومات عن الأجزاء المختلفة من Vertex AI، اطّلِع على المستندات.

8. تنظيف

إذا أردت مواصلة استخدام دفتر البيانات الذي أنشأته في هذا الدرس العملي، ننصحك بإيقافه عندما لا يكون قيد الاستخدام. من واجهة مستخدم Workbench في Google Cloud Console، اختَر ورقة الملاحظات ثم انقر على إيقاف.

إذا كنت تريد حذف دفتر الملاحظات بالكامل، انقر على الزر حذف في أعلى يسار الصفحة.

Stop_nb

لحذف نقطة النهاية التي نشرتها، انتقِل إلى قسم "نقاط النهاية" في وحدة التحكّم، وانقر على نقطة النهاية التي أنشأتها، ثم اختَر إلغاء نشر النموذج من نقطة النهاية:

delete_endpoint

لحذف صورة الحاوية، انتقِل إلى Artifact Registry (مستودع العناصر)، واختَر المستودع الذي أنشأته، ثم انقر على حذف.

delete_image

لحذف "حزمة التخزين"، باستخدام قائمة التنقّل في Cloud Console، انتقِل إلى "مساحة التخزين" واختَر الحزمة وانقر على حذف:

حذف مساحة التخزين