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

3- نظرة عامة على حالة الاستخدام
عند تفعيل النماذج في خدمة التوقّع في Vertex AI، يتم تلقائيًا تفعيل كل نموذج في جهاز افتراضي خاص به. لجعل الاستضافة أكثر فعالية من حيث التكلفة، يمكنك استضافة نماذج متعددة على الجهاز الافتراضي نفسه، ما يؤدي إلى استخدام أفضل للذاكرة وموارد الحوسبة. يعتمد عدد النماذج التي تختار تفعيلها على الجهاز الافتراضي (VM) نفسه على أحجام النماذج وأنماط الزيارات، ولكن هذه الميزة مفيدة بشكل خاص في السيناريوهات التي تتضمّن العديد من النماذج المفعّلة التي تتلقّى زيارات متفرقة.
تتيح ميزة "الاستضافة المشتركة" استخدام "مجموعة موارد النشر" التي تجمع النماذج معًا لمشاركة الموارد داخل جهاز افتراضي. يمكن للنماذج مشاركة آلة افتراضية إذا كانت تشارك نقطة نهاية، وكذلك إذا تم نشرها في نقاط نهاية مختلفة. في الوقت الحالي، يجب أن تحتوي النماذج في مجموعة الموارد نفسها على صورة الحاوية نفسها، بما في ذلك إصدار إطار عمل الحاويات المُنشأة مسبقًا في Vertex Prediction. بالإضافة إلى ذلك، لا تتوفّر في هذا الإصدار سوى حاويات Vertex Prediction المُنشأة مسبقًا التي تتضمّن إطار عمل نموذج Tensorflow، ولا تتوفّر أُطر عمل النماذج والحاويات المخصّصة الأخرى بعد.

4. إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

الخطوة 3: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:

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

بعد التفعيل، انقر على دفاتر الملاحظات المُدارة:

بعد ذلك، انقر على دفتر ملاحظات جديد.

أدخِل اسمًا لدفتر الملاحظات، وضِمن الإذن، اختَر حساب الخدمة.

انقر على الإعدادات المتقدّمة.
ضمن الأمان، اختَر "تفعيل الجهاز" إذا لم يكن مفعّلاً.

يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء. سيستغرق توفير الجهاز الافتراضي بضع دقائق.
بعد إنشاء المثيل، انقر على OPEN JUPYTERLAB.

5- نموذج التدريب
قبل أن نتمكّن من تجربة ميزة الاستضافة المشتركة، علينا أولاً تدريب نموذج وتخزين عناصر النموذج المحفوظة في حزمة Cloud Storage. سنستخدم منفّذ دفتر ملاحظات Workbench لتشغيل مهمة التدريب.
الخطوة 1: إنشاء حزمة في Cloud Storage
إذا كان لديك حزمة حالية في مشروعك تريد استخدامها، يمكنك تخطّي هذه الخطوة. بخلاف ذلك، افتح جلسة وحدة طرفية جديدة من مشغّل التطبيقات.

من نافذة الأوامر، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
بعد ذلك، شغِّل الأمر التالي لإنشاء حزمة جديدة في مشروعك.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
الخطوة 2: تشغيل تنفيذ دفتر الملاحظات
من مشغّل مثيل Workbench، افتح دفتر ملاحظات TensorFlow 2 جديدًا.

يدرّب الرمز البرمجي أدناه مصنّفًا ثنائيًا للانطباعات (إيجابية أو سلبية) على مجموعة بيانات مراجعات الأفلام في IMDB. ألصِق الرمز في دفتر ملاحظاتك.
تأكَّد من استبدال {YOUR_BUCKET} بالحزمة التي أنشأتها في الخطوة السابقة (أو حزمة أخرى في مشروعك). هذا هو المكان الذي سنخزّن فيه عناصر النموذج المحفوظة، والتي سنحتاج إليها لاحقًا عند تحميل النموذج إلى سجلّ نماذج Vertex AI.
import numpy as np
import tensorflow_datasets as tfds
import tensorflow as tf
# REPLACE WITH YOUR BUCKET!
OUTPUT_PATH='gs://{YOUR_BUCKET}/model_output'
BUFFER_SIZE = 10000
BATCH_SIZE = 64
VOCAB_SIZE = 1000
# Load data
dataset, info = tfds.load('imdb_reviews', with_info=True,
as_supervised=True)
train_dataset, test_dataset = dataset['train'], dataset['test']
train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
test_dataset = test_dataset.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)
# Create text encoder
encoder = tf.keras.layers.TextVectorization(
max_tokens=VOCAB_SIZE)
encoder.adapt(train_dataset.map(lambda text, label: text))
# Create model
model = tf.keras.Sequential([
encoder,
tf.keras.layers.Embedding(
input_dim=len(encoder.get_vocabulary()),
output_dim=64,
# Use masking to handle the variable sequence lengths
mask_zero=True),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1)
])
# Compile model
model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
optimizer=tf.keras.optimizers.Adam(1e-4),
metrics=['accuracy'])
# Fit model
history = model.fit(train_dataset, epochs=10,
validation_data=test_dataset,
validation_steps=30)
# Save model
model.save(OUTPUT_PATH)
بعد ذلك، انقر على الزر تنفيذ.

بعد ذلك، اضبط عملية التنفيذ على النحو التالي وانقر على إرسال.

من علامة التبويب "عمليات التنفيذ" في وحدة التحكّم، يمكنك تتبُّع حالة مهمة التدريب.

6. نشر النموذج
الخطوة 1: تحميل النموذج
عند اكتمال التنفيذ، ارجع إلى دفتر ملاحظات Workbench لتحميل النموذج. أنشئ دفتر ملاحظات جديدًا في TensorFlow.

أولاً، استورِد حزمة تطوير البرامج (SDK) الخاصة بلغة Python في Vertex AI.
from google.cloud import aiplatform
بعد ذلك، حمِّل النموذج، واستبدِل {YOUR_BUCKET} بالحزمة التي حدّدتها في رمز التدريب.
# replace {YOUR_BUCKET}
model_1 = aiplatform.Model.upload(display_name='text-model-1',
artifact_uri='gs://{YOUR_BUCKET}/model_output',
serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')
لأغراض توضيحية، سنحمّل هذا النموذج مرّتين، ما يؤدي إلى إنشاء موردَين مختلفَين للنموذج في Vertex AI. يتم ذلك لنتمكّن من اختبار نشر نماذج متعددة إلى نقطة نهاية واحدة ضمن مجموعة موارد النشر. في سيناريو حقيقي، سيكون لديك نموذجان مختلفان بدلاً من إنشاء نماذج من الأدوات المحفوظة نفسها، ولكن هذا اختصار حتى لا نضطر إلى بدء عملية تدريب أخرى. بالإضافة إلى ذلك، يمكنك أيضًا اختيار نشر النموذجين في نقاط نهاية مختلفة ضمن مجموعة موارد النشر نفسها.
# replace {YOUR_BUCKET}
model_2 = aiplatform.Model.upload(display_name='text-model-2',
artifact_uri='gs://{YOUR_BUCKET}/model_output',
serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')
من المفترض أن يظهر لك الآن كلا النموذجين في "سجلّ نماذج Vertex AI". حالة النشر فارغة لأنّنا لم ننشر النماذج بعد.

الخطوة 2: إنشاء نقطة نهاية
أنشئ نقطة نهاية. يُرجى العِلم أنّ هذا الإجراء يختلف عن نشر نموذج في نقطة نهاية.
endpoint = aiplatform.Endpoint.create('cohost-endpoint')
عند إنشاء نقطة النهاية، ستظهر لك في وحدة التحكّم.

الخطوة 3: إنشاء DeploymentResourcePool
يمكنك إنشاء DeploymentResourcePool باستخدام الأمر التالي. احرص على استبدال {YOUR_PROJECT} برقم تعريف مشروعك.
# replace {YOUR_PROJECT}
PROJECT_ID={YOUR_PROJECT}
REGION="us-central1"
VERTEX_API_URL=REGION + "-aiplatform.googleapis.com"
VERTEX_PREDICTION_API_URL=REGION + "-prediction-aiplatform.googleapis.com"
MULTI_MODEL_API_VERSION="v1beta1"
# Give the pool a name
DEPLOYMENT_RESOURCE_POOL_ID="my-resource-pool"
import json
import pprint
pp = pprint.PrettyPrinter(indent=4)
CREATE_RP_PAYLOAD = {
"deployment_resource_pool":{
"dedicated_resources":{
"machine_spec":{
"machine_type":"n1-standard-4"
},
"min_replica_count":1,
"max_replica_count":2
}
},
"deployment_resource_pool_id":DEPLOYMENT_RESOURCE_POOL_ID
}
CREATE_RP_REQUEST=json.dumps(CREATE_RP_PAYLOAD)
pp.pprint("CREATE_RP_REQUEST: " + CREATE_RP_REQUEST)
!curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/deploymentResourcePools \
-d '{CREATE_RP_REQUEST}'
يمكنك رؤية حوض السباحة من خلال تشغيل
!curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/deploymentResourcePools/{DEPLOYMENT_RESOURCE_POOL_ID}
الخطوة 4: نشر النماذج في نقطة النهاية
بعد إنشاء مجموعة الموارد، يمكننا نشر النماذج ضمن مجموعة الموارد.
أولاً، سننفّذ model_1. تأكَّد من استبدال MODEL_1_ID وENDPOINT_ID بمعرّفَي الحساب والموقع على التوالي.
MODEL_1_ID="{MODEL_1_ID}"
ENDPOINT_ID="{ENDPOINT_ID}"
سينشر الأمر التالي model_1 إلى نقطة النهاية ضمن مجموعة الموارد.
MODEL_NAME = "projects/{project_id}/locations/{region}/models/{model_id}".format(project_id=PROJECT_ID, region=REGION, model_id=MODEL_1_ID)
SHARED_RESOURCE = "projects/{project_id}/locations/{region}/deploymentResourcePools/{deployment_resource_pool_id}".format(project_id=PROJECT_ID, region=REGION, deployment_resource_pool_id=DEPLOYMENT_RESOURCE_POOL_ID)
DEPLOY_MODEL_PAYLOAD = {
"deployedModel": {
"model": MODEL_NAME,
"shared_resources": SHARED_RESOURCE
},
"trafficSplit": {
"0": 100
}
}
DEPLOY_MODEL_REQUEST=json.dumps(DEPLOY_MODEL_PAYLOAD)
pp.pprint("DEPLOY_MODEL_REQUEST: " + DEPLOY_MODEL_REQUEST)
!curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/endpoints/{ENDPOINT_ID}:deployModel \
-d '{DEPLOY_MODEL_REQUEST}'
سيستغرق هذا الإجراء بضع دقائق، ولكن عند اكتماله، سيظهر النموذج الذي تم نشره في نقطة النهاية في وحدة التحكّم.

بعد ذلك، يمكننا تفعيل model_2 ضمن مجموعة النشر نفسها. سننفّذها في نقطة النهاية نفسها التي تمّ تنفيذ model_1 فيها. ومع ذلك، يمكنك أيضًا اختيار نشرmodel_2 إلى نقطة نهاية مختلفة ضمن مجموعة الموارد نفسها.
عدِّل MODEL_ID باستخدام رقم تعريف model_2. يمكنك الحصول على هذا المعرّف من خلال تنفيذ model_2.name
MODEL_2_ID="{MODEL_2_ID}"
بعد ذلك، يمكنك نشر model_2. بما أنّنا سبق أن نشرنا model_1 في نقطة النهاية، علينا تعديل trafficSplit لتقسيم عدد الزيارات بين النموذجين. لن نضطر إلى تعديل trafficSplit إذا اخترنا نشر model_2 إلى نقطة نهاية مختلفة ضمن مجموعة الموارد نفسها.
لتعديل تقسيم عدد الزيارات، عليك تحديد معرّف DeployedModel الخاص بـ model_1. يُرجى العِلم أنّ هذا يختلف عن رقم تعريف النموذج.
DEPLOYED_MODEL_1_ID = {DEPLOYED_MODEL_1_ID}
بعد ذلك، شغِّل ما يلي لنشر النموذج الثاني.
MODEL_NAME = "projects/{project_id}/locations/{region}/models/{model_id}".format(project_id=PROJECT_ID, region=REGION, model_id=MODEL_2_ID)
SHARED_RESOURCE = "projects/{project_id}/locations/{region}/deploymentResourcePools/{deployment_resource_pool_id}".format(project_id=PROJECT_ID, region=REGION, deployment_resource_pool_id=DEPLOYMENT_RESOURCE_POOL_ID)
#`trafficSplit` is a map from a DeployedModel's ID to the percentage of this Endpoint's traffic that should be forwarded to that DeployedModel.
# The traffic percentage values for an endpoint must add up to 100.
# The key for the model being deployed is "0".
DEPLOY_MODEL_PAYLOAD = {
"deployedModel": {
"model": MODEL_NAME,
"shared_resources": SHARED_RESOURCE
},
"trafficSplit": {
"0": 50,
DEPLOYED_MODEL_1_ID: 50
}
}
DEPLOY_MODEL_REQUEST=json.dumps(DEPLOY_MODEL_PAYLOAD)
pp.pprint("DEPLOY_MODEL_REQUEST: " + DEPLOY_MODEL_REQUEST)
!curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://{VERTEX_API_URL}/{MULTI_MODEL_API_VERSION}/projects/{PROJECT_ID}/locations/{REGION}/endpoints/{ENDPOINT_ID}:deployModel \
-d '{DEPLOY_MODEL_REQUEST}'
مرة أخرى، في هذا المثال، تم نشر النموذجين في نقطة النهاية نفسها، ولكن يمكنك أيضًا استضافة نماذج مشتركة في مجموعة الموارد نفسها التي يتم نشرها في نقاط نهاية مختلفة. في هذه الحالة، لن يكون عليك القلق بشأن تقسيم الزيارات.
بعد نشر النموذج الثاني، سيظهر كلا النموذجين في وحدة التحكّم.

الخطوة 5: الحصول على توقّعات
الخطوة الأخيرة هي اختبار نقطة النهاية والحصول على نتائج التوقّعات.
أولاً، حدِّد جملة الاختبار.
x_test=['The movie was cool. The animation and the graphics were out of this world. I would recommend this movie.']
بعد ذلك، استدعِ الدالة predict في نقطة النهاية التي ستعرض نتيجة توقّع من أحد النماذج التي تم نشرها في نقطة النهاية.
endpoint.predict(instances=x_test)
🎉 تهانينا! 🎉
تعرّفت على كيفية استخدام Vertex AI من أجل:
- استضافة نماذج مشتركة على الجهاز الافتراضي نفسه لإجراء توقّعات على الإنترنت
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.
7. تنظيف
عليك إلغاء نشر النماذج من نقطة النهاية إذا كنت لا تخطّط لاستخدامها. يمكنك أيضًا حذف نقطة النهاية بالكامل. يمكنك دائمًا إعادة نشر نموذج في نقطة نهاية إذا احتجت إلى ذلك.

يتم تلقائيًا إيقاف دفاتر ملاحظات Workbench المُدارة بعد 180 دقيقة من عدم النشاط، لذا لا داعي للقلق بشأن إيقاف الجهاز الظاهري. إذا أردت إيقاف الجهاز الافتراضي يدويًا، انقر على الزر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف".

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