1. Tổng quan
Trong bài tập thực hành này, bạn sẽ sử dụng tính năng mô hình đồng lưu trữ trong Vertex AI để lưu trữ nhiều mô hình trên cùng một máy ảo cho các dự đoán trực tuyến.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu cách:
- Tạo một
DeploymentResourcePool - Triển khai các mô hình trong
DeploymentResourcePool
Tổng chi phí để chạy bài tập thực hành này trên Google Cloud là khoảng 2 USD.
2. Giới thiệu về Vertex AI
Bài tập thực hành này sử dụng sản phẩm AI mới nhất hiện có trên Google Cloud. Vertex AI tích hợp các sản phẩm ML trên Google Cloud thành một trải nghiệm phát triển liền mạch. Trước đây, các mô hình được huấn luyện bằng AutoML và các mô hình tuỳ chỉnh có thể truy cập thông qua các dịch vụ riêng biệt. Sản phẩm mới này kết hợp cả hai thành một API duy nhất, cùng với các sản phẩm mới khác. Bạn cũng có thể di chuyển các dự án hiện có sang Vertex AI. Nếu bạn có bất kỳ phản hồi nào, vui lòng xem trang hỗ trợ.
Vertex AI bao gồm nhiều sản phẩm khác nhau để hỗ trợ quy trình làm việc ML từ đầu đến cuối. Bài tập thực hành này sẽ tập trung vào các sản phẩm được nêu bật bên dưới: Dự đoán và Workbench

3. Tổng quan về trường hợp sử dụng
Khi triển khai các mô hình cho dịch vụ dự đoán Vertex AI, theo mặc định, mỗi mô hình sẽ được triển khai cho máy ảo riêng. Để lưu trữ hiệu quả hơn về chi phí, bạn có thể lưu trữ nhiều mô hình trên cùng một máy ảo, giúp sử dụng bộ nhớ và tài nguyên tính toán hiệu quả hơn. Số lượng mô hình bạn chọn triển khai cho cùng một máy ảo sẽ tuỳ thuộc vào kích thước mô hình và mẫu lưu lượng truy cập, nhưng tính năng này đặc biệt hữu ích cho các trường hợp bạn có nhiều mô hình được triển khai với lưu lượng truy cập thưa thớt.
Tính năng hỗ trợ mô hình đồng lưu trữ giới thiệu khái niệm Nhóm tài nguyên triển khai, nhóm các mô hình lại với nhau để chia sẻ tài nguyên trong một máy ảo. Các mô hình có thể chia sẻ một máy ảo nếu chúng chia sẻ một điểm cuối và cả khi chúng được triển khai đến các điểm cuối khác nhau. Hiện tại, các mô hình trong cùng một nhóm tài nguyên phải có cùng một hình ảnh vùng chứa, bao gồm cả phiên bản khung của các vùng chứa dựng sẵn Vertex Prediction. Ngoài ra, trong bản phát hành này, chúng tôi chỉ hỗ trợ các vùng chứa dựng sẵn Vertex Prediction có khung mô hình Tensorflow. Các khung mô hình khác và vùng chứa tuỳ chỉnh chưa được hỗ trợ.

4. Thiết lập môi trường
Bạn cần có một dự án trên Google Cloud Platform đã bật tính năng thanh toán để chạy lớp học lập trình này. Để tạo một dự án, hãy làm theo hướng dẫn tại đây.
Bước 1: Bật Compute Engine API
Chuyển đến Compute Engine rồi chọn Bật nếu bạn chưa bật.
Bước 2: Bật Vertex AI API
Chuyển đến phần Vertex AI của Cloud Console rồi nhấp vào Bật Vertex AI API.

Bước 3: Tạo một phiên bản Vertex AI Workbench
Trong phần Vertex AI của Cloud Console, hãy nhấp vào Workbench:

Bật Notebooks API nếu bạn chưa bật.

Sau khi bật, hãy nhấp vào NOTEBOOKS ĐƯỢC QUẢN LÝ:

Sau đó, chọn NOTEBOOK MỚI.

Đặt tên cho sổ tay của bạn rồi trong phần Quyền, chọn Tài khoản dịch vụ

Chọn Cài đặt nâng cao.
Trong phần Bảo mật , hãy chọn "Bật thiết bị đầu cuối" nếu bạn chưa bật.

