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

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ánWorkbench

Tổng quan về sản phẩm Vertex

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ợ.

deployment_pool

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.

Trang tổng quan 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:

Trình đơn Vertex AI

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

Notebook_api

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

Notebooks_UI

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

new_notebook

Đặ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ụ

create_notebook

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.

enable_terminal

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.

open_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.

launcher_terminal

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.

launcher_tf2

Đ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.

execute_nb

Sau đó, hãy định cấu hình việc thực thi như sau rồi nhấp vào GỬI

execution_config

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.

execution_status

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.

tf_nb

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.

model_registry

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.

console_endpoint

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_IDENDPOINT_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.

model_1_endpoint

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.

deployed_models

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.

undeploy_model

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á.

Dừng phiên bản

Để 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á:

Xoá bộ nhớ