نمونه اولیه برای تولید: تنظیم فراپارامتر

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

در این آزمایشگاه، از Vertex AI برای اجرای یک کار تنظیم hyperparameter در Vertex AI Training استفاده خواهید کرد.

این آزمایشگاه بخشی از سری ویدیوهای Prototype to Production است. قبل از امتحان کردن این آزمایشگاه، حتماً آزمایشگاه قبلی را تکمیل کنید. برای کسب اطلاعات بیشتر می توانید مجموعه ویدیویی همراه را تماشا کنید:

.

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

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

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

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

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

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

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

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

3. محیط خود را تنظیم کنید

مراحل آموزش مدل‌های سفارشی را با Vertex AI lab تکمیل کنید تا محیط خود را تنظیم کنید.

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

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

برای شروع، از منوی Launcher نوت بوک Workbench که در آزمایشگاه های قبلی ایجاد کردید، یک پنجره ترمینال را باز کنید.

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

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

یک دایرکتوری جدید به نام flowers-hptune ایجاد کنید و cd را در آن ایجاد کنید:

mkdir flowers-hptune
cd flowers-hptune

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

mkdir trainer
touch trainer/task.py

اکنون باید موارد زیر را در شاخه flowers-hptune/ خود داشته باشید:

+ trainer/
    + task.py

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

باید {your-gcs-bucket} در BUCKET_ROOT با سطل Cloud Storage که در آن مجموعه داده گل‌ها را در آزمایشگاه 1 ذخیره کرده‌اید، جایگزین کنید.

import tensorflow as tf
import numpy as np
import os
import hypertune
import argparse

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

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 create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''

  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model(num_units, learning_rate, momentum):
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(num_units, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])

  model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
  
  return model

def main():
  args = get_args()
  train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)
  model = create_model(args.num_units, args.learning_rate, args.momentum)
  history = model.fit(train_dataset, validation_data=validation_dataset, epochs=EPOCHS)

  # 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=EPOCHS)


if __name__ == "__main__":
    main()

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

  1. اسکریپت کتابخانه hypertune را وارد می کند.
  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 را شروع کردید، باید دوباره از رشته استفاده کنید.

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

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

از ترمینال خود، یک Dockerfile خالی در ریشه دایرکتوری flowers-hptune خود ایجاد کنید:

touch Dockerfile

اکنون باید موارد زیر را در شاخه flowers-hptune/ خود داشته باشید:

+ Dockerfile
+ trainer/
    + task.py

Dockerfile را باز کنید و موارد زیر را در آن کپی کنید. متوجه خواهید شد که این تقریباً مشابه Dockerfile است که ما در آزمایشگاه اول استفاده کردیم، با این تفاوت که اکنون در حال نصب کتابخانه cloudml-hypertune هستیم.

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

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

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

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

PROJECT_ID='your-cloud-project'

در Artifact Registry یک repo تعریف کنید. ما از مخزنی که در اولین آزمایشگاه ایجاد کردیم استفاده خواهیم کرد.

REPO_NAME='flower-app'

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

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_hptune:latest

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

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

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

docker build ./ -t $IMAGE_URI

در نهایت، آن را به آرتیفکت رجیستری فشار دهید:

docker push $IMAGE_URI

با فشار دادن کانتینر به Artifact Registry، اکنون آماده شروع یک کار آموزشی هستید.

5. کار تنظیم hyperparameter را با SDK اجرا کنید

در این بخش، نحوه پیکربندی و ارسال کار تنظیم Hyperparameter را با استفاده از Vertex Python API خواهید آموخت.

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

نوت بوک

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

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

برای راه اندازی کار تنظیم hyperparameter، ابتدا باید worker_pool_specs را تعریف کنید که نوع ماشین و تصویر Docker را مشخص می کند. مشخصات زیر یک دستگاه را با دو پردازنده گرافیکی NVIDIA Tesla V100 تعریف می کند.

شما باید پروژه خود را جایگزین {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": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_hptune:latest"
    }
}]

در مرحله بعد، parameter_spec را تعریف کنید، که یک فرهنگ لغت است که پارامترهایی را که می خواهید بهینه کنید، مشخص می کند. کلید دیکشنری رشته ای است که برای هر هایپرپارامتر به آرگومان خط فرمان اختصاص داده اید و مقدار دیکشنری مشخصات پارامتر است.

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

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

مشخصات نهایی که باید تعریف شود metric_spec است، که یک فرهنگ لغت نشان دهنده متریک برای بهینه سازی است. کلید واژه نامه hyperparameter_metric_tag است که در کد برنامه آموزشی خود تنظیم کرده اید و مقدار آن هدف بهینه سازی است.

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

هنگامی که مشخصات تعریف شد، یک CustomJob ایجاد خواهید کرد، که مشخصات رایجی است که برای اجرای کار شما در هر یک از آزمایش های تنظیم هایپرپارامتر استفاده می شود.

باید {YOUR_BUCKET} با سطلی که قبلا ایجاد کردید جایگزین کنید.

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

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

hp_job = aiplatform.HyperparameterTuningJob(
    display_name='flowers-hptune-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()

چند استدلال قابل ذکر است:

  • max_trial_count : شما باید یک کران بالایی برای تعداد آزمایش هایی که سرویس اجرا می کند قرار دهید. آزمایش‌های بیشتر معمولاً به نتایج بهتری منجر می‌شود، اما بازدهی کاهش می‌یابد، که پس از آن آزمایش‌های اضافی تأثیر کمی بر معیاری که می‌خواهید بهینه‌سازی کنید، ندارد. بهترین روش این است که با تعداد کمتری آزمایش شروع کنید و قبل از افزایش مقیاس، درک کنید که فراپارامترهای انتخابی شما چقدر تأثیرگذار هستند.
  • parallel_trial_count : اگر از آزمایش‌های موازی استفاده می‌کنید، سرویس چندین کلاستر پردازش آموزشی را ارائه می‌کند. افزایش تعداد آزمایش‌های موازی، مدت زمان اجرای کار تنظیم فراپارامتر را کاهش می‌دهد. با این حال، می تواند اثربخشی کار را به طور کلی کاهش دهد. این به این دلیل است که استراتژی تنظیم پیش‌فرض از نتایج آزمایش‌های قبلی برای اطلاع از تخصیص مقادیر در آزمایش‌های بعدی استفاده می‌کند.
  • search_algorithm : می‌توانید الگوریتم جستجو را روی شبکه، تصادفی یا پیش‌فرض (هیچ‌کدام) تنظیم کنید. گزینه پیش فرض بهینه سازی بیزی را برای جستجوی فضای مقادیر فراپارامتر ممکن اعمال می کند و الگوریتم پیشنهادی است. در اینجا می توانید با این الگوریتم بیشتر آشنا شوید.

در کنسول، می توانید پیشرفت کار خود را مشاهده کنید.

hp_job

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

hp_results

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

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

  • یک کار تنظیم خودکار فراپارامتر را اجرا کنید

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

6. پاکسازی

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

توقف نمونه

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

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