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 lớp học 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ô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 hình ảnh Docker tuỳ chỉnh dựa trên mã của bạn, đẩy hình ảnh đó vào Container Registry và bắt đầu 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 lớp học 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. Dữ liệu tập hợp sẽ được tải xuống từ thư viện dữ liệu tập hợp của Hugging Face và mô hình Bert từ thư viện trình chuyển đổi Hugging Face.

3. 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. 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 để 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 phần Đào tạo và Workbench.

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

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 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 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 Container Registry (Kho lưu trữ vùng chứa) rồi chọn Enable (Bật) nếu bạn chưa bật. Bạn sẽ sử dụng thông tin 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ại đó, hãy nhấp vào NOTEBOOK ĐƯỢC QUẢN LÝ:

Notebooks_UI

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

new_notebook

Đặt tên cho sổ tay rồi nhấp vào Cài đặt nâng cao.

create_notebook

Trong phần Cài đặt nâng cao, hãy bật tính năng tắt khi không hoạt động và đặt số phút thành 60. Điều này có nghĩa là máy tính xách tay của bạn sẽ tự động tắt khi không sử dụng để 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 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.

Sau khi tạo thực thể, hãy chọn Open JupyterLab (Mở JupyterLab).

open_jupyterlab

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

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 chuyển vào thư mục đó.

mkdir autopkg-codelab
cd autopkg-codelab

Trên Terminal, hãy chạy các lệnh sau để tạo thư mục cho mã huấn luyện và tệp Python mà bạn sẽ thêm mã vào:

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 và 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ã này:

  • CHECKPOINT là mô hình mà chúng ta muốn điều 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 và thêm một đầu phân loại ở trên cùng với trọng số được khởi tạo ngẫu nhiên. Trong trường hợp này, chúng tôi gặp vấn đề phân loại nhị phân (dương hoặc âm) nên chúng tôi 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 vùng chứa trên máy cục bộ. Việc chạy vùng chứa trên máy sẽ thực thi mã huấn luyện của bạn theo cách tương tự như cách mã 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 Bộ chứa trên 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 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ì không chỉ định phiên bản 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 vùng chứa tạo sẵn của Vertex AI Training.

Chạy lệnh sau để đặt URI của hình ảnh Docker 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 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 biến đổi và tập dữ liệu Hugging Face. 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 ở thư mục autopkg-codelab và nhập nội dung sau vào 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 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 quá trình 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 bằng 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ệptask.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:

local_training

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 để huỷ quá trình 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ể trực tiếp chạy 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 công việc tuỳ chỉnh

Giờ đây, 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. Chỉ 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 cửa sổ dòng lệnh và cd 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 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 tạo sẵn của Vertex AI Training mà chúng ta đặ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 trình chuyển đổi theo 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 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 cho việc 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ố 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 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 là 1.
  • executor-image-uri: URI của hình ảnh vùng chứa sẽ chạy gói được cung cấp. Hình ảnh này được đặt thành hình ảnh cơ sở.
  • local-package-path: Đường dẫn cục bộ của thư mục chứa mã đào tạo.
  • 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, sau đó công việc huấn luyện bắt đầu. Ngoại trừ thay vì 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 Đào tạo Vertex AI của bảng điều khiển trên đám mây và trong mục CÔNG VIỆC TUỲ CHỈNH, bạn sẽ thấy công việc của mình đang chạy.

training_job

Quá trình 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 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 để:

  • Đóng gói và chạy mã huấn luyện trên máy
  • 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 máy tính xách tay để 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 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á.

xóa

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

Xoá bộ nhớ