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.
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:
- 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.
- 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.
4. Adım: Vertex AI Workbench örneği oluşturun
Cloud Console'unuzun Vertex AI bölümünden Workbench'i tıklayın:
Henüz etkinleştirilmediyse Notebooks API'yi etkinleştirin.
Etkinleştirdikten sonra YÖNETİLEN NOT KİTAPLARI'nı tıklayın:
Ardından YENİ NOT DEFTERİ'ni seçin.
Not defterinize bir ad verin ve ardından Gelişmiş Ayarlar'ı tıklayın.
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.
Güvenlik bölümünde, terminal henüz etkinleştirilmediyse "Terminali etkinleştir"i seçin.
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.
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.
5. Eğitim kodu yazma
Başlamak için Başlatıcı menüsünden not defteri örneğinizde bir Terminal penceresi açın:
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
main()
işlevindeMirroredStrategy
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.- 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ı
- 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. 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).main()
işlevinin sonunda, optimize etmek istediğiniz metriği tanımlamak içinhypertune
kitaplığı kullanılır. TensorFlow'da Kerasmodel.fit
yöntemi birHistory
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 verilerinimodel.fit
hizmetine iletirsenizHistory.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 olarakaccuracy
sağladıysanızHistory.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.
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.
İş tamamlandıktan sonra, hiperparametre değerlerinin en iyi kombinasyonunu keşfetmek için denemelerinizin sonuçlarını görüntüleyebilir ve sıralayabilirsiniz.
🎉 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.
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: