1. بررسی اجمالی
در این آزمایشگاه، از ویژگی مدل میزبانی مشترک در Vertex AI برای میزبانی چندین مدل در یک ماشین مجازی برای پیشبینیهای آنلاین استفاده خواهید کرد.
چیزی که یاد می گیرید
شما یاد خواهید گرفت که چگونه:
- یک
DeploymentResourcePool
ایجاد کنید - استقرار مدل ها در یک
DeploymentResourcePool
کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 2 دلار است.
2. مقدمه ای بر Vertex AI
این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدلهای آموزش دیده با AutoML و مدلهای سفارشی از طریق سرویسهای جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید. اگر بازخوردی دارید، لطفاً صفحه پشتیبانی را ببینید.
Vertex AI شامل بسیاری از محصولات مختلف برای پشتیبانی از گردش کار ML سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: پیش بینی ها و میز کار
3. از نمای کلی مورد استفاده کنید
هنگام استقرار مدلها در سرویس پیشبینی هوش مصنوعی Vertex ، هر مدل به طور پیشفرض در VM خود مستقر میشود. برای مقرونبهصرفهتر کردن هاستینگ، میتوانید چندین مدل را روی یک ماشین مجازی میزبانی کنید و در نتیجه از حافظه و منابع محاسباتی بهتر استفاده کنید. تعداد مدلهایی که برای استقرار در یک ماشین مجازی انتخاب میکنید به اندازه مدل و الگوهای ترافیک بستگی دارد، اما این ویژگی بهویژه برای سناریوهایی که در آن مدلهای مستقر زیادی با ترافیک کم دارید مفید است.
پشتیبانی از مدل میزبانی مشترک مفهوم Deployment Resource Pool را معرفی میکند که مدلها را برای به اشتراک گذاشتن منابع در یک VM گرد هم میآورد. مدلها اگر نقطه پایانی مشترک داشته باشند و همچنین اگر در نقاط پایانی مختلف مستقر شوند، میتوانند یک VM را به اشتراک بگذارند. در حال حاضر، مدلهای موجود در یک منبع منبع باید دارای تصویر محفظه یکسانی از جمله نسخه چارچوب کانتینرهای از پیش ساخته شده Vertex Prediction باشند. علاوه بر این، فقط کانتینرهای از پیش ساخته شده Vertex Prediction با چارچوب مدل Tensorflow در این نسخه پشتیبانی میشوند، سایر چارچوبهای مدل و کانتینرهای سفارشی هنوز پشتیبانی نمیشوند.
4. محیط خود را تنظیم کنید
برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.
مرحله ۱: Compute Engine API را فعال کنید
به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید.
مرحله ۲: Vertex AI API را فعال کنید
به بخش Vertex AI در Cloud Console خود بروید و روی Enable Vertex AI API کلیک کنید.
مرحله 3: یک نمونه Vertex AI Workbench ایجاد کنید
از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:
اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.
پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:
سپس NEW NOTEBOOK را انتخاب کنید.
نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید
تنظیمات پیشرفته را انتخاب کنید.
اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.
شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.
بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.
پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.
5. مدل قطار
قبل از اینکه بتوانیم ویژگی میزبانی مشترک را امتحان کنیم، ابتدا باید یک مدل را آموزش دهیم و مصنوعات مدل ذخیره شده را در یک سطل Cloud Storage ذخیره کنیم. ما از اجراکننده دفترچه یادداشت Workbench برای راه اندازی کار آموزشی استفاده می کنیم.
مرحله 1: یک سطل ذخیره سازی ابری ایجاد کنید
اگر یک سطل موجود در پروژه خود دارید که می خواهید از آن استفاده کنید، می توانید از این مرحله صرف نظر کنید. در غیر این صورت، از راهانداز یک جلسه ترمینال جدید باز کنید.
از ترمینال، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید، و مطمئن شوید که your-cloud-project
با ID پروژه خود جایگزین کنید:
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 Model Registry آپلود می کنیم به آنها نیاز خواهیم داشت.
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)
سپس دکمه Execute را انتخاب کنید.
سپس اجرای خود را به صورت زیر پیکربندی کنید و روی SUBMIT کلیک کنید
از تب Executions در کنسول، می توانید وضعیت کار آموزشی خود را پیگیری کنید.
6. استقرار مدل
مرحله 1: آپلود مدل
پس از اتمام اجرا، برای آپلود مدل به دفترچه یادداشت Workbench برگردید. یک نوت بوک جدید TensorFlow ایجاد کنید.
ابتدا Vertex AI Python SDK را وارد کنید
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
را به روز کنیم تا ترافیک بین دو مدل تقسیم شود. اگر بخواهیم model_2
در یک نقطه پایانی دیگر در یک منبع منبع یکسان استقرار دهیم، مجبور نیستیم trafficSplit
به روز کنیم.
برای بهروزرسانی تقسیم ترافیک، باید شناسه 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.']
سپس، پیش بینی را در نقطه پایانی فراخوانی کنید که پیش بینی یکی از مدل های مستقر شده را به نقطه پایانی برمی گرداند.
endpoint.predict(instances=x_test)
🎉 تبریک می گویم! 🎉
شما یاد گرفته اید که چگونه از Vertex AI برای موارد زیر استفاده کنید:
- برای پیشبینیهای آنلاین، مدلها را در همان VM میزبانی کنید
برای کسب اطلاعات بیشتر در مورد بخش های مختلف Vertex، مستندات را بررسی کنید.
7. پاکسازی
اگر قصد استفاده از آنها را ندارید، میخواهید مدلها را از نقطه پایانی خارج کنید. همچنین می توانید نقطه پایانی را به طور کامل حذف کنید. در صورت نیاز، همیشه می توانید یک مدل را به نقطه پایانی بازگردانید.
زمان نوتبوکهای مدیریتشده Workbench بهطور خودکار پس از ۱۸۰ دقیقه بیکاری تمام میشود، بنابراین نیازی نیست نگران خاموش کردن نمونه باشید. اگر می خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می خواهید نوت بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.
برای حذف Storage Bucket، با استفاده از منوی Navigation در Cloud Console خود، به Storage بروید، سطل خود را انتخاب کنید و روی Delete کلیک کنید: