1. Tổng quan
Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách chạy một công việc huấn luyện tuỳ chỉnh trên Vertex AI Training bằng tính năng tự động đóng gói. Các công việc huấn luyện tuỳ chỉnh trên Vertex AI sử dụng vùng chứa. Nếu không muốn tạo hình ảnh của riêng mình, bạn có thể sử dụng tính năng tự động đóng gói. Tính năng này sẽ tạo một hình ảnh Docker tuỳ chỉnh dựa trên mã của bạn, đẩy hình ảnh đó lên Container Registry và bắt đầu một CustomJob dựa trên hình ảnh đó.
Kiến thức bạn sẽ học được
Bạn sẽ tìm hiểu cách:
- Sử dụng chế độ cục bộ để kiểm thử mã.
- Định cấu hình và chạy một công việc huấn luyện tuỳ chỉnh bằng tính năng tự động đóng gói.
Tổng chi phí để chạy phòng thí nghiệm này trên Google Cloud là khoảng 2 USD.
2. Tổng quan về trường hợp sử dụng
Sử dụng các thư viện từ Hugging Face, bạn sẽ tinh chỉnh một mô hình Bert trên tập dữ liệu IMDB. Mô hình này sẽ dự đoán xem một bài đánh giá phim là tích cực hay tiêu cực. Tập dữ liệu sẽ được tải xuống từ thư viện tập dữ liệu Hugging Face và mô hình Bert từ thư viện trình biến đổi Hugging Face.
3. 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 hiện có trên Google Cloud. Vertex AI tích hợp các sản phẩm ML trên Google Cloud thành 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à 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 xem trang hỗ trợ.
Vertex AI bao gồm nhiều sản phẩm khác nhau để hỗ trợ quy trình làm việc ML từ đầu đến cuối. Phòng thí nghiệm này sẽ tập trung vào Training (Huấn luyện) và Workbench (Bàn làm việc).

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 Enable nếu chưa bật.
Bước 2: Bật API Vertex AI
Chuyển đến phần Vertex AI (Vertex AI) của Cloud Console (Bảng điều khiển Cloud) rồi nhấp vào Enable Vertex AI API (Bật API Vertex AI).

Bước 3: Bật API Container Registry
Chuyển đến Container Registry rồi chọn Enable nếu chưa bật. Bạn sẽ sử dụng API này để tạo một vùng chứa cho công việc huấn luyện tuỳ chỉnh.
Bước 4: Tạo một thực thể Vertex AI Workbench
Trong phần Vertex AI của Cloud Console (Bảng điều khiển Cloud), hãy nhấp vào Workbench (Bàn làm việc):

Tại đây, hãy nhấp vào MANAGED NOTEBOOKS:

Sau đó, chọn NEW NOTEBOOK (SỔ GHI CHÉP MỚI).

Đặt tên cho sổ ghi chép rồi nhấp vào Advanced Settings (Cài đặt nâng cao).

Trong phần Advanced Settings (Cài đặt nâng cao), hãy bật tính năng idle shutdown (tắt khi không hoạt động) và đặt số phút thành 60. Điều này có nghĩa là sổ ghi chép sẽ tự động tắt khi không được sử dụng để bạn không phải chịu chi phí không cần thiế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 Create (Tạo).
Sau khi tạo thực thể, hãy chọn Open JupyterLab (Mở JupyterLab).

Lần đầu tiên sử dụng một thực thể mới, bạn sẽ được yêu cầu xác thực.

5. Viết mã huấn luyện
Để bắt đầu, trong trình đơn Launcher (Trình chạy), hãy mở một cửa sổ Terminal (Cửa sổ dòng lệnh) trong thực thể sổ ghi chép:

Tạo một thư mục mới có tên là autopkg-codelab rồi chuyển vào thư mục đó.
mkdir autopkg-codelab
cd autopkg-codelab
Trong Terminal (Cửa sổ dòng lệnh), hãy chạy lệnh sau để tạo một thư mục cho mã huấn luyện và một tệp Python để bạn thêm mã:
mkdir trainer
touch trainer/task.py
Bây giờ, bạn sẽ có những nội dung sau trong thư mục autopkg-codelab/:
+ trainer/
+ task.py
Tiếp theo, hãy mở tệp task.py mà bạn vừa tạo rồi sao chép mã bên dưới.
import argparse
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer
from transformers import TFAutoModelForSequenceClassification
CHECKPOINT = "bert-base-cased"
def get_args():
'''Parses args.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--epochs',
required=False,
default=3,
type=int,
help='number of epochs')
parser.add_argument(
'--job_dir',
required=True,
type=str,
help='bucket to store saved model, include gs://')
args = parser.parse_args()
return args
def create_datasets():
'''Creates a tf.data.Dataset for train and evaluation.'''
raw_datasets = load_dataset('imdb')
tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
tokenized_datasets = raw_datasets.map((lambda examples: tokenize_function(examples, tokenizer)), batched=True)
# To speed up training, we use only a portion of the data.
# Use full_train_dataset and full_eval_dataset if you want to train on all the data.
small_train_dataset = tokenized_datasets['train'].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets['test'].shuffle(seed=42).select(range(1000))
full_train_dataset = tokenized_datasets['train']
full_eval_dataset = tokenized_datasets['test']
tf_train_dataset = small_train_dataset.remove_columns(['text']).with_format("tensorflow")
tf_eval_dataset = small_eval_dataset.remove_columns(['text']).with_format("tensorflow")
train_features = {x: tf_train_dataset[x] for x in tokenizer.model_input_names}
train_tf_dataset = tf.data.Dataset.from_tensor_slices((train_features, tf_train_dataset["label"]))
train_tf_dataset = train_tf_dataset.shuffle(len(tf_train_dataset)).batch(8)
eval_features = {x: tf_eval_dataset[x] for x in tokenizer.model_input_names}
eval_tf_dataset = tf.data.Dataset.from_tensor_slices((eval_features, tf_eval_dataset["label"]))
eval_tf_dataset = eval_tf_dataset.batch(8)
return train_tf_dataset, eval_tf_dataset
def tokenize_function(examples, tokenizer):
'''Tokenizes text examples.'''
return tokenizer(examples['text'], padding='max_length', truncation=True)
def main():
args = get_args()
train_tf_dataset, eval_tf_dataset = create_datasets()
model = TFAutoModelForSequenceClassification.from_pretrained(CHECKPOINT, num_labels=2)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=tf.metrics.SparseCategoricalAccuracy(),
)
model.fit(train_tf_dataset, validation_data=eval_tf_dataset, epochs=args.epochs)
model.save(f'{args.job_dir}/model_output')
if __name__ == "__main__":
main()
Một vài điều cần lưu ý về mã:
CHECKPOINTlà mô hình mà chúng ta muốn tinh chỉnh. Trong trường hợp này, chúng ta sử dụng Bert.- Phương thức
TFAutoModelForSequenceClassificationsẽ tải cấu trúc mô hình ngôn ngữ + trọng số đã chỉ định trong TensorFlow và thêm một đầu phân loại ở trên cùng với các trọng số được khởi chạy ngẫu nhiên. Trong trường hợp này, chúng ta có một vấn đề phân loại nhị phân (tích cực hoặc tiêu cực) nên chúng ta chỉ địnhnum_labels=2cho bộ phân loại này.
6. Đóng gói và chạy mã huấn luyện cục bộ
Bạn có thể sử dụng lệnh gcloud ai custom-jobs local-run để tạo một hình ảnh vùng chứa Docker dựa trên mã huấn luyện và chạy hình ảnh đó dưới dạng một vùng chứa trên máy cục bộ. Việc chạy một vùng chứa cục bộ sẽ thực thi mã huấn luyện của bạn theo cách tương tự như cách chạy trên Vertex AI Training và có thể giúp bạn gỡ lỗi các vấn đề với mã trước khi thực hiện huấn luyện tuỳ chỉnh trên Vertex AI.
Trong công việc huấn luyện, chúng ta sẽ xuất mô hình đã huấn luyện sang một Cloud Storage Bucket (Thùng lưu trữ trên Cloud Storage). Trong Terminal (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'
Sau đó, hãy tạo một bộ chứa. Nếu có một bộ chứa hiện có, bạn có thể sử dụng bộ chứa đó.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
Khi chạy công việc huấn luyện tuỳ chỉnh trên Vertex AI Training, chúng ta sẽ sử dụng GPU. Tuy nhiên, vì chúng ta không chỉ định thực thể Workbench bằng GPU, nên chúng ta sẽ sử dụng hình ảnh dựa trên CPU để kiểm thử cục bộ. Trong ví dụ này, chúng ta sử dụng một vùng chứa được tạo sẵn của Vertex AI Training.
Chạy lệnh sau để đặt URI của một hình ảnh Docker dùng làm cơ sở của vùng chứa.
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
Sau đó, đặt tên cho hình ảnh Docker kết quả do lệnh chạy cục bộ tạo.
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
Mã huấn luyện của chúng ta sử dụng các thư viện tập dữ liệu và trình biến đổi Hugging Face. Các thư viện này không được đưa vào hình ảnh mà chúng ta đã chọn làm hình ảnh cơ sở, vì vậy, chúng ta cần cung cấp các thư viện này dưới dạng yêu cầu. Để thực hiện việc này, chúng ta sẽ tạo một tệp requirements.txt trong thư mục autopkg-codelab.
Đảm bảo bạn đang ở trong thư mục autopkg-codelab và nhập nội dung sau vào cửa sổ dòng lệnh.
touch requirements.txt
Bây giờ, bạn sẽ có những nội dung sau trong thư mục autopkg-codelab:
+ requirements.txt
+ trainer/
+ task.py
Mở tệp yêu cầu rồi dán nội dung sau vào
datasets==1.18.2
transformers==4.16.2
Cuối cùng, hãy thực thi lệnh gcloud ai custom-jobs local-run để bắt đầu huấn luyện trên thực thể được quản lý của Workbench.
gcloud ai custom-jobs local-run \
--executor-image-uri=$BASE_CPU_IMAGE \
--python-module=trainer.task \
--output-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME
Bạn sẽ thấy hình ảnh Docker đang được tạo. Các phần phụ thuộc mà chúng ta đã thêm vào tệp requirements.txt sẽ được cài đặt bằng pip. Quá trình này có thể mất vài phút để hoàn tất vào lần đầu tiên bạn thực thi lệnh này. Sau khi tạo hình ảnh, tệp task.py sẽ bắt đầu chạy và bạn sẽ thấy quá trình huấn luyện mô hình. Bạn sẽ thấy như sau:

Vì chúng ta không sử dụng GPU cục bộ, nên quá trình huấn luyện mô hình sẽ mất nhiều thời gian. Bạn có thể nhấn tổ hợp phím Ctrl+c và huỷ huấn luyện cục bộ thay vì chờ công việc hoàn tất.
Xin lưu ý rằng nếu muốn kiểm thử thêm, bạn cũng có thể chạy trực tiếp bản dựng hình ảnh được tạo ở trên mà không cần đóng gói lại.
gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1
7. Tạo một công việc tuỳ chỉnh
Bây giờ, sau khi đã kiểm thử chế độ cục bộ, chúng ta sẽ sử dụng tính năng tự động đóng gói để chạy công việc huấn luyện tuỳ chỉnh trên Vertex AI Training. Với một lệnh duy nhất, tính năng này sẽ:
- Tạo một hình ảnh Docker tuỳ chỉnh dựa trên mã của bạn.
- Đẩy hình ảnh đó lên Container Registry.
- Bắt đầu một
CustomJobdựa trên hình ảnh đó.
Quay lại cửa sổ dòng lệnh và chuyển lên một cấp trên thư mục autopkg-codelab.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
Chỉ định hình ảnh GPU TensorFlow được tạo sẵn của Vertex AI Training làm hình ảnh cơ sở cho công việc huấn luyện tuỳ chỉnh.
BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest
Tiếp theo, hãy thực thi lệnh gcloud ai custom-jobs create. Trước tiên, lệnh này sẽ tạo một hình ảnh Docker tuỳ chỉnh dựa trên mã huấn luyện. Hình ảnh cơ sở là vùng chứa được tạo sẵn của Vertex AI Training mà chúng ta đặt làm BASE_GPU_IMAGE. Sau đó, tính năng tự động đóng gói sẽ cài đặt các thư viện tập dữ liệu và trình biến đổi bằng pip như được chỉ định trong tệp requirements.txt.
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=fine_tune_bert \
--args=--job_dir=$BUCKET_NAME \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,executor-image-uri=$BASE_GPU_IMAGE,local-package-path=autopkg-codelab,python-module=trainer.task
Hãy xem đối số worker-pool-spec. Đối số này xác định cấu hình nhóm worker mà công việc tuỳ chỉnh sử dụng. Bạn có thể chỉ định nhiều thông số kỹ thuật nhóm worker để tạo một công việc tuỳ chỉnh có nhiều nhóm worker cho quá trình huấn luyện phân tán. Trong ví dụ này, chúng ta chỉ chỉ định một nhóm worker duy nhất, vì mã huấn luyện của chúng ta không được định cấu hình cho quá trình huấn luyện phân tán.
Dưới đây là một số trường chính của thông số kỹ thuật này:
machine-type(Bắt buộc): Loại máy. Nhấp vào đây để xem các loại được hỗ trợ.replica-count: Số lượng bản sao worker cần sử dụng cho nhóm worker này, theo mặc định, giá trị là 1.accelerator-type: Loại GPU. Nhấp vào đây để xem các loại được hỗ trợ. Trong ví dụ này, chúng ta đã chỉ định một GPU NVIDIA Tesla V100.accelerator-count: Số lượng GPU mà mỗi VM trong nhóm worker sử dụng, theo mặc định, giá trị là 1.executor-image-uri: URI của một hình ảnh vùng chứa sẽ chạy gói được cung cấp. Giá trị này được đặt thành hình ảnh cơ sở của chúng ta.local-package-path: Đường dẫn cục bộ của một thư mục chứa mã huấn luyện.python-module: Tên mô-đun Python cần chạy trong gói được cung cấp.
Tương tự như khi bạn chạy lệnh cục bộ, bạn sẽ thấy hình ảnh Docker đang được tạo và sau đó công việc huấn luyện bắt đầu. Tuy nhiên, thay vì thấy kết quả của công việc huấn luyện, bạn sẽ thấy thông báo sau xác nhận rằng công việc huấn luyện đã chạy. Xin lưu ý rằng lần đầu tiên bạn chạy lệnh custom-jobs create, có thể mất vài phút để tạo và đẩy hình ảnh.

Quay lại phần Vertex AI Training (Vertex AI Training) của bảng điều khiển đám mây và trong phần CUSTOM JOBS (CÔNG VIỆC TUỲ CHỈNH), bạn sẽ thấy công việc của mình đang chạy.

Công việc này sẽ mất khoảng 20 phút để hoàn tất.
Sau khi hoàn tất, bạn sẽ thấy các cấu phần phần mềm mô hình đã lưu sau đây trong thư mục model_output trong thùng của mình.

🎉 Xin chúc mừng! 🎉
Bạn đã tìm hiểu cách sử dụng Vertex AI để:
- Đóng gói và chạy mã huấn luyện cục bộ
- Gửi công việc huấn luyện đến Vertex AI Training bằng tính năng tự động đóng gói
Để tìm hiểu thêm về các phần khác nhau của Vertex AI, hãy xem tài liệu.
8. Dọn dẹp
Vì chúng ta đã định cấu hình sổ ghi chép để hết thời gian chờ sau 60 phút không hoạt động, nên chúng ta không cần lo lắng về việc tắt thực thể. Nếu muốn tắt thực thể theo cách thủ công, hãy nhấp vào nút Stop (Dừng) trong phần Vertex AI Workbench (Vertex AI Workbench) của bảng điều khiển. Nếu muốn xoá hoàn toàn sổ ghi chép, hãy nhấp vào nút Delete (Xoá).

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