Vertex AI: Vertex AI Training'de, Bert'i Hugging Face ile hassas bir şekilde ayarlamak için otomatik paketleme özelliğini kullanın

1. Genel Bakış

Bu laboratuvarda, Vertex AI Training'de otomatik paketleme özelliğiyle özel bir eğitim işinin nasıl çalıştırılacağını öğreneceksiniz. Vertex AI'daki özel eğitim işleri, container'ları kullanır. Kendi görüntünüzü oluşturmak istemiyorsanız auotpackaging'i kullanabilirsiniz. Bu sayede kodunuza göre özel bir Docker görüntüsü oluşturabilir, görüntüyü Container Registry'ye aktarabilir ve görüntüye göre bir CustomJob başlatabilirsiniz.

Öğrenecekleriniz

Öğrenecekleriniz:

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 2 ABD dolarıdır.

2. Kullanım Alanına Genel Bakış

Hugging Face kitaplıklarını kullanarak IMDB veri kümesi üzerinde bir Bert modelinde ince ayar yapabilirsiniz. Bu model bir film incelemesinin olumlu mu yoksa olumsuz mu olduğunu tahmin eder. Veri kümesi, Hugging Face veri kümesi kitaplığından ve Bert modeli Hugging Face dönüştürücüler kitaplığından indirilir.

3. Vertex AI'a giriş

Bu laboratuvarda, Google Cloud'daki en yeni AI ürün teklifi kullanılmaktadır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyimiyle entegre eder. Önceden, AutoML ve özel modellerle eğitilen modellere ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, her ikisi de tek bir API'de ve diğer yeni ürünlerle birleştirilir. Dilerseniz mevcut projeleri Vertex AI'a taşıyabilirsiniz. Geri bildiriminiz varsa lütfen destek sayfasını inceleyin.

Vertex AI, uçtan uca makine öğrenimi iş akışlarını destekleyen birçok farklı ürün içerir. Bu laboratuvar, Eğitim ve Çalışma Alanı konularına odaklanacaktır.

Vertex ürününe genel bakış

4. Ortamınızı ayarlama

Bu codelab'i çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projesine ihtiyacınız var. Proje oluşturmak için buradaki talimatları uygulayın.

1. Adım: Compute Engine API'yi etkinleştirin

Compute Engine'e gidin ve zaten etkinleştirilmemişse Etkinleştir'i seçin.

2. adım: Vertex AI API'yi etkinleştirin

Cloud Console'un Vertex AI bölümüne gidip Enable Vertex AI API'yi (Vertex AI API'yi etkinleştir) tıklayın.

Vertex AI kontrol paneli

3. Adım: Container Registry API'yi etkinleştirin

Container Registry'ye gidin ve henüz yapmadıysanız Etkinleştir'i seçin. Özel eğitim işiniz için bir container oluşturmak üzere bunu kullanacaksınız.

4. Adım: Vertex AI Workbench örneği oluşturun

Cloud Console'un Vertex AI bölümünde Workbench'i tıklayın:

Vertex AI menüsü

Burada, YÖNETİLEN NOT KİTAPLARI'nı tıklayın:

Notebooks_UI

Ardından YENİ NOT DEFTERİ'ni seçin.

new_notebook

Not defterinize bir ad verin ve Gelişmiş Ayarlar'ı tıklayın.

create_notebook

Gelişmiş Ayarlar altından boşta kalma özelliğini etkinleştirin ve dakika sayısını 60 olarak ayarlayın. Bu sayede not defteriniz kullanılmadığında otomatik olarak kapatılır, böylece gereksiz maliyetlere neden olmazsınız.

idle_timeout

Diğer gelişmiş ayarların tümünü olduğu gibi bırakabilirsiniz.

Ardından Oluştur'u tıklayın.

Örnek oluşturulduktan sonra JupyterLab'i aç'ı seçin.

open_jupyterlab

Yeni bir örneği ilk kez kullandığınızda kimliğinizi doğrulamanız istenir.

kimlik doğrulamak

5. Eğitim kodunu yazma

Başlatıcı menüsünden başlamak için not defteri örneğinizde bir Terminal penceresi açın:

launcher_terminal

autopkg-codelab adında yeni bir dizin oluşturun ve cd'ye yapıştırın.

mkdir autopkg-codelab
cd autopkg-codelab

Terminal'inizden aşağıdaki komutu çalıştırarak eğitim kodu için bir dizin ve kodu ekleyeceğiniz Python dosyası oluşturun:

mkdir trainer
touch trainer/task.py

Artık autopkg-codelab/ dizininizde aşağıdakilerin olması gerekir:

+ trainer/
    + task.py

Sonra, az önce oluşturduğunuz task.py dosyasını açın ve aşağıdaki kodu kopyalayın.

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

Kodla ilgili dikkat edilmesi gereken birkaç nokta:

  • İnce ayar yapmak istediğimiz model CHECKPOINT. Bu örnekte Bert'i kullanıyoruz.
  • TFAutoModelForSequenceClassification yöntemi, TensorFlow'da belirtilen dil modeli mimarisini ve ağırlıkları yükler ve rastgele başlatılmış ağırlıkların üzerine bir sınıflandırma başlığı ekler. Bu örnekte, ikili bir sınıflandırma sorunumuz (pozitif veya negatif) olduğundan bu sınıflandırıcı için num_labels=2 değerini belirtiyoruz.

6. Eğitim kodunu yerel olarak container mimarisine alın ve çalıştırın

Eğitim kodunuza göre bir Docker container görüntüsü oluşturmak ve görüntüyü yerel makinenizde container olarak çalıştırmak için gcloud ai custom-jobs local-run komutunu kullanabilirsiniz. Yerel olarak container çalıştırmak, eğitim kodunuzu Vertex AI Training'deki çalıştırmaya benzer şekilde yürütür ve Vertex AI'da özel eğitim gerçekleştirmeden önce kodla ilgili sorunları gidermenize yardımcı olabilir.

Eğitim işimizde, eğitilen modelimizi bir Cloud Storage Paketine aktaracağız. Terminalinizde projeniz için bir env değişkeni tanımlamak üzere aşağıdaki komutu çalıştırın. your-cloud-project kısmına projenizin kimliğini girdiğinizden emin olun:

PROJECT_ID='your-cloud-project'

Ardından bir paket oluşturun. Mevcut bir paketiniz varsa bunun yerine onu kullanabilirsiniz.

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

Vertex AI Training'de özel eğitim işini çalıştırdığımızda GPU'dan yararlanırız. Ancak Workbench örneğimizi GPU'lu olarak belirtmediğimizden yerel test için CPU tabanlı bir görüntü kullanacağız. Bu örnekte, önceden oluşturulmuş bir Vertex AI Training container'ı kullanıyoruz.

Container'ın temeli olarak kullanılacak Docker görüntüsünün URI'sini ayarlamak için aşağıdaki komutu çalıştırın.

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

Ardından, yerel çalıştırma komutuyla derlenen Docker görüntüsü için bir ad belirleyin.

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

Eğitim kodumuz Hugging Face veri kümelerini ve dönüştürücü kitaplıklarını kullanır. Bu kitaplıklar, temel görüntümüz olarak seçtiğimiz resimde yer almadığından bunları sağlamamız gerekir. Bunun için, autopkg-codelab dizinimizde bir requirements.txt dosyası oluşturacağız.

autopkg-codelab dizininde olduğunuzdan emin olun ve terminalinize aşağıdakileri yazın.

touch requirements.txt

Artık autopkg-codelab dizininizde aşağıdakilerin olması gerekir:

+ requirements.txt
+ trainer/
    + task.py

Koşullar dosyasını açın ve aşağıdakini yapıştırın

datasets==1.18.2
transformers==4.16.2

Son olarak, Workbench tarafından yönetilen örneğimizde eğitimi başlatmak için gcloud ai custom-jobs local-run komutunu yürütün.

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

Docker görüntüsünün oluşturulmakta olduğunu göreceksiniz. requirements.txt dosyasına eklediğimiz bağımlılıklar pip yüklenecek. Bu komutu ilk kez çalıştırdığınızda işlemin tamamlanması birkaç dakika sürebilir. Görüntü oluşturulduğunda task.py dosyası çalışmaya başlar ve model eğitimi gösterilir. Aşağıdakine benzer bir tablo görürsünüz:

local_training

Yerel olarak GPU kullanmadığımız için model eğitimi uzun zaman alacak. İşin tamamlanmasını beklemek yerine Ctrl+c tuşlarına basarak yerel eğitimi iptal edebilirsiniz.

Daha fazla test yapmak isterseniz yukarıda oluşturulan görüntüyü yeniden paketlemeden doğrudan da çalıştırabileceğinizi unutmayın.

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

7. Özel iş oluşturma

Yerel modu test ettiğimize göre Vertex AI Training'de özel eğitim işimizi başlatmak için otomatik paketleme özelliğini kullanacağız. Bu özellik, tek bir komutla şunları yapar:

  • Kodunuza dayalı özel bir Docker görüntüsü oluşturun.
  • Görüntüyü Container Registry'ye aktarın.
  • Resme dayalı bir CustomJob başlatın.

Terminale dönün ve autopkg-codelab dizininizin bir seviye üzerinde cd'yi kullanın.

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

Özel eğitim işinin temel görüntüsü olarak önceden oluşturulmuş TensorFlow GPU görüntüsünü belirtin.

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

Ardından gcloud ai custom-jobs create komutunu yürütün. İlk olarak, bu komut eğitim koduna göre özel bir Docker görüntüsü oluşturur. Temel görüntü, BASE_GPU_IMAGE olarak ayarladığımız önceden oluşturulmuş Vertex AI Training container'ıdır. Ardından otomatik paketleme özelliği, requirements.txt dosyamızda belirtilen veri kümelerini ve dönüştürücü kitaplıklarını pip yükler.

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

worker-pool-spec bağımsız değişkenine bakalım. Bu, özel iş tarafından kullanılan çalışan havuzu yapılandırmasını tanımlar. Dağıtılmış eğitim için birden fazla çalışan havuzuna sahip özel bir iş oluşturmak istiyorsanız birden fazla çalışan havuzu özelliği belirtebilirsiniz. Bu örnekte, eğitim kodumuz dağıtılmış eğitim için yapılandırılmadığından yalnızca tek bir çalışan havuzu belirtiyoruz.

Bu spesifikasyonun önemli alanlarından bazıları şunlardır:

  • machine-type (Zorunlu): Makinenin türü. Desteklenen türler için burayı tıklayın.
  • replica-count: Bu çalışan havuzu için kullanılacak çalışan replikalarının sayısı (varsayılan olarak değer 1'dir).
  • accelerator-type: GPU'ların türü. Desteklenen türler için burayı tıklayın. Bu örnekte bir NVIDIA Tesla V100 GPU belirttik.
  • accelerator-count: Çalışan havuzunda kullanılacak her sanal makine için GPU sayısı. Varsayılan değer 1'dir.
  • executor-image-uri: Sağlanan paketi çalıştıracak container görüntüsünün URI'sı. Bu, temel resmimiz olarak ayarlanmıştır.
  • local-package-path: Eğitim kodunu içeren bir klasörün yerel yolu.
  • python-module: Sağlanan paket içinde çalıştırılacak Python modülü adı.

Yerel komut çalıştırmanıza benzer şekilde, Docker görüntüsünün oluşturulduğunu ve eğitim işinin başladığını görürsünüz. Eğitim işinin çıkışını görmek yerine eğitim işinizin başlatıldığını onaylayan aşağıdaki mesajı görürsünüz. custom-jobs create komutunu ilk kez çalıştırdığınızda, görüntünün oluşturulmasının ve aktarılmasının birkaç dakika sürebileceğini unutmayın.

training_started

Cloud Console'un Vertex AI Eğitimi bölümüne dönün. ÖZEL İŞLER bölümünde işinizin çalıştığını görebilirsiniz.

training_job

İşin tamamlanması yaklaşık 20 dakika sürer.

İşlem tamamlandığında, paketinizdeki model_output dizininde aşağıdaki kayıtlı model yapılarını göreceksiniz.

model_output

🎉 Tebrikler! 🎉

Vertex AI'ı kullanarak şunları öğrendiniz:

  • Eğitim kodunu yerel olarak container mimarisine alın ve çalıştırın
  • Autopackaging ile eğitim işlerini Vertex AI Training'e gönderme

Vertex AI'ın farklı bölümleri hakkında daha fazla bilgi edinmek için belgeleri inceleyin.

8. Temizleme

Not defterini 60 dakika boşta kalma dakikasının sonunda zaman aşımına uğrayacak şekilde yapılandırdığımızdan örneği kapatma konusunda endişelenmemize gerek yoktur. Örneği manuel olarak kapatmak isterseniz konsolun Vertex AI Workbench bölümündeki Durdur düğmesini tıklayın. Not defterini tamamen silmek isterseniz Sil düğmesini tıklayın.

delete

Storage Paketini silmek için Cloud Console'unuzdaki gezinme menüsünü kullanarak Storage'a gidin, paketinizi seçin ve Sil'i tıklayın:

Depolama alanını sil