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 otomatik paketleme özelliğini kullanabilirsiniz. Bu özellik, kodunuza göre özel bir Docker görüntüsü oluşturur, görüntüyü Container Registry'ye aktarır ve görüntüye göre bir CustomJob başlatır.

Öğ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. Model, bir film incelemesinin olumlu mu yoksa olumsuz mu olduğunu tahmin eder. Veri kümesi Hugging Face veri kümeleri kitaplığından, Bert modeli ise Hugging Face dönüştürücüler kitaplığından indirilir.

3. Vertex AI'a giriş

Bu laboratuvarda, Google Cloud'da sunulan en yeni yapay zeka ürünü kullanılır. Vertex AI, Google Cloud'daki makine öğrenimi tekliflerini sorunsuz bir geliştirme deneyiminde birleştirir. Daha önce, AutoML ile eğitilen modellere ve özel modellere ayrı hizmetler üzerinden erişilebiliyordu. Yeni teklif, diğer yeni ürünlerle birlikte her ikisini de tek bir API'de birleştirir. Mevcut projeleri Vertex AI'a da taşıyabilirsiniz. Geri bildirimde bulunmak isterseniz lütfen destek sayfasını inceleyin.

Vertex AI, uçtan uca makine öğrenimi iş akışlarını desteklemek için birçok farklı ürün içerir. Bu laboratuvarda Eğitim ve Workbench'e odaklanacağız.

Vertex'e 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 projeniz olması gerekir. 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'unuzun Vertex AI bölümüne gidin ve Vertex AI API'yi etkinleştir'i 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 kapsayıcı oluşturmak üzere bu dosyayı kullanırsınız.

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

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

Vertex AI menüsü

Buradan YÖNETİLEN NOT DEfterleri'ni tıklayın:

Notebooks_UI

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

new_notebook

Not defterinize bir ad verin ve ardından 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, gereksiz maliyetlere maruz kalmamak için dizüstü bilgisayarınız kullanılmadığında otomatik olarak kapanır.

idle_timeout

Diğer tüm gelişmiş ayarları 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 kodu yazma

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

launcher_terminal

autopkg-codelab adlı yeni bir dizin oluşturun ve cd komutunu kullanarak bu dizine gidin.

mkdir autopkg-codelab
cd autopkg-codelab

Terminalinizde, eğitim kodu için bir dizin ve kodu ekleyeceğiniz bir Python dosyası oluşturmak üzere aşağıdakileri çalıştırın:

mkdir trainer
touch trainer/task.py

autopkg-codelab/ dizininde şu dosyalar bulunmalıdır:

+ trainer/
    + task.py

Ardından, yeni 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:

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

6. Eğitim kodunu yerel olarak kapsayıcıya alma ve çalıştırma

Eğitim kodunuzu temel alan 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 çalıştırılan bir kapsayıcı, eğitim kodunuzu Vertex AI Eğitim'de çalıştırılmasına benzer bir şekilde yürütür ve Vertex AI'da özel eğitim gerçekleştirmeden önce kodunuzdaki hata ayıklamanıza yardımcı olabilir.

Eğitim işimizde, eğitilen modelimizi bir Cloud Storage paketine aktaracağız. Projeniz için bir env değişkeni tanımlamak üzere Terminal'inizde aşağıdaki komutu çalıştırın. your-cloud-project yerine projenizin kimliğini yazın:

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 Eğitim kapsayıcısını kullanıyoruz.

Container'ın temeli olarak kullanılacak bir Docker görüntüsünün URI'sini ayarlamak için aşağıdakileri ç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 kodumuzda Hugging Face veri kümeleri ve dönüştürücü kitaplıkları kullanılır. Bu kitaplıklar, temel görüntü olarak seçtiğimiz görüntüye dahil edilmediğinden bunları şart olarak 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

autopkg-codelab dizininde şu dosyalar bulunmalıdır:

+ requirements.txt
+ trainer/
    + task.py

Şartlar dosyasını açıp aşağıdakileri yapıştırın

datasets==1.18.2
transformers==4.16.2

Son olarak, Workbench 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ılar pip ile yüklenir. 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 sürer. İş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 ç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 ettikten sonra, özel eğitim işimizi Vertex AI Eğitim'de 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 geri 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. Bu komut öncelikle 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 Vertex AI Eğitimi önceden oluşturulmuş kapsayıcısı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 göz atalı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 havuzu içeren özel bir iş oluşturmak üzere birden fazla çalışan havuzu özelliği belirtebilirsiniz. Bu örnekte, eğitim kodumuz dağıtık 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 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 bir kapsayıcı görüntüsünün URI'si. Bu, ana resmimiz olarak ayarlanır.
  • local-package-path: Eğitim kodu içeren bir klasörün yerel yolu.
  • python-module: Sağlanan paket içinde çalıştırılacak Python modülü adı.

Yerel komutu çalıştırdığınızda olduğu gibi, Docker resminin oluşturulduğunu ve ardından eğitim işinin başlatıldığını görürsünüz. Ancak eğitim işinin çıktısını görmek yerine, eğitim işinizin başlatıldığını doğrulayan 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örürsünüz.

model_output

🎉 Tebrikler. 🎉

Aşağıdakiler için Vertex AI'ı nasıl kullanacağınızı öğrendiniz:

  • Eğitim kodunu yerel olarak kapsayıcıya alma ve çalıştırma
  • Otomatik paketleme 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 dokümanlara göz atın.

8. Temizleme

Not defterini, 60 dakikalık işlem yapılmadığında zaman aşımı olacak şekilde yapılandırdığımız için örneği kapatma konusunda endişelenmenize gerek yoktur. Örneğini manuel olarak kapatmak istiyorsanız 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

Depolama paketini silmek için Cloud Console'daki Gezinme menüsünü kullanarak Depolama'ya gidin, paketinizi seçin ve Sil'i tıklayın:

Depolama alanını silme