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 Pelatihan Vertex AI dengan fitur pembuatan paket otomatis. Tugas pelatihan kustom pada container penggunaan Vertex AI. Jika tidak ingin mem-build image sendiri, Anda dapat menggunakan pengemasan otomatis, yang akan mem-build 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 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 untuk 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 ini:

  • CHECKPOINT adalah model yang ingin kita sesuaikan. Dalam hal ini, kita menggunakan Bert.
  • Metode TFAutoModelForSequenceClassification akan memuat arsitektur model bahasa + bobot yang ditentukan di TensorFlow dan menambahkan head 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 mem-build 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 berjalan di Pelatihan Vertex AI, 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 sudah memiliki bucket, Anda dapat menggunakannya.

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, 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 dibuat oleh perintah run lokal.

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

Kode pelatihan kami menggunakan set data Hugging Face dan library transformer. 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 di direktori autopkg-codelab.

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

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 memerlukan 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 dibuat di atas, tanpa memaketkan 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 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 mem-build image Docker kustom berdasarkan kode pelatihan. Image dasar adalah container bawaan Vertex AI Training yang kita tetapkan 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. 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 satu kumpulan pekerja, karena kode pelatihan 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 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 yang akan digunakan oleh setiap VM di kumpulan pekerja, secara default nilainya adalah 1.
  • executor-image-uri: URI image container yang akan menjalankan paket yang disediakan. Ini ditetapkan ke image dasar kita.
  • local-package-path: Jalur lokal folder yang berisi kode pelatihan.
  • python-module: Nama modul Python yang akan dijalankan dalam paket yang disediakan.

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

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