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 paket otomatis. Tugas pelatihan kustom di container penggunaan Vertex AI. Jika tidak ingin membangun image sendiri, Anda dapat menggunakan auotpackaging yang akan membangun 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 meningkatkan kualitas model BERT di set data IMDB. Model ini 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 Huging 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 Training 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 MANAGED NOTEBOOKS:

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 Anda, jalankan perintah berikut guna membuat direktori untuk kode pelatihan dan file Python tempat Anda akan menambahkan kode:

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 sempurnakan. Dalam hal ini, kita menggunakan BERT.
  • Metode TFAutoModelForSequenceClassification akan memuat arsitektur model bahasa + bobot yang ditentukan di TensorFlow dan menambahkan kepala klasifikasi di atasnya dengan bobot yang diinisialisasi secara acak. Dalam hal ini, kita memiliki masalah klasifikasi biner (positif atau negatif) sehingga 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 sebagai container di mesin lokal. Menjalankan container secara lokal akan mengeksekusi kode pelatihan Anda dengan cara yang sama seperti yang berjalan pada Vertex AI Training, dan dapat membantu Anda men-debug masalah pada kode sebelum melakukan pelatihan kustom pada 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'

Lalu, buat bucket. Jika sudah memiliki bucket, Anda dapat menggunakannya.

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

Saat menjalankan tugas pelatihan kustom pada Pelatihan Vertex AI, 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, kami menggunakan container bawaan Pelatihan Vertex AI.

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 dibangun dengan perintah run lokal.

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

Kode pelatihan kami menggunakan set data dan library transformer Hugging Face. Library ini tidak disertakan dalam gambar yang telah dipilih sebagai image dasar, sehingga kita harus menyediakannya sebagai persyaratan. Untuk melakukannya, kita akan membuat file requirements.txt dalam direktori autopkg-codelab.

Pastikan Anda berada di direktori autopkg-codelab dan ketik berikut ini 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 berikut ini

datasets==1.18.2
transformers==4.16.2

Terakhir, jalankan perintah gcloud ai custom-jobs local-run untuk memulai pelatihan di instance terkelola Workbench kami.

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 dengan pip. Proses ini mungkin memerlukan waktu beberapa menit saat pertama kali Anda menjalankan perintah ini. Setelah image dibuat, file task.py akan mulai berjalan dan Anda akan melihat pelatihan model. Anda akan melihat sesuatu 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 tugas selesai.

Perhatikan bahwa jika ingin melakukan pengujian lebih lanjut, Anda juga dapat langsung menjalankan image yang dibangun 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 pada Pelatihan Vertex AI. 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 lakukan cd naik satu tingkat 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 ditetapkan sebagai BASE_GPU_IMAGE. Fitur pengemasan otomatis kemudian akan menginstal set data dan library transformer seperti yang ditentukan dalam file 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

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

Berikut adalah beberapa kolom utama spesifikasi ini:

  • machine-type (Wajib): Jenis mesin. Klik di sini untuk mengetahui jenis yang didukung.
  • replica-count: Jumlah replika pekerja yang akan digunakan untuk kumpulan pekerja ini, secara default nilainya adalah 1.
  • accelerator-type: Jenis GPU. Klik di sini untuk mengetahui jenis yang didukung. Dalam contoh ini, kami menentukan satu GPU NVIDIA Tesla V100.
  • accelerator-count: Jumlah GPU untuk setiap VM di kumpulan pekerja yang akan digunakan, secara default nilainya adalah 1.
  • executor-image-uri: URI image container yang akan menjalankan paket yang disediakan. Ini disetel ke image dasar.
  • 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 menjalankan perintah lokal, Anda akan melihat image Docker sedang dibangun, lalu tugas pelatihan dimulai. Kecuali 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 di-build dan dikirim.

training_started

Kembali ke bagian Vertex AI Training pada Cloud Console dan di bagian TUGAS KUSTOM, Anda akan melihat tugas Anda berjalan.

training_job

Tugas 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 Pelatihan Vertex AI dengan autopackaging

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