1. Tổng quan
Trong lớp học này, bạn sẽ sử dụng tính năng mô hình lưu trữ cùng trong Vertex AI để lưu trữ nhiều mô hình trên cùng một máy ảo cho mục đích 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 mô hình trong
DeploymentResourcePool
Tổng chi phí để chạy lớp học này trên Google Cloud là khoảng 2 USD.
2. Giới thiệu về Vertex AI
Lớp học 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 dịch vụ học máy trên Google Cloud vào một trải nghiệm phát triển liền mạch. Trước đây, bạn có thể truy cập vào các mô hình được huấn luyện bằng AutoML và mô hình tuỳ chỉnh thông qua các dịch vụ riêng biệt. Sản phẩm mới 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 xem trang hỗ trợ.
Vertex AI bao gồm nhiều sản phẩm để hỗ trợ quy trình làm việc toàn diện về máy học. Lớp học này sẽ tập trung vào các sản phẩm được nêu dưới đây: Dự đoán và Workbench
3. Tổng quan về trường hợp sử dụng
Khi triển khai 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. Để tiết kiệm chi phí lưu trữ, bạn có thể lưu trữ nhiều mô hình trên cùng một máy ảo, nhờ đó sử dụng bộ nhớ và tài nguyên điện 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ẽ 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 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 lưu trữ cùng nhau giới thiệu khái niệm về Vùng 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ũng có thể chia sẻ nếu đượ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 vùng chứa tạo sẵn Vertex Prediction. Ngoài ra, chỉ các vùng chứa tạo sẵn của tính năng Dự đoán đỉnh có khung mô hình Tensorflow mới được hỗ trợ trong bản phát hành này, 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 dự án, hãy làm theo hướng dẫn tại đây.
Bước 1: Bật API Compute Engine
Chuyển đến Compute Engine rồi chọn Bật nếu bạn chưa bật.
Bước 2: Bật API Vertex AI
Chuyển đến mục Vertex AI trong Cloud Console rồi nhấp vào Bật API Vertex AI.
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ảng điều khiển):
Bật Notebooks API nếu bạn chưa bật.
Sau khi bật, hãy nhấp vào SÁCH GHI CHÚ CỦA QUẢN LÝ:
Sau đó, chọn NOTEBOOK MỚI.
Đặt tên cho sổ tay của bạn và trong phần 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, chọn "Bật thiết bị đầu cuối" nếu thiết bị này chưa được bật.
Bạn có thể giữ nguyên mọi chế độ cài đặt nâng cao khác.
Tiếp theo, hãy nhấp vào Tạo. Quá trình cấp phép thực thể sẽ mất vài phút.
Sau khi tạo thực thể, hãy chọn MỞ JUPYTERLAB.
5. Mô hình tàu
Trước khi có thể dùng thử tính năng lưu trữ cùng, 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 bộ chứa trên 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 bộ chứa trên Cloud Storage
Nếu muốn sử dụng một bộ chứa hiện có trong dự án, bạn có thể bỏ qua bước này. Nếu không, từ trình chạy sẽ mở một phiên đầu cuối mới.
Trên dòng lệnh, hãy chạy lệnh sau để xác định biến env 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 bộ chứa 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 quá trình thực thi trên sổ tay
Trên trình chạy của phiên bản Workbench, hãy mở một sổ tay TensorFlow 2 mới.
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 dữ liệu tập hợp bài đánh giá phim trên IMDB. Dán mã vào sổ tay.
Hãy nhớ 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 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 mô hình đã lưu. Chúng ta sẽ cần đế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, chọn nút Thực thi.
Sau đó, hãy định cấu hình quá trình thực thi như sau rồi nhấp vào GỬI
Trong 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 SDK Vertex AI Python
from google.cloud import aiplatform
Sau đó, hãy tải mô hình lên, thay thế {YOUR_BUCKET}
bằng bộ 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 cho một điểm cuối trong 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 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 2 mô hình này cho 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')
Giờ đây, bạn sẽ thấy cả hai mô hình trong Vertex AI Model Registry. Trạng thái triển khai bị trống vì chúng ta chưa triển khai mô hình.
Bước 2: Tạo đ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ô 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. Hãy 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 này 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 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 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 lớp 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
cho một điểm cuối khác trong cùng nhóm tài nguyên.
Cập nhật MODEL_ID
bằng mã nhận dạng cho model_2
. Xin nhắc lại, 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ì đã 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 phân chia 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 phần phân chia 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 đó, hãy thực thi các 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}'
Xin nhắc lại, 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 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 thông tin dự đoán.
Đầu 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 hàm dự đoán trên điểm cuối. Hàm này sẽ trả về kết quả dự đoán từ một trong các mô hình được triển khai cho đ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 để:
- Các mô hình đồng tổ chức 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ó kế hoạch sử dụng các mô hình đó. 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ô hình cho 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, vì vậy, bạn không cần phải lo lắng về việc tắt thực thể. Nếu bạn muốn tắt thực thể 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á toàn bộ sổ tay, hãy nhấp vào nút Xoá.
Để xoá Bộ chứa Storage, hãy sử dụng trình đơn Điều hướng trong Cloud Console, duyệt đến Bộ nhớ, chọn bộ chứa rồi nhấp vào Xoá: