Vertex AI: Dağıtılmış hiperparametre ayarı

1. Genel Bakış

Bu laboratuvarda, hiper parametre ayarı ve dağıtık eğitim için Vertex AI'ı nasıl kullanacağınızı öğreneceksiniz. Bu laboratuvar, model kodu için TensorFlow'u kullansa da bu kavramlar diğer makine öğrenimi çerçeveleri için de geçerlidir.

Öğrenecekleriniz

Öğrenecekleriniz:

  • Özel bir container'da dağıtılmış eğitimden yararlanarak bir model eğitme
  • Otomatik hiperparametre ayarı için eğitim kodunuzun birden fazla denemesini başlatma

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

2. 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 deneyiminde birleştirir. Önceden, AutoML ve özel modellerle eğitilen 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 laboratuvar Eğitim ve Workbench konularına odaklanmaktadır.

Vertex'e genel bakış

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

Bu laboratuvarda, TensorFlow Veri Kümeleri'ndeki horses or humans veri kümesinde eğitilen bir görüntü sınıflandırma modeli için en uygun parametreleri bulmak üzere hiper parametre ayarlamayı kullanacaksınız.

Hiperparametre ayarı

Vertex AI Eğitim ile hiperparametre ayarlama, seçtiğiniz hiperparametrelerin değerlerini belirttiğiniz sınırlar dahilinde ayarlayarak eğitim uygulamanızın birden fazla denemesini çalıştırarak çalışır. Vertex AI, her denemenin sonuçlarını izler ve sonraki denemeler için ayarlamalar yapar.

Hiperparametre ayarlama özelliğini Vertex AI Eğitimi ile kullanmak için eğitim kodunuzda iki değişiklik yapmanız gerekir:

  1. Ana eğitim modülünüzde, ayarlamak istediğiniz her hiperparametre için bir komut satırı bağımsız değişkeni tanımlayın.
  2. Uygulamanızın kodunda ilgili hiperparametreyi ayarlamak için bu bağımsız değişkenlerde iletilen değeri kullanın.

Dağıtılmış Eğitim

Tek bir GPU'nuz varsa TensorFlow, model eğitimini hızlandırmak için bu hızlandırıcıyı kullanır ve sizden ek bir işlem yapmanızı gerektirmez. Ancak birden fazla GPU kullanarak ek bir artış elde etmek istiyorsanız TensorFlow'un birden fazla cihazda hesaplama çalıştırma modülü olan tf.distribute'ü kullanmanız gerekir.

Bu laboratuvarda, yalnızca birkaç kod değişikliğiyle eğitim uygulamalarınıza ekleyebileceğiniz tf.distribute.MirroredStrategy kullanılır. Bu strateji, makinenizdeki her GPU'da modelin bir kopyasını oluşturur. Sonraki gradyan güncellemeleri eşzamanlı bir şekilde gerçekleşir. Bu, her GPU'nun modelde ileri ve geri geçişleri giriş verilerinin farklı bir diliminde hesapladığı anlamına gelir. Bu dilimlerin her birinden hesaplanan renk geçişleri, daha sonra tüm GPU'lar genelinde toplanır ve tüm azaltma adı verilen bir işlemin ortalaması alınır. Model parametreleri, bu ortalama gradyanlar kullanılarak güncellenir.

Bu laboratuvarı tamamlamak için ayrıntıları bilmeniz gerekmez ancak dağıtık eğitimin TensorFlow'da işleyiş şekli hakkında daha fazla bilgi edinmek istiyorsanız aşağıdaki videoya göz atın:

4. Ortamınızı ayarlama

Bu kod laboratuvarını çalıştırmak için faturalandırmanın etkin olduğu bir Google Cloud Platform projeniz olmalıdır. Proje oluşturmak için buradaki talimatları uygulayın.

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

Compute Engine'a gidin ve etkin değilse Etkinleştir'i seçin.

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

Kapsayıcı Kaydı'na gidin ve henüz etkinleştirilmediyse Etkinleştir'i seçin. Özel eğitim işiniz için bir container oluşturmak üzere bunu kullanacaksınız.

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

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ü

Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.

Notebook_api

Etkinleştirdikten sonra 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 ardından Gelişmiş Ayarlar'ı tıklayın.

create_notebook

Gelişmiş ayarlar bölümünde, boştayken kapatma ö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

Güvenlik bölümünde, terminal henüz etkinleştirilmediyse "Terminali etkinleştir"i seçin.

enable-terminal

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

Ardından Oluştur'u tıklayın. Örneğin temel hazırlığının yapılması birkaç dakika sürer.

Ö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. Bu işlemi yapmak için kullanıcı arayüzündeki adımları uygulayın.

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

vertex-codelab adında yeni bir dizin oluşturun ve cd'ye ekleyin.

mkdir vertex-codelab
cd vertex-codelab

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

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

+ trainer/
    + task.py

Sonra, az önce oluşturduğunuz task.py dosyasını açın ve aşağıdaki kodun tamamını yapıştırın.

import tensorflow as tf
import tensorflow_datasets as tfds
import argparse
import hypertune
import os

NUM_EPOCHS = 10
BATCH_SIZE = 64

def get_args():
  '''Parses args. Must include all hyperparameters you want to tune.'''

  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--learning_rate',
      required=True,
      type=float,
      help='learning rate')
  parser.add_argument(
      '--momentum',
      required=True,
      type=float,
      help='SGD momentum value')
  parser.add_argument(
      '--num_units',
      required=True,
      type=int,
      help='number of units in last hidden layer')
  args = parser.parse_args()
  return args


def preprocess_data(image, label):
  '''Resizes and scales images.'''

  image = tf.image.resize(image, (150,150))
  return tf.cast(image, tf.float32) / 255., label


def create_dataset(batch_size):
  '''Loads Horses Or Humans dataset and preprocesses data.'''

  data, info = tfds.load(name='horses_or_humans', as_supervised=True, with_info=True)

  # Create train dataset
  train_data = data['train'].map(preprocess_data)
  train_data  = train_data.shuffle(1000)
  train_data  = train_data.batch(batch_size)

  # Create validation dataset
  validation_data = data['test'].map(preprocess_data)
  validation_data  = validation_data.batch(batch_size)

  return train_data, validation_data


def create_model(num_units, learning_rate, momentum):
  '''Defines and compiles model.'''

  inputs = tf.keras.Input(shape=(150, 150, 3))
  x = tf.keras.layers.Conv2D(16, (3, 3), activation='relu')(inputs)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Conv2D(32, (3, 3), activation='relu')(x)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Conv2D(64, (3, 3), activation='relu')(x)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Flatten()(x)
  x = tf.keras.layers.Dense(num_units, activation='relu')(x)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)
  model = tf.keras.Model(inputs, outputs)
  model.compile(
      loss='binary_crossentropy',
      optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
      metrics=['accuracy'])
  return model


def main():
  args = get_args()

  # Create distribution strategy
  strategy = tf.distribute.MirroredStrategy()

  # Get data
  GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
  train_data, validation_data = create_dataset(GLOBAL_BATCH_SIZE)

  # Wrap variable creation within strategy scope
  with strategy.scope():
    model = create_model(args.num_units, args.learning_rate, args.momentum)

  # Train model
  history = model.fit(train_data, epochs=NUM_EPOCHS, validation_data=validation_data)

  # Define metric
  hp_metric = history.history['val_accuracy'][-1]

  hpt = hypertune.HyperTune()
  hpt.report_hyperparameter_tuning_metric(
      hyperparameter_metric_tag='accuracy',
      metric_value=hp_metric,
      global_step=NUM_EPOCHS)


if __name__ == "__main__":
    main()

Kodu daha ayrıntılı bir şekilde inceleyip dağıtık eğitime ve hiperparametre ayarlamaya özgü bileşenleri inceleyelim.

Dağıtılmış Eğitim

  1. main() işlevinde MirroredStrategy nesnesi oluşturulur. Ardından, model değişkenlerinizin oluşturulmasını stratejinin kapsamına alırsınız. Bu adım, TensorFlow'a GPU'lar arasında hangi değişkenlerin yansıtılması gerektiğini söyler.
  2. Grup boyutu num_replicas_in_sync oranında artırılır. TensorFlow'da senkron veri paralelliği stratejileri kullanırken grup boyutunu ölçeklendirmek en iyi uygulamadır. Daha fazla bilgiyi buradan edinebilirsiniz.

Hiperparametre ayarı

  1. Komut dosyası, hypertune kitaplığını içe aktarır. Daha sonra, kapsayıcı görüntüsünü oluştururken bu kitaplığı yüklediğimizden emin olmamız gerekir.
  2. get_args() işlevi, ayarlamak istediğiniz her hiperparametre için bir komut satırı bağımsız değişkeni tanımlar. Bu örnekte, ayarlanacak hiper parametreler öğrenme hızı, optimizatördeki momentum değeri ve modelin son gizli katmanındaki birim sayısıdır ancak başkalarını denemekten çekinmeyin. Bu bağımsız değişkenlerde iletilen değer daha sonra kodda ilgili hiperparametreyi ayarlamak için kullanılır (ör. learning_rate = args.learning_rate ayarlanır).
  3. main() işlevinin sonunda, optimize etmek istediğiniz metriği tanımlamak için hypertune kitaplığı kullanılır. TensorFlow'da Keras model.fit yöntemi bir History nesnesi döndürür. History.history özelliği, ardışık dönemlerdeki eğitim kaybı değerlerinin ve metrik değerlerinin kaydıdır. Doğrulama verilerini model.fit hizmetine iletirseniz History.history özelliği, doğrulama kaybı ve metrik değerlerini de içerir. Örneğin, bir modeli doğrulama verileriyle üç dönem boyunca eğittiyseniz ve metrik olarak accuracy sağladıysanız History.history özelliği aşağıdaki sözlüğe benzer şekilde görünür.
{
 "accuracy": [
   0.7795261740684509,
   0.9471358060836792,
   0.9870933294296265
 ],
 "loss": [
   0.6340447664260864,
   0.16712145507335663,
   0.04546636343002319
 ],
 "val_accuracy": [
   0.3795261740684509,
   0.4471358060836792,
   0.4870933294296265
 ],
 "val_loss": [
   2.044623374938965,
   4.100203514099121,
   3.0728273391723633
 ]

Hiperparametre ayarlama hizmetinin, modelin doğrulama doğruluğunu en üst düzeye çıkaran değerleri keşfetmesini istiyorsanız metriği val_accuracy listesinin son girişi (veya NUM_EPOCS - 1) olarak tanımlarsınız. Ardından, bu metriği bir HyperTune örneğine iletin. hyperparameter_metric_tag için istediğiniz dizeyi seçebilirsiniz ancak hiperparametre ayarlama işini başlattığınızda bu dizeyi tekrar kullanmanız gerekir.

6. Kodu container mimarisine alma

Kodunuzu container mimarisine almanın ilk adımı bir Dockerfile oluşturmaktır. Dockerfile'a görüntüyü çalıştırmak için gereken tüm komutları eklersiniz. Gerekli tüm kitaplıklar yüklenir ve eğitim kodunun giriş noktası ayarlanır.

1. adım: Dockerfile'i yazın

Terminal'inizden vertex-codelab dizininde olduğunuzdan emin olun ve boş bir Dockerfile oluşturun:

touch Dockerfile

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

+ Dockerfile
+ trainer/
    + task.py

Dockerfile'ı açın ve aşağıdakini bu dosyaya kopyalayın:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-7

WORKDIR /

# Installs hypertune library
RUN pip install cloudml-hypertune

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]

Bu Dockerfile, Deep Learning Container TensorFlow Enterprise 2.7 GPU Docker görüntüsünü kullanır. Google Cloud'daki Deep Learning Container'ları, birçok yaygın ML ve veri bilimi çerçevesiyle önceden yüklenmiş olarak gelir. Bu Dockerfile, görüntüyü indirdikten sonra eğitim kodunun giriş noktasını ayarlar.

2. Adım: Container'ı oluşturun

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'

Google Container Registry'deki kapsayıcı görüntünüzün URI'sıyla bir değişken tanımlayın:

IMAGE_URI="gcr.io/$PROJECT_ID/horse-human-codelab:latest"

Docker'ı yapılandırma

gcloud auth configure-docker

Ardından, vertex-codelab dizininizin kökünden aşağıdakileri çalıştırarak kapsayıcıyı derleyin:

docker build ./ -t $IMAGE_URI

Son olarak, dosyayı Google Container Registry'ye aktarın:

docker push $IMAGE_URI

3. Adım: Cloud Storage paketi oluşturun

Eğitim işimizde yolu bir hazırlık paketine aktaracağız.

Projenizde yeni bir paket oluşturmak için Terminal'de aşağıdakileri çalıştırın.

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

7. Hiperparametre ayarlama işini başlatma

1. Adım: Hiperparametre ayarı ile özel eğitim işi oluşturun

Başlatıcıdan yeni bir TensorFlow 2 not defteri açın.

new_notebook

Vertex AI Python SDK'yı içe aktarın.

from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt

Hiperparametre ayarlama işini başlatmak için önce makine türünü ve Docker resmini belirten worker_pool_specs değerini tanımlamanız gerekir. Aşağıdaki spesifikasyonda iki NVIDIA Tesla V100 GPU'ya sahip bir makine tanımlanmaktadır.

image_uri içindeki {PROJECT_ID} değerini projenizle değiştirmeniz gerekir.

# The spec of the worker pools including machine type and Docker image
# Be sure to replace PROJECT_ID in the "image_uri" with your project.

worker_pool_specs = [{
    "machine_spec": {
        "machine_type": "n1-standard-4",
        "accelerator_type": "NVIDIA_TESLA_V100",
        "accelerator_count": 2
    },
    "replica_count": 1,
    "container_spec": {
        "image_uri": "gcr.io/{PROJECT_ID}/horse-human-codelab:latest"
    }
}]

Ardından, optimize etmek istediğiniz parametreleri belirten bir sözlük olan parameter_spec değerini tanımlayın. Sözlük anahtarı, her hiper parametre için komut satırı bağımsız değişkenine atadığınız dizedir ve sözlük değeri, parametre spesifikasyonudur.

Her hiper parametre için, türünün yanı sıra ayarlama hizmetinin deneyeceği değerlerin sınırlarını tanımlamanız gerekir. Hiperparametreler; çift, tam sayı, kategorik veya ayrık türde olabilir. Çift veya Tam Sayı türünü seçerseniz minimum ve maksimum bir değer sağlamanız gerekir. Kategorik veya Ayrık'ı seçerseniz değerleri sağlamanız gerekir. Çift ve tam sayı türleri için ölçeklendirme değerini de sağlamanız gerekir. En iyi ölçeği nasıl seçeceğiniz hakkında daha fazla bilgiyi bu videoda bulabilirsiniz.

# Dictionary representing parameters to optimize.
# The dictionary key is the parameter_id, which is passed into your training
# job as a command line argument,
# And the dictionary value is the parameter specification of the metric.
parameter_spec = {
    "learning_rate": hpt.DoubleParameterSpec(min=0.001, max=1, scale="log"),
    "momentum": hpt.DoubleParameterSpec(min=0, max=1, scale="linear"),
    "num_units": hpt.DiscreteParameterSpec(values=[64, 128, 512], scale=None)
}

Tanımlanacak son özellik, optimize edilecek metriği temsil eden bir sözlük olan metric_spec'dir. Sözlük anahtarı, eğitim uygulama kodunuzda ayarladığınız hyperparameter_metric_tag değeridir ve değer, optimizasyon hedefidir.

# Dicionary representing metrics to optimize.
# The dictionary key is the metric_id, which is reported by your training job,
# And the dictionary value is the optimization goal of the metric.
metric_spec={'accuracy':'maximize'}

Spesifikasyonlar tanımlandıktan sonra, hiperparametre ayarlama denemelerinin her birinde işinizi çalıştırmak için kullanılacak ortak spesifikasyon olan bir CustomJob oluşturursunuz.

{YOUR_BUCKET} öğesini daha önce oluşturduğunuz paketle değiştirmeniz gerekir.

# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='horses-humans',
                              worker_pool_specs=worker_pool_specs,
                              staging_bucket='gs://{YOUR_BUCKET}')

Ardından, HyperparameterTuningJob oluşturup çalıştırın.

hp_job = aiplatform.HyperparameterTuningJob(
    display_name='horses-humans',
    custom_job=my_custom_job,
    metric_spec=metric_spec,
    parameter_spec=parameter_spec,
    max_trial_count=6,
    parallel_trial_count=2,
    search_algorithm=None)

hp_job.run()

Göz önünde bulundurulması gereken birkaç bağımsız değişken vardır:

  • max_trial_count: Hizmetin çalıştıracağı denemelerin sayısına üst sınır koymanız gerekir. Daha fazla deneme genellikle daha iyi sonuçlara yol açar ancak bir noktadan sonra ek denemelerin optimizasyon yapmaya çalıştığınız metrik üzerinde çok az etkisi olur veya hiç etkisi olmaz. Ölçeği artırmadan önce daha az sayıda denemeyle başlamak ve seçtiğiniz hiperparametrelerin ne kadar etkili olduğunu anlamak en iyi uygulamadır.
  • paralel_trial_count: Paralel denemeleri kullanırsanız hizmet, birden fazla eğitim işleme kümesi sağlar. Paralel denemelerin sayısını artırmak, hiper parametre ayarlama işinin çalışması için gereken süreyi azaltır ancak işin genel etkinliğini azaltabilir. Bunun nedeni, varsayılan ayarlama stratejisinin sonraki denemelerde değer ataması yaparken önceki denemelerin sonuçlarını kullanmasıdır.
  • search_algorithm: Arama algoritmasını ızgara, rastgele veya varsayılan (Yok) olarak ayarlayabilirsiniz. Varsayılan seçenek, olası hiperparametre değerlerinin alanını aramak için Bayes optimizasyonu uygular ve önerilen algoritmadır. Bu algoritma hakkında daha fazla bilgiyi burada bulabilirsiniz.

İş başladıktan sonra durumu, kullanıcı arayüzündeki HİPERPARAMETRE AYARI İŞLERİ sekmesinde takip edebilirsiniz.

HP_job

İş tamamlandıktan sonra, hiperparametre değerlerinin en iyi kombinasyonunu keşfetmek için denemelerinizin sonuçlarını görüntüleyebilir ve sıralayabilirsiniz.

HP_results

🎉 Tebrikler. 🎉

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

  • Dağıtılmış eğitimle hiperparametre ayarı işi çalıştırma

Vertex AI'ın farklı bölümleri hakkında daha fazla bilgi edinmek için belgelere 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 istiyorsanız 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