1. Tổng quan
Trong phòng thí nghiệm 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 VM 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 này trên Google Cloud là khoảng 2 USD.
2. Giới thiệu về Vertex AI
Phòng thí nghiệm này sử dụng sản phẩm AI mới nhất có trên Google Cloud. Vertex AI tích hợp các sản phẩm ML trên Google Cloud để mang đến 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ó ý kiến phản hồi, vui lòng truy cập trang hỗ trợ.
Vertex AI có nhiều sản phẩm để hỗ trợ quy trình làm việc ML toàn diện. Phòng thí nghiệm này sẽ tập trung vào các sản phẩm được làm nổi 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 VM 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 VM, giúp sử dụng hiệu quả hơn bộ nhớ và tài nguyên điện toán. Số lượng mô hình bạn chọn triển khai cho cùng một VM sẽ phụ 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 trong 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.
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ể dùng chung một VM nếu dùng chung một điểm cuối, và cả khi đượ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 được tạo sẵn của 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 hiện 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 mục Vertex AI trong Bảng điều khiển Cloud 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 MANAGED NOTEBOOKS (SỔ TAY ĐƯỢC QUẢN LÝ):

Sau đó, chọn SỔ TAY MỚI.

Đặt tên cho sổ tay của bạn, rồi trong mục Quyền, hãy 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. Phiên bản này sẽ mất vài phút để được cấp phép.
Sau khi tạo phiên bản, hãy chọn MỞ JUPYTERLAB.

5. Đào tạo 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ẽ dùng trình thực thi sổ tay Workbench để chạy lệnh huấn luyện.
Bước 1: Tạo một vùng chứa Cloud Storage
Nếu đã có một nhóm 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, hãy mở một phiên thiết bị đầu cuối mới từ trình chạy.

Trong cửa sổ dòng lệnh, 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ã dự án:
PROJECT_ID='your-cloud-project'
Tiếp theo, hãy chạy lệnh sau để tạo một nhóm mới trong dự án của bạ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ã dưới đây huấn luyện một bộ 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 bài đánh giá phim trên IMDB. Dán mã vào sổ tay.
Hãy nhớ thay thế {YOUR_BUCKET} bằng nhóm tài nguyên mà bạn đã tạo ở bước trước (hoặc một nhóm tài nguyên khác trong dự án của bạn). Đây là nơi chúng ta sẽ lưu trữ các cấu phần phần mềm của mô hình đã lưu. Chúng ta sẽ cần các cấu phần phần mềm này sau này 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 đó, hãy định cấu hình việc 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 quy trình 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 đó, hãy tải mô hình lên, thay thế {YOUR_BUCKET} bằng nhóm 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 ra 2 tài nguyên mô hình riêng biệt 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 vào một điểm cuối duy nhất trong một nhóm tài nguyên triển khai. Trong trường hợp 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 quy trình 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ày đế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 bị 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 tạo điểm cuối, 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
Giờ đây, khi đã tạo nhóm tài nguyên, 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. Hãy 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 đây 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 nó đến cùng một điểm cuối như model_1. Tuy nhiên, bạn cũng có thể chọn triển khaimodel_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. 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 đó, hãy triển khai model_2. Vì chúng ta đã triển khai model_1 cho đ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 giá trị nhận dạng DeployedModel cho model_1. Xin lưu ý rằng mã này khác với mã nhận dạng mô hình.
DEPLOYED_MODEL_1_ID = {DEPLOYED_MODEL_1_ID}
Sau đó, hãy 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}'
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 vào 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 sẽ 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 thông tin dự đoán
Bước cuối cùng là kiểm thử điểm cuối và nhận kết quả 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 đó, hãy gọi predict trên điểm cuối. Thao tác 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 VM để đư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 chú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 do Workbench quản lý sẽ tự động hết thời gian chờ sau 180 phút không hoạt động, nên bạn không cần lo lắng về việc tắt phiên bản. Nếu bạn muốn tắt phiên bản theo cách thủ công, hãy nhấp vào nút Dừng trong phần Vertex AI Workbench của bảng điều khiển. Nếu bạn muốn xoá hoàn toàn sổ tay, hãy nhấp vào nút Xoá.

Để xoá Thùng lưu trữ, hãy sử dụng trình đơn Điều hướng trong Cloud Console, duyệt tìm Bộ nhớ, chọn thùng của bạn rồi nhấp vào Xoá:
