استخدام 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 العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي العملي على التوقّعات ومساحة العمل.

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

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

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

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

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

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

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

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

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

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

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

الخطوة 1: تفعيل Compute Engine API

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

الخطوة 2: تفعيل Artifact Registry API

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

الخطوة 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

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

PROJECT_ID='your-cloud-project'

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

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

يُرجى العِلم أنّه عليك إعادة تشغيل النواة بعد اكتمال عملية التثبيت باستخدام 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. إنشاء حاوية عرض مخصّصة باستخدام خادم نموذج CPR

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

يحتوي حاوية العرض المخصّصة على أجزاء الرموز الثلاثة التالية:

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

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

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

يتضمّن هذا الإصدار من إجراءات التوقّع المخصّصة أدوات توقّع قابلة لإعادة الاستخدام من 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) الخاصة بلغة Python في Vertex AI لإنشاء الصورة. باستخدام إجراءات التوقّع المخصّصة، سيتم إنشاء 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"),
)

أنشئ ملف اختبار يتضمّن عينتَين للتنبؤ. يحتوي أحد المثالين على اسم الوضوح المختصر، ولكن يجب تحويل المثال الآخر أولاً.

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".

أولاً، اضبط إعدادات 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

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

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