Bạn có thể giữ nguyên tất cả các chế độ cài đặt nâng cao khác.
Tiếp theo, hãy nhấp vào Tạo. Thực thể này sẽ mất vài phút để được cung cấp.
Sau khi tạo phiên bản, hãy chọn MỞ JUPYTERLAB.

5. Huấn luyện mô hình
Trước khi có thể dùng thử tính năng đồng lưu trữ, trước tiên, chúng ta cần huấn luyện một mô hình và lưu trữ các cấu phần phần mềm mô hình đã lưu vào một vùng chứa Cloud Storage. Chúng ta sẽ sử dụng trình thực thi sổ tay Workbench để chạy công việc huấn luyện.
Bước 1: Tạo một bộ chứa Cloud Storage
Nếu có một bộ chứa hiện có trong dự án mà bạn muốn sử dụng, bạn có thể bỏ qua bước này. Nếu không, từ trình chạy, hãy mở một phiên thiết bị đầu cuối mới.

Từ thiết bị đầu cuối, hãy chạy lệnh sau để xác định một biến môi trường cho dự án của bạn, nhớ thay thế your-cloud-project bằng mã nhận dạng của dự án:
PROJECT_ID='your-cloud-project'
Tiếp theo, hãy chạy lệnh sau để tạo một vùng chứa mới trong dự án.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
Bước 2: Chạy sổ tay
Từ trình chạy của phiên bản Workbench, hãy mở một sổ tay TensorFlow 2 mới.

Đoạn mã bên dưới huấn luyện một thuật toán phân loại cảm xúc nhị phân (tích cực hoặc tiêu cực) trên tập dữ liệu đánh giá phim IMDB. Dán mã vào sổ tay.
Đảm bảo bạn thay thế {YOUR_BUCKET} bằng bộ chứa mà bạn đã tạo ở bước trước (hoặc một bộ chứa khác trong dự án). Đây là nơi chúng ta sẽ lưu trữ các cấu phần phần mềm mô hình đã lưu. Chúng ta sẽ cần các cấu phần phần mềm này sau khi tải mô hình lên 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)
Tiếp theo, hãy chọn nút Thực thi.

Sau đó, định cấu hình quá trình thực thi như sau rồi nhấp vào GỬI

Trên thẻ Thực thi trong bảng điều khiển, bạn có thể theo dõi trạng thái của công việc huấn luyện.

6. Triển khai mô hình
Bước 1: Tải mô hình lên
Khi quá trình thực thi hoàn tất, hãy quay lại sổ tay Workbench để tải mô hình lên. Tạo một sổ tay TensorFlow mới.

Trước tiên, hãy nhập Vertex AI Python SDK
from google.cloud import aiplatform
Sau đó, tải mô hình lên, thay thế {YOUR_BUCKET} bằng vùng chứa mà bạn đã chỉ định trong mã huấn luyện.
# 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')
Để minh hoạ, chúng ta sẽ tải mô hình này lên hai lần, tạo hai tài nguyên mô hình khác nhau trong Vertex AI. Điều này là để chúng ta có thể kiểm thử việc triển khai nhiều mô hình đến một điểm cuối duy nhất trong một nhóm tài nguyên triển khai. Trong một tình huống thực tế, bạn sẽ có hai mô hình khác nhau thay vì tạo mô hình từ cùng một cấu phần phần mềm đã lưu, nhưng đây là một lối tắt để chúng ta không phải chạy một quá trình thực thi huấn luyện khác. Ngoài ra, bạn cũng có thể chọn triển khai hai mô hình đến các điểm cuối khác nhau trong cùng một nhóm tài nguyên triển khai.
# 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')
Trong Vertex AI Model Registry, giờ đây, bạn sẽ thấy cả hai mô hình. Trạng thái triển khai trống vì chúng ta chưa triển khai các mô hình.

Bước 2: Tạo một điểm cuối
Tạo một điểm cuối. Xin lưu ý rằng việc này khác với việc triển khai một mô hình đến một điểm cuối.
endpoint = aiplatform.Endpoint.create('cohost-endpoint')
Khi điểm cuối được tạo, bạn sẽ thấy điểm cuối đó trong bảng điều khiển.

Bước 3: Tạo DeploymentResourcePool
Bạn có thể tạo DeploymentResourcePool bằng lệnh sau. Nhớ thay thế {YOUR_PROJECT} bằng mã dự án của bạn.
# 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}'
Bạn có thể xem nhóm bằng cách chạy
!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}
Bước 4: Triển khai các mô hình đến điểm cuối
Bây giờ, nhóm tài nguyên đã được tạo, chúng ta có thể triển khai các mô hình trong nhóm tài nguyên.
Trước tiên, chúng ta sẽ triển khai model_1. Nhớ thay thế MODEL_1_ID và ENDPOINT_ID bằng các mã tương ứng.
MODEL_1_ID="{MODEL_1_ID}"
ENDPOINT_ID="{ENDPOINT_ID}"
Lệnh sau sẽ triển khai model_1 đến điểm cuối trong nhóm tài nguyên.
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}'
Quá trình này sẽ mất vài phút, nhưng khi hoàn tất, bạn sẽ thấy mô hình được triển khai đến điểm cuối trong bảng điều khiển.

Tiếp theo, chúng ta có thể triển khai model_2 trong cùng một nhóm triển khai. Chúng ta sẽ triển khai mô hình này đến cùng một điểm cuối với model_1. Tuy nhiên, bạn cũng có thể chọn triển khai model_2 đến một điểm cuối khác trong cùng một nhóm tài nguyên.
Cập nhật MODEL_ID bằng mã nhận dạng cho model_2. Một lần nữa, bạn có thể lấy mã nhận dạng này bằng cách chạy model_2.name
MODEL_2_ID="{MODEL_2_ID}"
Sau đó, triển khai model_2. Vì chúng ta đã triển khai model_1 đến điểm cuối, nên chúng ta cần cập nhật trafficSplit để lưu lượng truy cập được chia đều giữa hai mô hình. Chúng ta không phải cập nhật trafficSplit nếu chọn triển khai model_2 đến một điểm cuối khác trong cùng một nhóm tài nguyên.
Để cập nhật mức phân tách lưu lượng truy cập, bạn cần xác định mã DeployedModel cho model_1. Xin lưu ý rằng mã này khác với mã mô hình.
DEPLOYED_MODEL_1_ID = {DEPLOYED_MODEL_1_ID}
Sau đó, thực thi lệnh sau để triển khai mô hình thứ hai.
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}'
Một lần nữa, trong ví dụ này, hai mô hình đã được triển khai đến cùng một điểm cuối, nhưng bạn cũng có thể đồng lưu trữ các mô hình đến cùng một nhóm tài nguyên được triển khai đến các điểm cuối khác nhau. Trong trường hợp đó, bạn không phải lo lắng về việc phân chia lưu lượng truy cập.
Sau khi triển khai mô hình thứ hai, bạn sẽ thấy cả hai mô hình trong bảng điều khiển.

Bước 5: Nhận dự đoán
Bước cuối cùng là kiểm thử điểm cuối và nhận dự đoán.
Trước tiên, hãy xác định câu kiểm thử.
x_test=['The movie was cool. The animation and the graphics were out of this world. I would recommend this movie.']
Sau đó, gọi hàm dự đoán trên điểm cuối. Hàm này sẽ trả về một dự đoán từ một trong các mô hình được triển khai đến điểm cuối.
endpoint.predict(instances=x_test)
🎉 Xin chúc mừng! 🎉
Bạn đã tìm hiểu cách sử dụng Vertex AI để:
- Đồng lưu trữ các mô hình trên cùng một máy ảo để đưa ra dự đoán trực tuyến
Để tìm hiểu thêm về các phần khác nhau của Vertex, hãy xem tài liệu.
7. Dọn dẹp
Bạn nên huỷ triển khai các mô hình khỏi điểm cuối nếu không có ý định sử dụng. Bạn cũng có thể xoá hoàn toàn điểm cuối. Bạn luôn có thể triển khai lại một mô hình đến một điểm cuối nếu cần.

Sổ tay được quản lý của Workbench sẽ tự động hết thời gian chờ sau 180 phút không hoạt động, vì vậy, bạn không cần lo lắng về việc tắt phiên bản. Nếu muốn tắt phiên bản theo cách thủ công, hãy nhấp vào nút Dừng trên phần Vertex AI Workbench của bảng điều khiển. Nếu muốn xoá hoàn toàn sổ tay, hãy nhấp vào nút Xoá.

Để xoá vùng chứa Storage, hãy sử dụng trình đơn Điều hướng trong Cloud Console, duyệt đến Storage, chọn vùng chứa rồi nhấp vào Xoá:
