Vertex AI: Menggunakan autopackaging untuk meningkatkan kualitas BERT dengan Hugging Face di Vertex AI Training

1. Ringkasan

Di lab ini, Anda akan mempelajari cara menjalankan tugas pelatihan kustom di Vertex AI Training dengan fitur pengemasan otomatis. Tugas pelatihan kustom di Vertex AI menggunakan container. Jika tidak ingin membuat image sendiri, Anda dapat menggunakan pengemasan otomatis, yang akan membuat image Docker kustom berdasarkan kode Anda, mengirim image ke Container Registry, dan memulai CustomJob berdasarkan image tersebut.

Yang Anda pelajari

Anda akan mempelajari cara:

Total biaya untuk menjalankan lab ini di Google Cloud adalah sekitar $2.

2. Ringkasan Kasus Penggunaan

Dengan menggunakan library dari Hugging Face, Anda akan menyesuaikan model Bert pada set data IMDB. Model akan memprediksi apakah ulasan film itu positif atau negatif. Set data akan didownload dari library set data Hugging Face, dan model Bert dari library transformer Hugging Face.

3. Pengantar Vertex AI

Lab ini menggunakan penawaran produk AI terbaru yang tersedia di Google Cloud. Vertex AI mengintegrasikan penawaran ML di Google Cloud ke dalam pengalaman pengembangan yang lancar. Sebelumnya, model yang dilatih dengan AutoML dan model kustom dapat diakses melalui layanan terpisah. Penawaran baru ini menggabungkan kedua model ini menjadi satu API, beserta produk baru lainnya. Anda juga dapat memigrasikan project yang sudah ada ke Vertex AI. Jika Anda memiliki masukan, harap lihat halaman dukungan.

Vertex AI mencakup banyak produk yang berbeda untuk mendukung alur kerja ML secara menyeluruh. Lab ini akan berfokus pada Pelatihan dan Workbench.

Ringkasan produk Vertex

4. Menyiapkan lingkungan Anda

Anda memerlukan project Google Cloud Platform dengan penagihan yang diaktifkan untuk menjalankan codelab ini. Untuk membuat project, ikuti petunjuk di sini.

Langkah 1: Aktifkan Compute Engine API

Buka Compute Engine dan pilih Aktifkan jika belum diaktifkan.

Langkah 2: Aktifkan Vertex AI API

Buka bagian Vertex AI di Cloud Console Anda, lalu klik Aktifkan Vertex AI API.

Dasbor Vertex AI

Langkah 3: Aktifkan Container Registry API

Buka Container Registry dan pilih Aktifkan jika belum melakukannya. Anda akan menggunakannya untuk membuat container tugas pelatihan kustom.

Langkah 4: Buat instance Vertex AI Workbench

Dari bagian Vertex AI di Cloud Console Anda, klik Workbench:

Menu Vertex AI

Dari sana, klik NOTEBOOK TERKELOLA:

Notebooks_UI

Kemudian, pilih NOTEBOOK BARU.

new_notebook

Beri nama notebook Anda, lalu klik Setelan Lanjutan.

create_notebook

Di bagian Setelan Lanjutan, aktifkan penonaktifan tidak ada aktivitas dan setel jumlah menit ke 60. Artinya, notebook Anda akan otomatis dinonaktifkan saat tidak digunakan agar tidak menimbulkan biaya tambahan.

idle_timeout

Anda dapat membiarkan semua setelan lanjutan lainnya apa adanya.

Selanjutnya, klik Buat.

Setelah instance dibuat, pilih Buka JupyterLab.

open_jupyterlab

Saat pertama kali menggunakan instance baru, Anda akan diminta untuk mengautentikasi.

autentikasi

5. Menulis kode pelatihan

Untuk memulai, dari menu Peluncur, buka jendela Terminal di instance notebook Anda:

launcher_terminal

Buat direktori baru bernama autopkg-codelab dan cd ke dalamnya.

mkdir autopkg-codelab
cd autopkg-codelab

Dari Terminal, jalankan perintah berikut guna membuat direktori untuk kode pelatihan dan file Python tempat Anda akan menambahkan kodenya:

mkdir trainer
touch trainer/task.py

Sekarang Anda akan memiliki kode berikut di direktori autopkg-codelab/ Anda:

+ trainer/
    + task.py

Selanjutnya, buka file task.py yang baru saja Anda buat dan salin kode di bawah.

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()

Beberapa hal yang perlu diperhatikan tentang kode:

  • CHECKPOINT adalah model yang ingin kita sesuaikan. Dalam kasus ini, kita menggunakan Bert.
  • Metode TFAutoModelForSequenceClassification akan memuat arsitektur model bahasa + bobot yang ditentukan di TensorFlow dan menambahkan head klasifikasi di atas dengan bobot yang diinisialisasi secara acak. Dalam kasus ini, kita memiliki masalah klasifikasi biner (positif atau negatif), jadi kita menentukan num_labels=2 untuk pengklasifikasi ini.

6. Menyimpan data dalam container dan menjalankan kode pelatihan secara lokal

Anda dapat menggunakan perintah gcloud ai custom-jobs local-run untuk membangun image container Docker berdasarkan kode pelatihan dan menjalankan image tersebut sebagai container di komputer lokal. Menjalankan container secara lokal akan mengeksekusi kode pelatihan dengan cara yang sama seperti saat dijalankan di Vertex AI Training, dan dapat membantu Anda men-debug masalah pada kode sebelum melakukan pelatihan kustom di Vertex AI.

Dalam tugas pelatihan, kita akan mengekspor model terlatih ke Bucket Cloud Storage. Dari Terminal Anda, jalankan perintah berikut untuk menentukan variabel env untuk project Anda, pastikan untuk mengganti your-cloud-project dengan ID project Anda:

PROJECT_ID='your-cloud-project'

Kemudian, buat bucket. Jika Anda sudah memiliki bucket, silakan gunakan bucket tersebut.

BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME

Saat menjalankan tugas pelatihan kustom di Vertex AI Training, kita akan menggunakan GPU. Namun, karena kita tidak menentukan instance Workbench dengan GPU, kita akan menggunakan image berbasis CPU untuk pengujian lokal. Dalam contoh ini, kita menggunakan container bawaan Vertex AI Training.

Jalankan perintah berikut untuk menetapkan URI image Docker yang akan digunakan sebagai dasar container.

BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest

Kemudian, tetapkan nama untuk image Docker yang dihasilkan, yang dibuat oleh perintah run lokal.

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

Kode pelatihan kami menggunakan library dataset dan transformer Hugging Face. Library ini tidak disertakan dalam image yang telah kita pilih sebagai image dasar, jadi kita perlu menyediakannya sebagai persyaratan. Untuk melakukannya, kita akan membuat file requirements.txt di direktori autopkg-codelab.

Pastikan Anda berada di direktori autopkg-codelab dan ketik perintah berikut di terminal Anda.

touch requirements.txt

Sekarang Anda akan memiliki kode berikut di direktori autopkg-codelab Anda:

+ requirements.txt
+ trainer/
    + task.py

Buka file persyaratan dan tempelkan kode berikut

datasets==1.18.2
transformers==4.16.2

Terakhir, jalankan perintah gcloud ai custom-jobs local-run untuk memulai pelatihan di instance terkelola 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

Anda akan melihat image Docker sedang dibangun. Dependensi yang kita tambahkan ke file requirements.txt akan diinstal pip. Mungkin perlu waktu beberapa menit untuk menyelesaikan perintah ini pertama kali Anda menjalankannya. Setelah image dibuat, filetask.py akan mulai berjalan dan Anda akan melihat pelatihan model. Anda akan melihat yang seperti ini:

local_training

Karena kita tidak menggunakan GPU secara lokal, pelatihan model akan memakan waktu lama. Anda dapat menekan Ctrl+c dan membatalkan pelatihan lokal, bukan menunggu hingga tugas selesai.

Perhatikan bahwa jika Anda ingin melakukan pengujian lebih lanjut, Anda juga dapat menjalankan langsung image yang dibuat di atas, tanpa mengemas ulang.

gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1

7. Membuat tugas kustom

Setelah menguji mode lokal, kita akan menggunakan fitur pengemasan otomatis untuk meluncurkan tugas pelatihan kustom di Vertex AI Training. Dengan satu perintah, fitur ini akan:

  • Membangun image Docker kustom berdasarkan kode.
  • Mengirim image ke Container Registry.
  • Memulai CustomJob berdasarkan gambar.

Kembali ke terminal dan cd naik satu level di atas direktori autopkg-codelab Anda.

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

Tentukan image GPU TensorFlow bawaan Vertex AI Training sebagai image dasar untuk tugas pelatihan kustom.

BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest

Selanjutnya, jalankan perintah gcloud ai custom-jobs create. Pertama, perintah ini akan membangun image Docker kustom berdasarkan kode pelatihan. Image dasar adalah container bawaan Vertex AI Training yang kita tetapkan sebagai BASE_GPU_IMAGE. Kemudian, fitur pengemasan otomatis akan menginstal library set data dan transformer menggunakan pip seperti yang ditentukan dalam file requirements.txt kita.

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

Mari kita lihat argumen worker-pool-spec. Ini menentukan konfigurasi kumpulan pekerja yang digunakan oleh tugas kustom. Anda dapat menentukan beberapa spesifikasi kumpulan worker untuk membuat tugas kustom dengan beberapa kumpulan worker untuk pelatihan terdistribusi. Dalam contoh ini, kita hanya menentukan satu worker pool, karena kode pelatihan kita tidak dikonfigurasi untuk pelatihan terdistribusi.

Berikut beberapa kolom utama spesifikasi ini:

  • machine-type (Wajib): Jenis mesin. Klik di sini untuk mengetahui jenis yang didukung.
  • replica-count: Jumlah replika worker yang akan digunakan untuk kumpulan worker ini, secara default nilainya adalah 1.
  • accelerator-type: Jenis GPU. Klik di sini untuk mengetahui jenis yang didukung. Dalam contoh ini, kita menentukan satu GPU NVIDIA Tesla V100.
  • accelerator-count: Jumlah GPU yang akan digunakan setiap VM di pool pekerja, secara default nilainya adalah 1.
  • executor-image-uri: URI image container yang akan menjalankan paket yang disediakan. Ini ditetapkan ke gambar dasar kita.
  • local-package-path: Jalur lokal folder yang berisi kode pelatihan.
  • python-module: Nama modul Python yang akan dijalankan dalam paket yang disediakan.

Mirip dengan saat Anda menjalankan perintah lokal, Anda akan melihat image Docker sedang dibuat, lalu tugas pelatihan dimulai. Namun, alih-alih melihat output tugas pelatihan, Anda akan melihat pesan berikut yang mengonfirmasi bahwa tugas pelatihan Anda telah diluncurkan. Perhatikan bahwa saat pertama kali Anda menjalankan perintah custom-jobs create, mungkin perlu waktu beberapa menit hingga image dibuat dan dikirim.

training_started

Kembali ke bagian Vertex AI Training di konsol cloud dan di bagian CUSTOM JOBS, Anda akan melihat tugas Anda sedang berjalan.

training_job

Tugas ini akan memerlukan waktu sekitar 20 menit untuk diselesaikan.

Setelah selesai, Anda akan melihat artefak model tersimpan berikut di direktori model_output di bucket Anda.

model_output

🎉 Selamat! 🎉

Anda telah mempelajari cara menggunakan Vertex AI untuk:

  • Menyimpan data dalam container dan menjalankan kode pelatihan secara lokal
  • Mengirimkan tugas pelatihan ke Vertex AI Training dengan pemaketan otomatis

Untuk mempelajari lebih lanjut berbagai bagian Vertex AI, lihat dokumentasinya.

8. Pembersihan

Karena sebelumnya kita telah mengonfigurasi notebook agar kehabisan waktu setelah 60 menit tidak ada aktivitas, jangan khawatir untuk menonaktifkan instance-nya. Jika Anda ingin menonaktifkan instance secara manual, klik tombol Hentikan di bagian Vertex AI Workbench pada konsol. Jika Anda ingin menghapus notebook secara keseluruhan, klik tombol Hapus.

hapus

Untuk menghapus Bucket Penyimpanan menggunakan menu Navigasi di Cloud Console, jelajahi Penyimpanan, pilih bucket Anda, lalu klik Hapus:

Hapus penyimpanan