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

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 سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: پیش بینی ها و میز کار

نمای کلی محصول Vertex

3. از نمای کلی مورد استفاده کنید

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

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

deployment_pool

4. محیط خود را تنظیم کنید

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

مرحله 1: Compute Engine API را فعال کنید

به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید.

مرحله ۲: Vertex AI API را فعال کنید

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

داشبورد Vertex AI

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

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

منوی Vertex AI

اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.

Notebook_api

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

Notebooks_UI

سپس NEW NOTEBOOK را انتخاب کنید.

نوت بوک

نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید

create_notebook

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

اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.

enable_terminal

شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.

بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.

پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.

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 باز کنید.

launcher_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 را انتخاب کنید.

execute_nb

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

execution_config

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

execution_status

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

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

پس از اتمام اجرا، برای آپلود مدل به دفترچه یادداشت 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')

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

مدل_رجیستری

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

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

endpoint = aiplatform.Endpoint.create('cohost-endpoint')

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

console_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_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}'

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

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

deployed_models

مرحله 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. پاکسازی

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

undeploy_model

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

توقف نمونه

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

ذخیره سازی را حذف کنید