1. Tổng quan
Trong lớp học này, bạn sẽ sử dụng Vertex AI để nhận kết quả dự đoán từ một mô hình phân loại hình ảnh được huấn luyện trước.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu cách:
- Nhập mô hình TensorFlow vào Vertex AI Model Registry
- Nhận cụm từ gợi ý trực tuyến
- Cập nhật hàm phân phát TensorFlow
Tổng chi phí để chạy lớp học này trên Google Cloud là khoảng 1 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.
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
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách sử dụng một mô hình huấn luyện trước từ TensorFlow Hub và triển khai mô hình đó trên Vertex AI. TensorFlow Hub là một kho lưu trữ các mô hình đã được huấn luyện cho nhiều miền bài toán, chẳng hạn như nhúng, tạo văn bản, chuyển lời nói thành văn bản, phân đoạn hình ảnh, v.v.
Ví dụ được sử dụng trong lớp học này là mô hình phân loại hình ảnh MobileNet V1 được huấn luyện trước trên tập dữ liệu ImageNet. Bằng cách tận dụng các mô hình có sẵn từ TensorFlow Hub hoặc các kho lưu trữ học sâu tương tự khác, bạn có thể triển khai các mô hình máy học chất lượng cao cho một số tác vụ dự đoán mà không phải lo lắng về việc huấn luyện mô hình.
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 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 API Notebooks nếu chưa bật.
Sau khi bật, hãy nhấp vào MANAGED NOTEBOOKS (SỔ ĐIỆN TỬ ĐƯỢC QUẢN LÝ):
Sau đó, chọn NOTEBOOK MỚI.
Đặt tên cho sổ tay 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 Security (Bảo mật), hãy chọn "Enable terminal" (Bật thiết bị đầu cuối) nếu bạn chưa 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. Đăng ký mô hình
Bước 1: Tải mô hình lên Cloud Storage
Nhấp vào đường liên kết này để chuyển đến trang TensorFlow Hub cho mô hình MobileNet V1 được huấn luyện trên tập dữ liệu ImagNet.
Chọn Tải xuống để tải các cấu phần phần mềm mô hình đã lưu xuống.
Trong mục Cloud Storage (Bộ nhớ trên đám mây) của Google Cloud Console, hãy chọn CREATE (TẠO)
Đặt tên cho bộ chứa rồi chọn us-central1 làm khu vực. Sau đó, hãy nhấp vào TẠO
Tải mô hình trên TensorFlow Hub mà bạn đã tải xuống lên bộ chứa. Hãy nhớ giải nén tệp trước.
Bộ chứa của bạn sẽ có dạng như sau:
imagenet_mobilenet_v1_050_128_classification_5/
saved_model.pb
variables/
variables.data-00000-of-00001
variables.index
Bước 2: Nhập mô hình vào sổ đăng ký
Chuyển đến phần Đăng ký mô hình Vertex AI trên bảng điều khiển Cloud.
Chọn NHẬP
Chọn Nhập dưới dạng mô hình mới, sau đó đặt tên cho mô hình của bạn.
Trong phần Cài đặt mô hình, hãy chỉ định vùng chứa TensorFlow tạo sẵn gần đây nhất. Sau đó, hãy chọn đường dẫn trong Cloud Storage nơi bạn đã lưu trữ các cấu phần phần mềm của mô hình.
Bạn có thể bỏ qua phần Khả năng giải thích.
Sau đó, chọn NHẬP
Sau khi nhập, bạn sẽ thấy mô hình của mình trong sổ đăng ký mô hình
6. Triển khai mô hình
Trong Cấu hình mô hình, hãy chọn biểu tượng ba dấu chấm ở bên phải mô hình rồi nhấp vào Triển khai đến điểm cuối.
Trong mục Xác định điểm cuối của bạn, hãy chọn tạo điểm cuối mới rồi đặt tên cho điểm cuối.
Trong phần Cài đặt mô hình, hãy đặt Số lượng nút tính toán tối đa thành 1, rồi đặt loại máy thành n1-standard-2
, sau đó giữ nguyên tất cả các chế độ cài đặt khác. Sau đó, hãy nhấp vào DEPLOY.
Khi được triển khai, trạng thái triển khai sẽ thay đổi thành Đã triển khai trên Vertex AI.
7. Nhận thông tin dự đoán
Mở sổ tay Workbench mà bạn đã tạo trong các bước thiết lập. Trong trình chạy, hãy tạo một sổ tay TensorFlow 2 mới.
Thực thi ô sau để nhập các thư viện cần thiết
from google.cloud import aiplatform
import tensorflow as tf
import numpy as np
from PIL import Image
Mô hình MobileNet mà bạn tải xuống từ TensorFlow Hub đã được huấn luyện trên tập dữ liệu ImageNet. Đầu ra của mô hình MobileNet là một số tương ứng với nhãn lớp trong tập dữ liệu ImageNet. Để dịch số đó thành nhãn chuỗi, bạn cần tải nhãn hình ảnh xuống.
# Download image labels
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Để truy cập vào điểm cuối, bạn cần xác định tài nguyên điểm cuối. Hãy nhớ thay thế {PROJECT_NUMBER}
và {ENDPOINT_ID}
.
PROJECT_NUMBER = "{PROJECT_NUMBER}"
ENDPOINT_ID = "{ENDPOINT_ID}"
endpoint = aiplatform.Endpoint(
endpoint_name=f"projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")
Bạn có thể tìm thấy số dự án trên trang chủ của bảng điều khiển.
Và mã nhận dạng điểm cuối trong mục Điểm cuối của Vertex AI.
Tiếp theo, bạn sẽ kiểm thử điểm cuối của mình.
Trước tiên, hãy tải hình ảnh sau đây xuống và tải lên phiên bản của bạn.
Mở hình ảnh bằng PIL. Sau đó, đổi kích thước và điều chỉnh theo tỷ lệ 255. Xin lưu ý rằng bạn có thể tìm thấy kích thước hình ảnh mà mô hình dự kiến trên trang trung tâm TensorFlow của mô hình.
IMAGE_PATH = "test-image.jpg"
IMAGE_SIZE = (128, 128)
im = Image.open(IMAGE_PATH)
im = im.resize(IMAGE_SIZE
im = np.array(im)/255.0
Tiếp theo, hãy chuyển đổi dữ liệu NumPy thành một danh sách để có thể gửi dữ liệu đó trong phần nội dung của yêu cầu http.
x_test = im.astype(np.float32).tolist()
Cuối cùng, hãy thực hiện lệnh gọi dự đoán đến điểm cuối rồi tra cứu nhãn chuỗi tương ứng.
# make prediction request
result = endpoint.predict(instances=[x_test]).predictions
# post process result
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
8. [Không bắt buộc] Sử dụng tính năng Phân phát TF để tối ưu hoá thông tin dự đoán
Để xem ví dụ thực tế hơn, bạn nên gửi trực tiếp hình ảnh đến điểm cuối, thay vì tải trước bằng NumPy. Cách này hiệu quả hơn nhưng bạn sẽ phải sửa đổi hàm phân phát của mô hình TensorFlow. Việc sửa đổi này là cần thiết để chuyển đổi dữ liệu đầu vào sang định dạng mà mô hình của bạn mong đợi.
Bước 1: Sửa đổi hàm phân phát
Mở một sổ tay TensorFlow mới và nhập các thư viện cần thiết.
from google.cloud import aiplatform
import tensorflow as tf
Thay vì tải các cấu phần phần mềm mô hình đã lưu xuống, lần này bạn sẽ tải mô hình vào TensorFlow bằng hub.KerasLayer
. hub.KerasLayer
sẽ gói TensorFlow SavedModel dưới dạng một lớp Keras. Để tạo mô hình, bạn có thể sử dụng API Keras Sequential với mô hình TF Hub đã tải xuống làm một lớp và chỉ định hình dạng đầu vào cho mô hình.
tfhub_model = tf.keras.Sequential(
[hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v1_050_128/classification/5")]
)
tfhub_model.build([None, 128, 128, 3])
Xác định URI cho bộ chứa mà bạn đã tạo trước đó.
BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"
Khi bạn gửi một yêu cầu tới một máy chủ gợi ý trực tuyến, máy chủ HTTP sẽ nhận được yêu cầu đó. Máy chủ HTTP trích xuất yêu cầu dự đoán từ nội dung yêu cầu HTTP. Yêu cầu dự đoán được trích xuất sẽ được chuyển tiếp đến hàm phân phát. Đối với các vùng chứa dự đoán tạo sẵn của Vertex AI, nội dung yêu cầu được truyền đến hàm phân phát dưới dạng tf.string
.
Để truyền hình ảnh đến dịch vụ dự đoán, bạn cần mã hoá các byte hình ảnh nén thành cơ sở 64. Điều này giúp nội dung an toàn khỏi bị sửa đổi trong khi truyền dữ liệu nhị phân qua mạng.
Vì mô hình đã triển khai yêu cầu dữ liệu đầu vào là byte thô (không nén), nên bạn cần đảm bảo rằng dữ liệu cơ sở 64 đã mã hoá được chuyển đổi trở lại thành byte thô (ví dụ: JPEG), sau đó được xử lý trước để phù hợp với các yêu cầu đầu vào của mô hình, trước khi truyền dưới dạng dữ liệu đầu vào cho mô hình đã triển khai.
Để giải quyết vấn đề này, bạn xác định hàm phân phát (serving_fn
) và đính kèm hàm này vào mô hình ở dạng bước xử lý trước. Bạn thêm một trình trang trí @tf.function
để hàm phân phát được hợp nhất với mô hình cơ bản (thay vì ở thượng nguồn trên CPU).
CONCRETE_INPUT = "numpy_inputs"
def _preprocess(bytes_input):
decoded = tf.io.decode_jpeg(bytes_input, channels=3)
decoded = tf.image.convert_image_dtype(decoded, tf.float32)
resized = tf.image.resize(decoded, size=(128, 128))
return resized
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def preprocess_fn(bytes_inputs):
decoded_images = tf.map_fn(
_preprocess, bytes_inputs, dtype=tf.float32, back_prop=False
)
return {
CONCRETE_INPUT: decoded_images
} # User needs to make sure the key matches model's input
@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def serving_fn(bytes_inputs):
images = preprocess_fn(bytes_inputs)
prob = m_call(**images)
return prob
m_call = tf.function(tfhub_model.call).get_concrete_function(
[tf.TensorSpec(shape=[None, 128, 128, 3], dtype=tf.float32, name=CONCRETE_INPUT)]
)
tf.saved_model.save(tfhub_model, MODEL_DIR, signatures={"serving_default": serving_fn})
Khi bạn gửi dữ liệu để dự đoán dưới dạng gói yêu cầu HTTP, dữ liệu hình ảnh sẽ được mã hoá base64, nhưng mô hình TensorFlow sẽ lấy dữ liệu đầu vào numpy. Hàm phân phát của bạn sẽ thực hiện việc chuyển đổi từ base64 thành một mảng numpy.
Khi đưa ra yêu cầu dự đoán, bạn cần định tuyến yêu cầu đến hàm phân phát thay vì mô hình, vì vậy, bạn cần biết tên lớp đầu vào của hàm phân phát. Chúng ta có thể lấy tên này từ chữ ký hàm cung cấp.
loaded = tf.saved_model.load(MODEL_DIR)
serving_input = list(
loaded.signatures["serving_default"].structured_input_signature[1].keys()
)[0]
print("Serving function input name:", serving_input)
Bước 2: Nhập vào sổ đăng ký và triển khai
Trong các phần trước, bạn đã thấy cách nhập mô hình vào Vertex AI Model Registry thông qua giao diện người dùng. Trong phần này, bạn sẽ thấy một cách khác để sử dụng SDK. Xin lưu ý rằng bạn vẫn có thể sử dụng giao diện người dùng tại đây nếu muốn.
model = aiplatform.Model.upload(
display_name="optimized-model",
artifact_uri=MODEL_DIR,
serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest",
)
print(model)
Bạn cũng có thể triển khai mô hình bằng SDK thay vì giao diện người dùng.
endpoint = model.deploy(
deployed_model_display_name='my-bytes-endpoint',
traffic_split={"0": 100},
machine_type="n1-standard-4",
accelerator_count=0,
min_replica_count=1,
max_replica_count=1,
)
Bước 3: Kiểm thử mô hình
Bây giờ, bạn có thể kiểm thử điểm cuối. Vì chúng ta đã sửa đổi hàm phân phát, nên lần này, bạn có thể gửi trực tiếp hình ảnh (được mã hoá base64) trong yêu cầu thay vì tải hình ảnh vào NumPy trước. Điều này cũng cho phép bạn gửi hình ảnh lớn hơn mà không gặp phải giới hạn kích thước của tính năng Dự đoán AI của Vertex.
Tải lại nhãn hình ảnh xuống
import numpy as np
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
Mã hoá hình ảnh bằng Base64.
import base64
with open("test-image.jpg", "rb") as f:
data = f.read()
b64str = base64.b64encode(data).decode("utf-8")
Thực hiện lệnh gọi dự đoán, chỉ định tên lớp đầu vào của hàm phân phát mà chúng ta đã xác định trong biến serving_input
trước đó.
instances = [{serving_input: {"b64": b64str}}]
# Make request
result = endpoint.predict(instances=instances).predictions
# Convert image class to string label
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]
print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")
🎉 Xin chúc mừng! 🎉
Bạn đã tìm hiểu cách sử dụng Vertex AI để:
- Lưu trữ và triển khai mô hình huấn luyện trước
Để 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.
9. Dọn dẹp
Vì sổ tay được quản lý bằng Vertex AI Workbench có tính năng tắt ở trạng thái rảnh, nên chúng ta không cần 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 mục Vertex AI Workbench (Bảng điều khiển Vertex AI) 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á Bộ nhớ, hãy sử dụng trình đơn Điều hướng trong Cloud Console, chuyển đến Bộ nhớ, chọn bộ nhớ của bạn rồi nhấp vào Xoá: