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 máy ảo để 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 phòng thí nghiệm 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 giải pháp 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, các mô hình được huấn luyện bằng AutoML và mô hình tuỳ chỉnh có thể truy cập được thông qua các dịch vụ riêng biệt. Dịch vụ 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 có nhiều sản phẩm nhằm hỗ trợ quy trình học máy 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 dưới đây: Dự đoánBàn làm việc

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 AI trong Vertex, theo mặc định, mỗi mô hình sẽ được triển khai cho máy ảo riêng. Để việc lưu trữ tiết kiệm chi phí hơn, 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 mà 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. Tuy nhiên, tính năng này đặc biệt hữu ích cho các tình huống mà bạn có nhiều mô hình đã triển khai với lưu lượng truy cập thưa thớt.

Dịch vụ 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 này sẽ 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áy ảo nếu dùng chung một điểm cuối và cả khi được triển khai trên nhiều điểm cuối. 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 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, bản phát hành này chỉ hỗ trợ vùng chứa tạo sẵn Dự đoán Vertex với khung mô hình Tensorflow, các khung mô hình và vùng chứa tuỳ chỉnh khác chưa được hỗ trợ.

deployment_pool

4. Thiết lập môi trường

Bạn cần một dự á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 Enable (Bật) nếu bạn chưa bật tính năng này.

Bước 2: Bật Vertex AI API

Chuyển đến phần Vertex AI trong Cloud Console rồi nhấp vào Bật Vertex AI API.

Trang tổng quan Vertex AI

Bước 3: Tạo một thực thể Vertex AI Workbench

Trong mục Vertex AI trên Cloud Console, hãy nhấp vào Workbench:

Trình đơn Vertex AI

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

Notebook_api

Sau khi bật, hãy nhấp vào SÁCH QUẢN LÝ SÁCH:

Notebooks_UI

Sau đó, chọn SÁCH LƯU Ý MỚI.

new_notebook

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

create_notebook

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 chưa được bật.

enable_terminal

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 cung cấp thực thể này sẽ mất vài phút.

Sau khi tạo phiên bản, hãy chọn MỞ JUPYTERLAB.

open_jupyterlab

5. Mô hình tàu hoả

Để 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 bộ chứa Cloud Storage. Chúng ta sẽ sử dụng Trình thực thi sổ tay Workbench để bắt đầu công việc huấn luyện.

Bước 1: Tạo một bộ chứa 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.

launcher_terminal

Trên cửa sổ dòng lệnh, hãy chạy lệnh sau để xác định một 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

Từ trình chạy của thực thể Workbench, hãy mở một sổ tay TensorFlow 2 mới.

launcher_tf2

Mã dưới đây huấn luyện một bộ phân loại ý kiến 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.

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 lưu trữ các cấu phần phần mềm mô hình đã lưu mà sau này chúng ta sẽ cần đến khi tải mô hình lên Vertex AI Model Registry (Sổ đăng ký mô hình AI của Vertex).

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.

execute_nb

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

execution_config

Từ thẻ Các lần thực thi trong bảng điều khiển, bạn có thể theo dõi trạng thái công việc huấn luyện của mình.

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 đó, 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 tôi sẽ tải mô hình này lên 2 lần, tạo ra 2 tài nguyên mô hình khác nhau trong Vertex AI. Việc này giúp chúng ta có thể thử nghiệm việc triển khai nhiều mô hình cho một điểm cuối duy nhất trong nhóm tài nguyên triển khai. Trong một tình huống thực tế, bạn sẽ có 2 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à lối tắt để chúng ta không phải khở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')

Trong Vertex AI Model Registry, bạn hiện sẽ thấy cả hai mô hình. Trạng thái triển khai đang trống vì chúng tôi chưa triển khai mô hình.

model_registry

Bước 2: Tạo điểm cuối

Tạo đ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 tạo xong đ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. 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 bể bơi 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 cho điểm cuối

Giờ đây, 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. Hãy nhớ thay thế MODEL_1_IDENDPOINT_ID bằng các mã nhận dạng 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 tôi sẽ triển khai API này tới cùng điểm cuối như 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 đó, 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 để phân chia lưu lượng truy cập giữa 2 mô hình. Chúng ta sẽ không phải cập nhật trafficSplit nếu 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 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 các bước 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 cho 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 cho 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 chia tách 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 cụm từ gợi ý

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 đó, lệnh gọi dự đoán trên điểm cuối sẽ trả về thông tin dự đoán từ một trong các mô hình đã 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 để:

  • 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 này.

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 định 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.

undeploy_model

Sổ tay được quản lý Workbench sẽ tự động hết thời gian chờ sau 180 phút ở trạng thái rảnh, 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 trên 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 thực thể

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

Xoá bộ nhớ