Vertex AI: مدل‌ها را در همان VM برای پیش‌بینی‌ها میزبانی می‌کند

۱. مرور کلی

در این آزمایش، شما از ویژگی مدل میزبانی مشترک در Vertex AI برای میزبانی چندین مدل در یک ماشین مجازی برای پیش‌بینی‌های آنلاین استفاده خواهید کرد.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • ایجاد یک DeploymentResourcePool
  • استقرار مدل‌ها درون DeploymentResourcePool

هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۲ دلار است.

۲. مقدمه‌ای بر هوش مصنوعی ورتکس

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می‌کند. Vertex AI، محصولات یادگیری ماشین را در Google Cloud ادغام می‌کند تا یک تجربه توسعه یکپارچه را فراهم کند. پیش از این، مدل‌های آموزش‌دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. این محصول جدید، هر دو را در یک API واحد، به همراه سایر محصولات جدید، ترکیب می‌کند. همچنین می‌توانید پروژه‌های موجود را به Vertex AI منتقل کنید. در صورت داشتن هرگونه بازخورد، لطفاً به صفحه پشتیبانی مراجعه کنید.

هوش مصنوعی ورتکس شامل محصولات مختلفی برای پشتیبانی از گردش‌های کاری یادگیری ماشینی سرتاسری است. این آزمایشگاه بر روی محصولات برجسته زیر تمرکز خواهد کرد: پیش‌بینی‌ها و میز کار

بررسی اجمالی محصولات ورتکس

۳. مرور کلی موارد استفاده

هنگام استقرار مدل‌ها در سرویس پیش‌بینی هوش مصنوعی Vertex ، هر مدل به طور پیش‌فرض در ماشین مجازی مخصوص به خود مستقر می‌شود. برای مقرون به صرفه‌تر کردن میزبانی، می‌توانید چندین مدل را در یک ماشین مجازی میزبانی کنید که منجر به استفاده بهتر از حافظه و منابع محاسباتی می‌شود. تعداد مدل‌هایی که برای استقرار در یک ماشین مجازی انتخاب می‌کنید به اندازه مدل‌ها و الگوهای ترافیک بستگی دارد، اما این ویژگی به ویژه برای سناریوهایی مفید است که در آن‌ها مدل‌های مستقر زیادی با ترافیک پراکنده دارید.

پشتیبانی از مدل میزبانی مشترک، مفهوم Deployment Resource Pool را معرفی می‌کند که مدل‌ها را برای اشتراک‌گذاری منابع در یک ماشین مجازی، گروه‌بندی می‌کند. مدل‌ها می‌توانند در صورت اشتراک‌گذاری یک نقطه پایانی و همچنین در صورت استقرار در نقاط پایانی مختلف، یک ماشین مجازی را به اشتراک بگذارند. در حال حاضر، مدل‌های موجود در یک منبع منابع یکسان باید دارای تصویر کانتینر یکسانی از جمله نسخه چارچوب کانتینرهای از پیش ساخته شده Vertex Prediction باشند. علاوه بر این، فقط کانتینرهای از پیش ساخته شده Vertex Prediction با چارچوب مدل Tensorflow در این نسخه پشتیبانی می‌شوند، سایر چارچوب‌های مدل و کانتینرهای سفارشی هنوز پشتیبانی نمی‌شوند.

استخر استقرار

۴. محیط خود را آماده کنید

برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل‌های اینجا را دنبال کنید.

مرحله ۱: فعال کردن رابط برنامه‌نویسی کاربردی موتور محاسبات

به Compute Engine بروید و اگر از قبل فعال نیست، آن را فعال کنید .

مرحله 2: فعال کردن API هوش مصنوعی Vertex

به بخش Vertex AI در کنسول ابری خود بروید و روی Enable Vertex AI API کلیک کنید.

داشبورد هوش مصنوعی ورتکس

مرحله 3: یک نمونه Vertex AI Workbench ایجاد کنید

از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

منوی هوش مصنوعی ورتکس

اگر API نوت‌بوک‌ها فعال نیست، آن را فعال کنید.

نوت‌بوک_آپی

پس از فعال کردن، روی «دفترچه‌های مدیریت‌شده» کلیک کنید:

رابط کاربری نوت‌بوک‌ها

سپس دفترچه یادداشت جدید را انتخاب کنید.

نوت بوک_جدید

برای نوت‌بوک خود یک نام انتخاب کنید و در قسمت Permission، گزینه Service account را انتخاب کنید.

ایجاد_نوت_بوک

تنظیمات پیشرفته را انتخاب کنید.

در قسمت امنیت، اگر از قبل فعال نشده است، گزینه «فعال کردن ترمینال» را انتخاب کنید.

enable_terminal

می‌توانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.

سپس، روی ایجاد (Create) کلیک کنید. آماده‌سازی نمونه (instance) چند دقیقه طول خواهد کشید.

پس از ایجاد نمونه، گزینه‌ی «باز کردن JUPYTERLAB» را انتخاب کنید.

open_jupyterlab

۵. مدل قطار

قبل از اینکه بتوانیم ویژگی میزبانی مشترک را امتحان کنیم، ابتدا باید یک مدل را آموزش دهیم و مصنوعات مدل ذخیره شده را در یک مخزن ذخیره‌سازی ابری ذخیره کنیم. ما از اجراکننده نوت‌بوک Workbench برای راه‌اندازی کار آموزشی استفاده خواهیم کرد.

مرحله ۱: ایجاد یک فضای ذخیره‌سازی ابری

اگر در پروژه خود یک باکت (bact) دارید که می‌خواهید از آن استفاده کنید، می‌توانید از این مرحله صرف نظر کنید. در غیر این صورت، از طریق لانچر، یک ترمینال جدید باز کنید.

ترمینال لانچر

از ترمینال، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین می‌کنید:

PROJECT_ID='your-cloud-project'

در مرحله بعد، دستور زیر را اجرا کنید تا یک سطل جدید در پروژه شما ایجاد شود.

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

مرحله 2: اجرای نوت بوک را شروع کنید

از لانچر نمونه Workbench خود، یک نوت‌بوک TensorFlow 2 جدید باز کنید.

لانچر_tf2

کد زیر یک طبقه‌بندی‌کننده‌ی احساسات دودویی (مثبت یا منفی) را روی مجموعه داده‌های نقد فیلم‌های 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_nb

سپس اجرای خود را به شرح زیر پیکربندی کنید و روی SUBMIT کلیک کنید

پیکربندی_اجرایی

از تب Executions در کنسول، می‌توانید وضعیت کار آموزشی خود را پیگیری کنید.

وضعیت_اجرا

۶. استقرار مدل

مرحله ۱: آپلود مدل

پس از اتمام اجرا، برای آپلود مدل به دفترچه یادداشت Workbench برگردید. یک دفترچه یادداشت TensorFlow جدید ایجاد کنید.

tf_nb

ابتدا، 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')

در رجیستری مدل هوش مصنوعی ورتکس، اکنون باید هر دو مدل را مشاهده کنید. وضعیت استقرار خالی است زیرا ما هنوز مدل‌ها را مستقر نکرده‌ایم.

مدل_رجیستری

مرحله ۲: ایجاد یک نقطه پایانی

یک نقطه پایانی ایجاد کنید. توجه داشته باشید که این با استقرار یک مدل در یک نقطه پایانی متفاوت است.

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}

مرحله ۴: مدل‌ها را در نقطه پایانی مستقر کنید

اکنون که مخزن منابع ایجاد شده است، می‌توانیم مدل‌ها را درون مخزن منابع مستقر کنیم.

ابتدا، 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_1_endpoint

در مرحله بعد، می‌توانیم 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}'

باز هم، در این مثال، دو مدل در یک نقطه پایانی یکسان مستقر شده‌اند، اما می‌توانید مدل‌هایی را که در نقاط پایانی مختلف مستقر شده‌اند، به صورت مشترک در یک منبع منابع یکسان میزبانی کنید. در این صورت، لازم نیست نگران تقسیم ترافیک باشید.

پس از استقرار مدل دوم، هر دوی آنها را در کنسول مشاهده خواهید کرد.

مدل‌های مستقر

مرحله ۵: دریافت پیش‌بینی‌ها

مرحله آخر، آزمایش نقطه پایانی و دریافت پیش‌بینی‌ها است.

ابتدا جمله آزمایشی خود را تعریف کنید.

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، مستندات آن را بررسی کنید.

۷. پاکسازی

اگر قصد استفاده از مدل‌ها را ندارید، بهتر است آن‌ها را از نقطه پایانی حذف کنید. همچنین می‌توانید نقطه پایانی را به طور کامل حذف کنید. در صورت نیاز، همیشه می‌توانید یک مدل را در یک نقطه پایانی دوباره مستقر کنید.

undeploy_model

نوت‌بوک‌های مدیریت‌شده توسط Workbench پس از ۱۸۰ دقیقه بیکاری به‌طور خودکار از کار می‌افتند، بنابراین نیازی نیست نگران خاموش کردن نمونه باشید. اگر می‌خواهید نمونه را به‌صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می‌خواهید نوت‌بوک را به‌طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

مثال را متوقف کنید

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:

حذف فضای ذخیره‌سازی