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 سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: آموزش و میز کار .
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 کلیک کنید.
مرحله 4: یک نمونه Vertex AI Workbench ایجاد کنید
از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:
اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.
پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:
سپس NEW NOTEBOOK را انتخاب کنید.
نوت بوک خود را نامی بگذارید و سپس روی تنظیمات پیشرفته کلیک کنید.
در قسمت تنظیمات پیشرفته، خاموش شدن بیحرکت را فعال کنید و تعداد دقیقهها را روی 60 دقیقه تنظیم کنید. این بدان معناست که نوت بوک شما در صورت عدم استفاده به طور خودکار خاموش میشود تا هزینههای غیرضروری متحمل نشوید.
اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.
شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.
بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.
پس از ایجاد نمونه، 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()
قبل از ساختن کانتینر، اجازه دهید نگاهی عمیق تر به کد بیندازیم. چند مؤلفه وجود دارد که مخصوص استفاده از سرویس تنظیم هایپرپارامتر است.
- اسکریپت کتابخانه
hypertune
را وارد می کند. توجه داشته باشید که Dockerfile از مرحله 1 شامل دستورالعملهایی برای نصب پیپ این کتابخانه است. - تابع
get_args()
یک آرگومان خط فرمان برای هر هایپرپارامتری که می خواهید تنظیم کنید تعریف می کند. در این مثال، فراپارامترهایی که تنظیم خواهند شد عبارتند از نرخ یادگیری، مقدار تکانه در بهینه ساز و تعداد واحدها در آخرین لایه پنهان مدل، اما با خیال راحت با دیگران آزمایش کنید. مقدار ارسال شده در آن آرگومان ها سپس برای تنظیم هایپرپارامتر مربوطه در کد استفاده می شود. - در انتهای تابع
main()
از کتابخانهhypertune
برای تعریف متریکی که می خواهید بهینه کنید استفاده می شود. در TensorFlow، متد kerasmodel.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 خود بروید:
مرحله 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
ارسال کردید مطابقت داشته باشد.
سپس، نوع و همچنین مرزهای مقادیری را که سرویس تنظیم امتحان می کند، انتخاب می کنید. اگر نوع Double یا Integer را انتخاب کنید، باید حداقل و حداکثر مقدار را ارائه دهید. و اگر دسته بندی یا گسسته را انتخاب کنید، باید مقادیر را ارائه دهید.
برای انواع Double و Integer، باید مقدار Scaling را نیز ارائه دهید.
پس از افزودن هایپرپارامتر learning_rate
، پارامترهای momentum
و num_units
را اضافه کنید.
متریک را پیکربندی کنید
پس از افزودن هایپرپارامترها، در مرحله بعد معیاری را که می خواهید بهینه کنید و همچنین هدف را ارائه می دهید. این باید مانند hyperparameter_metric_tag
باشد که در برنامه آموزشی خود تنظیم کرده اید.
سرویس تنظیم Hyperparameter Vertex AI چندین آزمایش از برنامه آموزشی شما را با مقادیر پیکربندی شده در مراحل قبلی اجرا می کند. شما باید یک حد بالایی برای تعداد آزمایشهایی که سرویس اجرا میکند قرار دهید. آزمایشهای بیشتر معمولاً به نتایج بهتری منجر میشود، اما نقطهای از بازده کاهش مییابد که پس از آن آزمایشهای اضافی تأثیر کمی بر معیاری که میخواهید بهینهسازی کنید، دارد یا هیچ تأثیری ندارد. این بهترین روش است که با تعداد کمتری از آزمایشها شروع کنید و قبل از اینکه به تعداد آزمایشهای زیاد برسید، درک کنید که فراپارامترهای انتخابی شما چقدر تأثیرگذار هستند.
همچنین باید یک کران بالایی برای تعداد آزمایش های موازی تعیین کنید. افزایش تعداد آزمایشهای موازی، مدت زمان اجرای کار تنظیم فراپارامتر را کاهش میدهد. با این حال، می تواند اثربخشی کار را در همه موارد کاهش دهد. این به این دلیل است که استراتژی تنظیم پیشفرض از نتایج آزمایشهای قبلی برای اطلاع از تخصیص مقادیر در آزمایشهای بعدی استفاده میکند. اگر آزمایشهای زیادی را به صورت موازی اجرا کنید، آزمایشهایی وجود خواهند داشت که بدون بهرهمندی از نتیجه آزمایشهایی که هنوز در حال اجرا هستند، شروع میشوند.
برای اهداف نمایشی، میتوانید تعداد آزمایشها را 15 و حداکثر تعداد آزمایشهای موازی را 3 تنظیم کنید. میتوانید با اعداد مختلف آزمایش کنید، اما این میتواند منجر به زمان تنظیم طولانیتر و هزینه بالاتر شود.
آخرین مرحله انتخاب پیش فرض به عنوان الگوریتم جستجو است که از Google Vizier برای انجام بهینه سازی بیزی برای تنظیم هایپرپارامتر استفاده می کند. در اینجا می توانید با این الگوریتم بیشتر آشنا شوید.
روی Continue کلیک کنید.
مرحله 3: محاسبه را پیکربندی کنید
در محاسبه و قیمت گذاری ، منطقه انتخاب شده را همانطور که هست رها کنید و Worker pool 0 را به صورت زیر پیکربندی کنید.
برای شروع کار تنظیم هایپرپارامتر، روی Start training کلیک کنید. در بخش Training کنسول خود در زیر تب HYPERPARAMETER TUNING JOBS چیزی شبیه به این خواهید دید:
وقتی کار تمام شد، میتوانید روی نام شغل کلیک کنید و نتایج آزمایشهای تنظیم را ببینید.
🎉 تبریک می گویم! 🎉
شما یاد گرفته اید که چگونه از 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 کلیک کنید: