Vertex AI: Hyperparameter Tuning

1. بررسی اجمالی

در این آزمایشگاه، از Vertex AI برای اجرای یک کار تنظیم hyperparameter برای یک مدل TensorFlow استفاده خواهید کرد. در حالی که این آزمایشگاه از TensorFlow برای کد مدل استفاده می کند، این مفاهیم برای سایر چارچوب های ML نیز قابل اجرا هستند.

چیزی که یاد می گیرید

شما یاد خواهید گرفت که چگونه:

  • کد برنامه آموزشی را برای تنظیم خودکار فراپارامتر تغییر دهید
  • یک کار تنظیم hyperparameter را از Vertex AI UI پیکربندی و راه اندازی کنید
  • یک کار تنظیم فراپارامتر را با Vertex AI Python SDK پیکربندی و راه اندازی کنید

کل هزینه اجرای این آزمایشگاه در Google Cloud حدود 3 دلار آمریکا است.

2. مقدمه ای بر Vertex AI

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می کند. Vertex AI پیشنهادات ML را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می کند. پیش از این، مدل‌های آموزش دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. پیشنهاد جدید هر دو را به همراه سایر محصولات جدید در یک API واحد ترکیب می کند. همچنین می توانید پروژه های موجود را به Vertex AI منتقل کنید. اگر بازخوردی دارید، لطفاً صفحه پشتیبانی را ببینید.

Vertex AI شامل بسیاری از محصولات مختلف برای پشتیبانی از گردش کار ML سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: آموزش و میز کار .

نمای کلی محصول Vertex

3. محیط خود را راه اندازی کنید

برای اجرای این کد لبه به یک پروژه Google Cloud Platform با فعال بودن صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل های اینجا را دنبال کنید.

مرحله 1: Compute Engine API را فعال کنید

به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید. برای ایجاد نمونه نوت بوک خود به این نیاز دارید.

مرحله 2: Container Registry API را فعال کنید

به رجیستری کانتینر بروید و اگر قبلاً وجود ندارد، Enable را انتخاب کنید. شما از این برای ایجاد یک ظرف برای کار آموزشی سفارشی خود استفاده خواهید کرد.

مرحله 3: Vertex AI API را فعال کنید

به بخش Vertex AI در Cloud Console خود بروید و روی Enable Vertex AI API کلیک کنید.

داشبورد Vertex AI

مرحله 4: یک نمونه Vertex AI Workbench ایجاد کنید

از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:

منوی Vertex AI

اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.

Notebook_api

پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:

Notebooks_UI

سپس NEW NOTEBOOK را انتخاب کنید.

نوت بوک

نوت بوک خود را نامی بگذارید و سپس روی تنظیمات پیشرفته کلیک کنید.

create_notebook

در قسمت تنظیمات پیشرفته، خاموش شدن بی‌حرکت را فعال کنید و تعداد دقیقه‌ها را روی 60 دقیقه تنظیم کنید. این بدان معناست که نوت بوک شما در صورت عدم استفاده به طور خودکار خاموش می‌شود تا هزینه‌های غیرضروری متحمل نشوید.

idle_timeout

اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.

enable_terminal

شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.

بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.

پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید.

open_jupyterlab

اولین باری که از یک نمونه جدید استفاده می کنید، از شما خواسته می شود که احراز هویت کنید. برای انجام این کار مراحل موجود در UI را دنبال کنید.

تصدیق کردن

4. کانتینرسازی کد برنامه آموزشی

مدلی که در این آزمایشگاه آموزش می‌دهید و تنظیم می‌کنید، یک مدل طبقه‌بندی تصویر است که بر روی مجموعه داده‌های اسب یا انسان از TensorFlow Datasets آموزش داده شده است.

با قرار دادن کد برنامه آموزشی خود در یک ظرف Docker و فشار دادن این کانتینر به Google Container Registry ، این کار تنظیم فراپارامتر را به Vertex AI ارسال خواهید کرد. با استفاده از این رویکرد، می توانید هایپرپارامترها را برای یک مدل ساخته شده با هر چارچوبی تنظیم کنید.

برای شروع، از منوی Launcher، یک پنجره ترمینال را در نمونه نوت بوک خود باز کنید:

ترمینال را در نوت بوک باز کنید

یک دایرکتوری جدید به نام horses_or_humans ایجاد کنید و در آن cd کنید:

mkdir horses_or_humans
cd horses_or_humans

مرحله 1: یک Dockerfile ایجاد کنید

اولین گام در کانتینر کردن کد شما ایجاد یک Dockerfile است. در Dockerfile شما تمام دستورات مورد نیاز برای اجرای تصویر را درج خواهید کرد. تمام کتابخانه‌های لازم از جمله کتابخانه CloudML Hypertune را نصب می‌کند و نقطه ورودی کد آموزشی را تنظیم می‌کند.

از ترمینال خود، یک Dockerfile خالی ایجاد کنید:

touch Dockerfile

Dockerfile را باز کنید و موارد زیر را در آن کپی کنید:

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"]

این Dockerfile از تصویر Deep Learning Container TensorFlow Enterprise 2.7 GPU Docker استفاده می کند. Deep Learning Containers در Google Cloud با بسیاری از چارچوب‌های رایج ML و علم داده از پیش نصب شده عرضه می‌شود. پس از دانلود آن تصویر، این Dockerfile نقطه ورودی کد آموزشی را تنظیم می کند. شما هنوز این فایل ها را ایجاد نکرده اید – در مرحله بعد کد آموزش و تنظیم مدل را اضافه می کنید.

مرحله 2: کد آموزشی مدل را اضافه کنید

از ترمینال خود، موارد زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون ایجاد کنید که در آن کد را اضافه کنید:

mkdir trainer
touch trainer/task.py

اکنون باید موارد زیر را در پوشه horses_or_humans/ خود داشته باشید:

+ Dockerfile
+ trainer/
    + task.py

سپس فایل task.py را که ایجاد کرده اید باز کنید و کد زیر را کپی کنید.

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

قبل از ساختن کانتینر، اجازه دهید نگاهی عمیق تر به کد بیندازیم. چند مؤلفه وجود دارد که مخصوص استفاده از سرویس تنظیم هایپرپارامتر است.

  1. اسکریپت کتابخانه hypertune را وارد می کند. توجه داشته باشید که Dockerfile از مرحله 1 شامل دستورالعمل‌هایی برای نصب پیپ این کتابخانه است.
  2. تابع get_args() یک آرگومان خط فرمان برای هر هایپرپارامتری که می خواهید تنظیم کنید تعریف می کند. در این مثال، فراپارامترهایی که تنظیم خواهند شد عبارتند از نرخ یادگیری، مقدار تکانه در بهینه ساز و تعداد واحدها در آخرین لایه پنهان مدل، اما با خیال راحت با دیگران آزمایش کنید. مقدار ارسال شده در آن آرگومان ها سپس برای تنظیم هایپرپارامتر مربوطه در کد استفاده می شود.
  3. در انتهای تابع main() از کتابخانه hypertune برای تعریف متریکی که می خواهید بهینه کنید استفاده می شود. در TensorFlow، متد keras model.fit یک شی History برمی‌گرداند. ویژگی History.history رکوردی از مقادیر از دست دادن آموزش و مقادیر معیارها در دوره های متوالی است. اگر داده‌های اعتبارسنجی را به model.fit ارسال کنید، ویژگی History.history شامل از دست دادن اعتبار و مقادیر معیارها نیز می‌شود. برای مثال، اگر مدلی را برای سه دوره با داده های اعتبار سنجی آموزش دهید و accuracy به عنوان یک متریک ارائه کنید، ویژگی History.history شبیه فرهنگ لغت زیر خواهد بود.
{
 "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
 ]

اگر می‌خواهید سرویس تنظیم فراپارامتر مقادیری را که دقت اعتبارسنجی مدل را به حداکثر می‌رسانند کشف کند، متریک را به عنوان آخرین ورودی (یا NUM_EPOCS - 1 ) از لیست val_accuracy تعریف می‌کنید. سپس، این معیار را به یک نمونه از HyperTune ارسال کنید. می‌توانید هر رشته‌ای را که دوست دارید برای hyperparameter_metric_tag انتخاب کنید، اما بعداً وقتی کار تنظیم hyperparameter را شروع کردید، باید دوباره از رشته استفاده کنید.

مرحله 3: ظرف را بسازید

از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید و مطمئن شوید که your-cloud-project با ID پروژه خود جایگزین کنید:

PROJECT_ID='your-cloud-project'

یک متغیر با URI تصویر کانتینر خود در Google Container Registry تعریف کنید:

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

داکر را پیکربندی کنید

gcloud auth configure-docker

سپس، با اجرای موارد زیر از ریشه دایرکتوری horses_or_humans ، کانتینر را بسازید:

docker build ./ -t $IMAGE_URI

در نهایت، آن را به Google Container Registry فشار دهید:

docker push $IMAGE_URI

با فشار دادن کانتینر به Container Registry، اکنون آماده هستید تا یک کار تنظیم فراپارامتر مدل سفارشی را آغاز کنید.

5. یک کار تنظیم hyperparameter را روی Vertex AI اجرا کنید

این آزمایشگاه از آموزش سفارشی از طریق یک کانتینر سفارشی در Google Container Registry استفاده می‌کند، اما شما همچنین می‌توانید یک کار تنظیم hyperparameter را با یک کانتینر از پیش ساخته شده Vertex AI اجرا کنید.

برای شروع، به بخش Training در بخش Vertex کنسول Cloud خود بروید:

منوی uCAIP

مرحله 1: کار آموزشی را پیکربندی کنید

روی Create کلیک کنید تا پارامترهای مربوط به کار تنظیم هایپرپارامتر خود را وارد کنید.

  • در زیر مجموعه داده ، بدون مجموعه داده مدیریت شده را انتخاب کنید
  • سپس آموزش سفارشی (پیشرفته) را به عنوان روش آموزشی خود انتخاب کرده و روی Continue کلیک کنید.
  • horses-humans-hyptertune (یا هر چیزی که می‌خواهید مدل خود را نام ببرید) را برای نام مدل وارد کنید
  • روی Continue کلیک کنید

در مرحله تنظیمات Container، Custom Container را انتخاب کنید:

گزینه کانتینر سفارشی

در کادر اول ( تصویر Container )، مقدار متغیر IMAGE_URI خود را از قسمت قبل وارد کنید. باید این باشد: gcr.io/your-cloud-project/horse-human:hypertune ، با نام پروژه خودتان. بقیه فیلدها را خالی بگذارید و روی Continue کلیک کنید.

مرحله 2: کار تنظیم hyperparameter را پیکربندی کنید

Enable hyperparameter tuning را انتخاب کنید.

فراپارامترها

پیکربندی هایپرپارامترها

در مرحله بعد، باید هایپرپارامترهایی را که به عنوان آرگومان های خط فرمان تنظیم کرده اید در کد برنامه آموزشی اضافه کنید. هنگام اضافه کردن یک هایپرپارامتر، ابتدا باید نام آن را وارد کنید. این باید با نام آرگومانی که به argparse ارسال کردید مطابقت داشته باشد.

Learning_rate_name

سپس، نوع و همچنین مرزهای مقادیری را که سرویس تنظیم امتحان می کند، انتخاب می کنید. اگر نوع Double یا Integer را انتخاب کنید، باید حداقل و حداکثر مقدار را ارائه دهید. و اگر دسته بندی یا گسسته را انتخاب کنید، باید مقادیر را ارائه دهید.

یادگیری_نرخ_نوعLearning_rate_name

برای انواع Double و Integer، باید مقدار Scaling را نیز ارائه دهید.

یادگیری_نرخ_مقیاس

پس از افزودن هایپرپارامتر learning_rate ، پارامترهای momentum و num_units را اضافه کنید.

momentum_config

numneruons_config

متریک را پیکربندی کنید

پس از افزودن هایپرپارامترها، در مرحله بعد معیاری را که می خواهید بهینه کنید و همچنین هدف را ارائه می دهید. این باید مانند hyperparameter_metric_tag باشد که در برنامه آموزشی خود تنظیم کرده اید.

metric_config

سرویس تنظیم Hyperparameter Vertex AI چندین آزمایش از برنامه آموزشی شما را با مقادیر پیکربندی شده در مراحل قبلی اجرا می کند. شما باید یک حد بالایی برای تعداد آزمایش‌هایی که سرویس اجرا می‌کند قرار دهید. آزمایش‌های بیشتر معمولاً به نتایج بهتری منجر می‌شود، اما نقطه‌ای از بازده کاهش می‌یابد که پس از آن آزمایش‌های اضافی تأثیر کمی بر معیاری که می‌خواهید بهینه‌سازی کنید، دارد یا هیچ تأثیری ندارد. این بهترین روش است که با تعداد کمتری از آزمایش‌ها شروع کنید و قبل از اینکه به تعداد آزمایش‌های زیاد برسید، درک کنید که فراپارامترهای انتخابی شما چقدر تأثیرگذار هستند.

همچنین باید یک کران بالایی برای تعداد آزمایش های موازی تعیین کنید. افزایش تعداد آزمایش‌های موازی، مدت زمان اجرای کار تنظیم فراپارامتر را کاهش می‌دهد. با این حال، می تواند اثربخشی کار را در همه موارد کاهش دهد. این به این دلیل است که استراتژی تنظیم پیش‌فرض از نتایج آزمایش‌های قبلی برای اطلاع از تخصیص مقادیر در آزمایش‌های بعدی استفاده می‌کند. اگر آزمایش‌های زیادی را به صورت موازی اجرا کنید، آزمایش‌هایی وجود خواهند داشت که بدون بهره‌مندی از نتیجه آزمایش‌هایی که هنوز در حال اجرا هستند، شروع می‌شوند.

برای اهداف نمایشی، می‌توانید تعداد آزمایش‌ها را 15 و حداکثر تعداد آزمایش‌های موازی را 3 تنظیم کنید. می‌توانید با اعداد مختلف آزمایش کنید، اما این می‌تواند منجر به زمان تنظیم طولانی‌تر و هزینه بالاتر شود.

trial_config

آخرین مرحله انتخاب پیش فرض به عنوان الگوریتم جستجو است که از Google Vizier برای انجام بهینه سازی بیزی برای تنظیم هایپرپارامتر استفاده می کند. در اینجا می توانید با این الگوریتم بیشتر آشنا شوید.

algorithm_config

روی Continue کلیک کنید.

مرحله 3: محاسبه را پیکربندی کنید

در محاسبه و قیمت گذاری ، منطقه انتخاب شده را همانطور که هست رها کنید و Worker pool 0 را به صورت زیر پیکربندی کنید.

ماشین تایپ

برای شروع کار تنظیم هایپرپارامتر، روی Start training کلیک کنید. در بخش Training کنسول خود در زیر تب HYPERPARAMETER TUNING JOBS چیزی شبیه به این خواهید دید:

مشاغل Hyperparam

وقتی کار تمام شد، می‌توانید روی نام شغل کلیک کنید و نتایج آزمایش‌های تنظیم را ببینید.

خروجی هایپرپارام

🎉 تبریک می گویم! 🎉

شما یاد گرفته اید که چگونه از Vertex AI برای موارد زیر استفاده کنید:

  • یک کار تنظیم hyperparameter برای کد آموزشی ارائه شده در یک ظرف سفارشی راه اندازی کنید. شما در این مثال از یک مدل TensorFlow استفاده کردید، اما می توانید یک مدل ساخته شده با هر چارچوبی را با استفاده از کانتینرهای سفارشی آموزش دهید.

برای کسب اطلاعات بیشتر در مورد بخش های مختلف Vertex، مستندات را بررسی کنید.

6. [اختیاری] از Vertex SDK استفاده کنید

بخش قبلی نحوه راه‌اندازی کار تنظیم hyperparameter از طریق UI را نشان داد. در این بخش، یک روش جایگزین برای ارسال کار تنظیم هایپرپارامتر با استفاده از Vertex Python API مشاهده خواهید کرد.

از Launcher، یک نوت بوک TensorFlow 2 ایجاد کنید.

نوت بوک

Vertex AI SDK را وارد کنید.

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

برای راه اندازی کار تنظیم hyperparameter، ابتدا باید مشخصات زیر را تعریف کنید. شما باید پروژه خود را جایگزین {PROJECT_ID} در image_uri کنید.

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

بعد، یک CustomJob ایجاد کنید. برای مرحله بندی باید {YOUR_BUCKET} با یک سطل در پروژه خود جایگزین کنید.

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

سپس HyperparameterTuningJob ایجاد و اجرا کنید.

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. پاکسازی

از آنجایی که ما نوت بوک را طوری پیکربندی کرده‌ایم که پس از 60 دقیقه بی‌حرکت، زمان آن تمام شود، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می خواهید نوت بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

توقف نمونه

برای حذف Storage Bucket، با استفاده از منوی Navigation در Cloud Console خود، به Storage بروید، سطل خود را انتخاب کنید و روی Delete کلیک کنید:

ذخیره سازی را حذف کنید