Vertex AI: Hiperparametre Ayarı

1. Genel Bakış

Bu laboratuvarda, TensorFlow modeli için hiperparametre ayarı işi çalıştırmak amacıyla Vertex AI'ı kullanacaksınız. 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:

  • Otomatik hiperparametre ayarı için eğitim uygulama kodunu değiştirme
  • Vertex AI kullanıcı arayüzünden hiperparametre ayarı işi yapılandırma ve başlatma
  • Vertex AI Python SDK ile hiperparametre ayarı işi yapılandırma ve başlatma

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık $3 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 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 laboratuvarda, aşağıda vurgulanan ürünlere odaklanılmaktadır: training ve Workbench.

Vertex ürününe genel bakış

3. 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. Not defteri örneğinizi oluşturmak için buna ihtiyacınız olacaktır.

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

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

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ü

Henüz etkinleştirilmemişse 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 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

Güvenlik bölümünde "Terminali etkinleştir"i seçin Etkin değilse.

enable_terminal

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

4. Eğitim uygulaması kodunu container mimarisine alın

Bu laboratuvarda eğiteceğiniz ve ince ayarlayacağınız model, TensorFlow Veri Kümeleri'nden atlar veya insanlar veri kümesi üzerinde eğitilmiş bir görüntü sınıflandırma modelidir.

Eğitim uygulama kodunuzu bir Docker container'ına yerleştirip bu container'ı Google Container Registry'ye aktararak Vertex AI'a bu hiperparametre ayarlama işini göndereceksiniz. Bu yaklaşımı kullanarak herhangi bir çerçeveyle derlenen bir model için hiperparametrelerde ince ayar yapabilirsiniz.

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

Terminali not defterinde aç

horses_or_humans adında yeni bir dizin oluşturun ve cd'ye ekleyin:

mkdir horses_or_humans
cd horses_or_humans

1. Adım: Dockerfile oluşturun

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. CloudML Hypertune kitaplığı dahil olmak üzere gerekli tüm kitaplıkları yükler ve eğitim kodu için giriş noktasını ayarlar.

Terminal'inizden boş bir Dockerfile oluşturun:

touch Dockerfile

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 Containers, yaygın olarak kullanılan birçok makine öğrenimi ve veri bilimi çerçevesi önceden yüklenmiş olarak sunulur. Bu görüntü indirildikten sonra bu Dockerfile, eğitim kodu için giriş noktasını ayarlar. Bu dosyaları henüz oluşturmadınız. Bir sonraki adımda modeli eğitmek ve ayarlamak için kodu ekleyeceksiniz.

2. Adım: Model eğitim kodunu ekleyin

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 horses_or_humans/ dizininizde aşağıdakilerin olması gerekir:

+ Dockerfile
+ trainer/
    + task.py

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

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

NUM_EPOCHS = 10


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():
  '''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(64)

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

  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()
  train_data, validation_data = create_dataset()
  model = create_model(args.num_units, args.learning_rate, args.momentum)
  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()

Container'ı derlemeden önce koda daha yakından bakalım. Hiperparametre ayarlama hizmetinin kullanımına özgü birkaç bileşen vardır.

  1. Komut dosyası, hypertune kitaplığını içe aktarır. 1. adımdaki Dockerfile'ın bu kitaplığı pip yüklemeyle ilgili talimatlar içerdiğini unutmayın.
  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 hiperparametreler öğrenme hızı, optimize edicideki momentum değeri ve modelin son gizli katmanındaki birimlerin sayısıdır, ancak başkalarıyla da deneme yapmaktan çekinmeyin. Bu bağımsız değişkenlerde iletilen değer, daha sonra kodda karşılık gelen hiperparametreyi ayarlamak için kullanılı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 için eğittiyseniz ve metrik olarak accuracy sağladıysanız History.history özelliği aşağıdaki sözlüğe benzer olur.
{
 "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 ayarı hizmetinin, modelin doğrulama doğruluğunu en üst düzeye çıkaran değerleri keşfetmesini istiyorsanız metriği val_accuracy listesindeki son giriş (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 daha sonra hiperparametre ayarlama işini başlattığınızda bu dizeyi tekrar kullanmanız gerekir.

3. Adım: Kapsayıcıyı 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:hypertune"

Docker'ı yapılandırma

gcloud auth configure-docker

Ardından, horses_or_humans dizininizin kök dizininden aşağıdaki komutu çalıştırarak container'ı oluşturun:

docker build ./ -t $IMAGE_URI

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

docker push $IMAGE_URI

Container Registry'ye aktarıldıktan sonra özel model hiperparametre ayarı işi başlatmaya hazırsınız.

5. Vertex AI'da hiperparametre ayarlama işi çalıştırma

Bu laboratuvarda, Google Container Registry'deki özel bir container üzerinden özel eğitim kullanılır. Ancak Vertex AI Pre-built container'la hiperparametre ayarlama işi de çalıştırabilirsiniz.

Başlamak için Cloud konsolunuzun Vertex bölümündeki Eğitim bölümüne gidin:

uCAIP menüsü

1. Adım: Eğitim işini yapılandırın

Hiperparametre ayarı işinizin parametrelerini girmek için Oluştur'u tıklayın.

  • Veri Kümesi bölümünde, Yönetilen veri kümesi yok'u seçin.
  • Ardından eğitim yönteminiz olarak Özel eğitim (gelişmiş) seçeneğini belirleyin ve Devam'ı tıklayın.
  • Model adı için horses-humans-hyptertune değerini (veya modelinizi adlandırmak istediğiniz adı) girin
  • Devam et'i tıklayın.

Kapsayıcı ayarları adımında Özel kapsayıcı'yı seçin:

Özel kapsayıcı seçeneği

İlk kutuya (Kapsayıcı resmi), önceki bölümde bulunan IMAGE_URI değişkeninizin değerini girin. gcr.io/your-cloud-project/horse-human:hypertune ve kendi proje adınızı içermelidir. Diğer alanları boş bırakıp Devam'ı tıklayın.

2. Adım: Hiperparametre ayarı işini yapılandırın

Hiperparametre ayarını etkinleştir'i seçin.

Hiperparametreler

Hiperparametreleri yapılandırma

Ardından, komut satırı bağımsız değişkenleri olarak belirlediğiniz hiperparametreleri eğitim uygulaması koduna eklemeniz gerekir. Bir hiperparametre eklerken, önce adı sağlamanız gerekir. Bu ad, argparse işlevine ilettiğiniz bağımsız değişken adıyla eşleşmelidir.

learning_rate_name

Ardından, Tür'ü ve ince ayar hizmetinin deneyeceği değerlerin sınırlarını seçersiniz. Çift veya Tamsayı türünü seçerseniz minimum ve maksimum değer sağlamanız gerekir. Kategorik veya Ayrık'ı seçerseniz değerleri sağlamanız gerekir.

learning_rate_typelearning_rate_name

Çift ve Tamsayı türleri için Ölçekleme değerini de sağlamanız gerekir.

learning_rate_scale

learning_rate hiperparametresini ekledikten sonra momentum ve num_units için parametreleri ekleyin.

momentum_config

numneruons_config

Metriği Yapılandır

Hiperparametreleri ekledikten sonra, hedefi ve optimize etmek istediğiniz metriği sağlamanız gerekir. Eğitim başvurunuzda belirlediğiniz hyperparameter_metric_tag ile aynı olmalıdır.

metric_config

Vertex AI Hiperparametre ayarlama hizmeti, önceki adımlarda yapılandırılan değerlerle eğitim uygulamanızın birden fazla denemesini çalıştırır. Hizmetin çalıştıracağı deneme sayısı için bir üst sınır belirlemeniz gerekir. Daha fazla deneme yapıldığında genellikle daha iyi sonuçlar elde edilir. Ancak ek denemeler, optimize etmeye çalıştığınız metrik üzerinde çok az etkiye neden olur veya hiç etkisi olmaz. Bu nedenle, getirilerde azalma olacaktır. Daha az sayıda denemeyle başlayıp çok sayıda denemeye kadar ölçeklendirme yapmadan önce seçtiğiniz hiperparametrelerin ne kadar etkili olduğunu anlamanız önerilir.

Paralel deneme sayısı için de bir üst sınır belirlemeniz gerekir. Paralel deneme sayısını artırmak, hiperparametre ayarı işinin çalışması için gereken süreyi azaltır; ancak işin verimini genel olarak düşürebilir. Bunun nedeni, varsayılan ayarlama stratejisinin sonraki denemelerde değer atanmasını sağlamak için önceki denemelerin sonuçlarını kullanmasıdır. Birbirine paralel olarak çok fazla deneme çalıştırırsanız devam eden denemelerden elde edilen sonuçlardan yararlanılmadan başlatılan denemeler olacaktır.

Gösterim amaçlı olarak, deneme sayısını 15 ve maksimum paralel deneme sayısını 3 olacak şekilde ayarlayabilirsiniz. Farklı sayılarla deneme yapabilirsiniz, ancak bu durumda ayarlama süresi uzar ve maliyet artar.

trial_config

Son adım, arama algoritması olarak Varsayılan'ı seçmektir. Bu algoritma, hiperparametre ayarı için Bayes optimizasyonu gerçekleştirmek üzere Google Vizier'ı kullanır. Bu algoritma hakkında daha fazla bilgiyi buradan edinebilirsiniz.

algorithm_config

Devam'ı tıklayın.

3. adım: İşlemleri yapılandırın

İşlem ve fiyatlandırma bölümünde seçili bölgeyi olduğu gibi bırakın ve Çalışan havuzu 0'ı aşağıdaki gibi yapılandırın.

Makine türü

Hiperparametre ayarlama işini başlatmak için Eğitimi başlat'ı tıklayın. Konsolunuzun Eğitim bölümünde HYPERPARAMETER TUNING İŞLER sekmesi altında şuna benzer bir şey görürsünüz:

Hyperparam işleri

İşlem tamamlandığında iş adını tıklayabilir ve ayarlama denemelerinin sonuçlarını görebilirsiniz.

Hiperparam çıkışı

🎉 Tebrikler! 🎉

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

  • Özel container'da sağlanan eğitim kodu için bir hiperparametre ayarlama işi başlatın. Bu örnekte bir TensorFlow modeli kullanmıştınız ancak özel container'lar kullanarak herhangi bir çerçeveyle oluşturulmuş bir modeli eğitebilirsiniz.

Vertex'in farklı bölümleri hakkında daha fazla bilgi edinmek için dokümanlara göz atın.

6. [İsteğe bağlı] Vertex SDK'yı kullanma

Önceki bölümde, hiperparametre ayarı işinin kullanıcı arayüzü üzerinden nasıl başlatılacağı gösteriliyordu. Bu bölümde, Vertex Python API'yi kullanarak hiperparametre ayarlama işini göndermenin alternatif bir yolunu göreceksiniz.

Launcher'dan bir TensorFlow 2 not defteri oluşturun.

new_notebook

Vertex AI SDK'sını içe aktarın.

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

Hiperparametre ayarı işini başlatmak için önce aşağıdaki spesifikasyonları tanımlamanız gerekir. image_uri içindeki {PROJECT_ID} öğesini 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": 1
    },
    "replica_count": 1,
    "container_spec": {
        "image_uri": "gcr.io/{PROJECT_ID}/horse-human:hypertune"
    }
}]


# Dictionary 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'}

# 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)
}

Sonra CustomJob oluşturun. Hazırlık için {YOUR_BUCKET} öğesini projenizde bir paketle değiştirmeniz gerekir.

# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='horses-humans-sdk-job',
                              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-sdk-job',
    custom_job=my_custom_job,
    metric_spec=metric_spec,
    parameter_spec=parameter_spec,
    max_trial_count=15,
    parallel_trial_count=3)

hp_job.run()

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

Örneği durdur

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