Vertex AI: Dùng tính năng tự động đóng gói để tinh chỉnh Bert bằng tính năng Ôm khuôn mặt trong Chương trình đào tạo về Vertex AI

1. Tổng quan

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách triển khai một công việc huấn luyện tuỳ chỉnh trong Vertex AI Training bằng tính năng đóng gói tự động. 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ể dùng auotpackaging để tạo một hình ảnh Docker tuỳ chỉnh dựa trên mã của mình, đẩy hình ảnh đó vào 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:

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

Bằng cách sử dụng các thư viện của Ôm Face, bạn sẽ tinh chỉnh mô hình Bert trên tập dữ liệu IMDB. Mô hình này sẽ dự đoán liệu bài đánh giá về một bộ phim mang tính tích cực hay tiêu cực. Tập dữ liệu này sẽ được tải xuống từ thư viện tập dữ liệu Ôm khuôn mặt và mô hình Bert từ thư viện bộ biến đổi Ôm khuôn mặt.

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 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 phần Đào tạo và Bàn làm việc.

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

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: Bật Container Registry API

Chuyển đến Sổ đăng ký vùng chứa và chọn Bật nếu bạn chưa chọn. Bạn sẽ dùng mã 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 mục Vertex AI trên Cloud Console, hãy nhấp vào Workbench:

Trình đơn Vertex AI

Từ đó, nhấp vào SÁCH GHI CHÚ ĐƯỢC QUẢN LÝ:

Notebooks_UI

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

new_notebook

Đặt tên cho sổ tay của bạn, sau đó nhấp vào Cài đặt nâng cao.

create_notebook

Trong phần Advanced Settings (Cài đặt nâng cao), hãy bật chế độ tắt ở trạng thái rảnh và đặt số phút là 60 phút. Điều này có nghĩa là sổ tay của bạn sẽ tự động tắt khi không được sử dụng, do đó bạn không phải chịu các chi phí không cần thiết.

idle_timeout

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.

Sau khi tạo phiên bản, hãy chọn Open JupyterLab.

open_jupyterlab

Vào lần đầu tiên sử dụng một phiên bản mới, bạn sẽ được yêu cầu xác thực.

xác thực

5. Viết mã huấn luyện

Để bắt đầu, trên trình đơn Trình chạy, hãy mở cửa sổ dòng lệnh trong thực thể sổ tay của bạn:

launcher_terminal

Tạo một thư mục mới có tên là autopkg-codelab rồi cd vào thư mục đó.

mkdir autopkg-codelab
cd autopkg-codelab

Trên cửa sổ dòng lệnh, hãy chạy lệnh sau để tạo thư mục cho mã huấn luyện và một tệp Python nơi bạn sẽ 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 bạn vừa tạo rồi sao chép đoạn 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ã này:

  • CHECKPOINT là 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 TFAutoModelForSequenceClassification sẽ tải cấu trúc mô hình ngôn ngữ + trọng số đã chỉ định trong TensorFlow, rồi thêm một đầu phân loại ở trên cùng với các trọng số được khởi tạo ngẫu nhiên. Trong trường hợp này, chúng ta gặp vấn đề phân loại nhị phân (dương hoặc âm) nên chúng ta chỉ định num_labels=2 cho thuật toán phân loại này.

6. Vùng chứa 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 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 trong Vertex AI Training, đồng thời có thể giúp bạn khắc phục các sự cố về mã trước khi thực hiện chương trình 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 Bộ chứa Cloud Storage. 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ã dự án của bạn:

PROJECT_ID='your-cloud-project'

Sau đó, hãy tạo một bộ chứa. Nếu bạn đã có một bộ chứa, hãy 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 trong Vertex AI Training, chúng ta sẽ sử dụng GPU. Tuy nhiên, vì không chỉ định thực thể Workbench với 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 vùng chứa tạo sẵn Đào tạo về Vertex AI.

Chạy đoạn mã sau để đặt URI của 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 thu được được tạo bằng lệnh chạy cục bộ.

OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest

Mã đào tạo của chúng tôi sử dụng các tập dữ liệu Ôm khuôn mặt và thư viện bộ chuyển đổi. Các thư viện này không có trong hình ảnh mà chúng tôi đã chọn làm hình ảnh cơ sở, vì vậy chúng tôi sẽ cần cung cấp chúng theo 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 và dán vào thông tin sau

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ể do Workbench quản lý.

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 pip. Có thể mất vài phút để hoàn tất trong lần đầu tiên bạn thực thi lệnh này. Sau khi hình ảnh được tạo, tệp task.py sẽ bắt đầu chạy và bạn sẽ thấy quy trình huấn luyện mô hình. Bạn sẽ thấy như sau:

local_training

Vì chúng ta không sử dụng GPU cục bộ nên việc 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 để huỷ quy trình huấn luyện cục bộ thay vì đợi 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ể trực tiếp chạy hình ảnh đã 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 công việc tuỳ chỉnh

Hiện tại, khi đã kiểm thử chế độ cục bộ, chúng ta sẽ sử dụng tính năng đóng gói tự động để triển khai công việc huấn luyện tuỳ chỉnh trong Vertex AI Training. Với một lệnh, tính năng này sẽ:

  • Tạo hình ảnh Docker tuỳ chỉnh dựa trên mã của bạn.
  • Đẩy hình ảnh vào Container Registry.
  • Bắt đầu một CustomJob dựa trên hình ảnh.

Quay lại thiết bị đầu cuối và tăng một cấp so với thư mục autopkg-codelab của bạn.

+ autopkg-codelab
  + requirements.txt
  + trainer/
      + task.py

Chỉ định hình ảnh GPU tạo sẵn cho TensorFlow AI Training làm hình ảnh nền 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 tạo sẵn Vertex AI Training mà chúng tôi đặt là BASE_GPU_IMAGE. Sau đó, tính năng tự động đóng gói sẽ cài đặt các tập dữ liệu và thư viện biến áp như được chỉ định trong tệp requirements.txt của chúng ta.

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 cùng xem đối số worker-pool-spec. Thao tác 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 của nhóm worker để tạo một công việc tuỳ chỉnh có nhiều nhóm worker nhằm 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 không được định cấu hì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ố 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 trình thực thi để sử dụng cho nhóm trình thực thi 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 tôi đã chỉ định một GPU NVIDIA Tesla V100.
  • accelerator-count: Số lượng GPU mà mỗi máy ảo trong nhóm worker sẽ sử dụng, theo mặc định, giá trị là 1.
  • executor-image-uri: URI của hình ảnh vùng chứa sẽ chạy gói được cung cấp. Ảnh này được đặt thành hình ảnh cơ sở.
  • 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 để chạy trong gói được cung cấp.

Tương tự như khi chạy lệnh cục bộ, bạn sẽ thấy hình ảnh Docker được tạo và sau đó công việc huấn luyện bắt đầu. Ngoại trừ thay vì nhìn thấy kết quả của công việc đào tạo, bạn sẽ thấy thông báo sau xác nhận rằng công việc đào tạo của bạn đã bắt đầu. Xin lưu ý rằng trong 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.

training_started

Quay lại phần Vertex AI Training của Cloud Console, bạn sẽ thấy công việc của mình đang chạy trong phần CUSTOM JOBS.

training_job

Công việc này sẽ mất khoảng 20 phút để hoàn thành.

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 thuộc bộ chứa của mình.

model_output

🎉 Xin chúc mừng! 🎉

Bạn đã tìm hiểu cách sử dụng Vertex AI để:

  • Vùng chứa 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 phương thức 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 này.

8. Dọn dẹp

Vì đã định cấu hình sổ tay hết thời gian chờ sau 60 phút ở trạng thái rảnh, nên chúng ta 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á.

xóa

Để 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ớ