1. 總覽
在這個研究室中,您將使用 Vertex AI 的共同託管模型功能,在同一 VM 上託管多個模型來進行線上預測。
課程內容
您將學習下列內容:
- 建立
DeploymentResourcePool
- 在
DeploymentResourcePool
中部署模型
在 Google Cloud 中執行這個研究室的總費用約為 $2 美元。
2. Vertex AI 簡介
這個研究室使用 Google Cloud 最新的 AI 產品服務。Vertex AI 將 Google Cloud 中的機器學習產品整合到流暢的開發體驗中。先前使用 AutoML 訓練的模型和自訂模型,都能透過不同的服務存取。這項新產品會與其他新產品一起合併為一個 API。您也可以將現有專案遷移至 Vertex AI。如有任何意見,請參閱支援頁面。
Vertex AI 提供許多不同的產品,可支援端對端機器學習工作流程。本研究室將著重介紹下列產品:Predictions 和 Workbench
3. 用途總覽
將模型部署至 Vertex AI 預測服務時,每個模型預設會部署至自己的 VM。您可以將多個模型託管於同一個 VM 上,藉此提高託管效率,以提升記憶體和運算資源的使用率。您選擇部署至相同 VM 的模型數量取決於模型大小和流量模式,但如果多個部署的模型含有稀疏流量,這項功能就特別實用。
共同託管模型支援「部署資源集區」的概念;這個概念可將模型分組,以便在 VM 內共用資源。如果模型會共用一個端點,以及部署至不同端點,模型可以共用 VM。目前,相同資源集區中的模型必須具有相同的容器映像檔 (包括 Vertex 預先建構容器的架構版本)。此外,這個版本僅支援採用 Tensorflow 模型架構的 Vertex 預先建構容器,尚未支援其他模型架構和自訂容器。
4. 設定環境
您需要已啟用計費功能的 Google Cloud Platform 專案,才能執行這個程式碼研究室。如要建立專案,請按照這裡的操作說明進行。
步驟 1:啟用 Compute Engine API
前往「Compute Engine」,並選取「啟用」 (如果尚未啟用)。
步驟 2:啟用 Vertex AI API
前往 Cloud 控制台的 Vertex AI 專區,然後按一下「啟用 Vertex AI API」。
步驟 3:建立 Vertex AI Workbench 執行個體
在 Cloud 控制台的 Vertex AI 專區中,按一下 Workbench:
啟用 Notebooks API (如果尚未啟用)。
啟用後,按一下「代管的筆記本」:
然後選取「新增筆記本」。
為筆記本命名,然後在「權限」下方選取「服務帳戶」。
選取「進階設定」。
選取「安全性」下方的「啟用終端機」(如果尚未啟用)。
其他進階設定皆可保持原樣。
接著點選「建立」。執行個體的佈建作業會在幾分鐘內完成。
執行個體建立完成後,請選取「開啟 JUPYTERLAB」。
5. 訓練模型
在試用共同託管功能之前,我們必須先訓練模型,並將儲存的模型構件儲存至 Cloud Storage 值區。我們會使用 Workbench 筆記本執行程式來啟動訓練工作。
步驟 1:建立 Cloud Storage 值區
如果專案已有要使用的值區,您可以略過這個步驟。否則,啟動器會開啟新的終端機工作階段。
在終端機中執行下列指令,定義專案的環境變數。請務必將 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」按鈕。
然後依下列方式設定執行作業,然後按一下「提交」
在控制台的「執行作業」分頁中,您可以追蹤訓練工作的狀態。
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 Model Registry 中應該會顯示這兩種模型。我們尚未部署模型,因此部署作業狀態為空白。
步驟 2:建立端點
建立端點。請注意,這與將模型部署至端點不同。
endpoint = aiplatform.Endpoint.create('cohost-endpoint')
端點建立完成後,會顯示在控制台中。
步驟 3:建立 DeploymentResourcePool
您可以使用下列指令建立 DeploymentResourcePool。請務必將 {YOUR_PROJECT}
換成您的專案 ID。
# 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
分別替換為相應的 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
的 ID。執行 model_2.name
就能再次取得這個 ID
MODEL_2_ID="{MODEL_2_ID}"
然後部署 model_2
。由於您已將 model_1
部署至端點,因此我們必須更新 trafficSplit
,讓流量拆分至兩個模型。如果選擇將 model_2
部署至同一資源集區中的不同端點,我們不必更新 trafficSplit
。
如要更新流量分配,您必須為 model_1
定義 DeployedModel ID。請注意,這組 ID 與模型 ID 不同。
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.']
接著,在端點上呼叫 Prediction,這會從已部署至端點的模型傳回預測結果。
endpoint.predict(instances=x_test)
🎉 恭喜!🎉
您已瞭解如何使用 Vertex AI 執行下列作業:
- 在同一 VM 上共同託管模型以進行線上預測
如要進一步瞭解 Vertex 的其他部分,請參閱說明文件。
7. 清除
如果您不打算使用模型,建議您從端點取消部署模型。您可以完全刪除端點。如有需要,您隨時可以將模型重新部署至端點。
Workbench 代管的筆記本會在 180 分鐘閒置後自動逾時,因此您不必擔心執行個體會關閉。如要手動關閉執行個體,請前往控制台的「Vertex AI Workbench」專區,然後按一下「Stop」按鈕。如想完全刪除筆記本,請按一下「刪除」按鈕。
如要刪除 Storage 值區,請使用 Cloud 控制台中的導覽選單前往「Storage」(儲存空間)、選取值區,然後點選「Delete」(刪除):