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

۳. بررسی اجمالی موارد استفاده
در این آزمایش، شما از تنظیم فراپارامتر برای کشف پارامترهای بهینه برای یک مدل طبقهبندی تصویر که روی مجموعه دادههای اسبها یا انسانها از مجموعه دادههای TensorFlow آموزش داده شده است، استفاده خواهید کرد.
تنظیم هایپرپارامتر
تنظیم هایپرپارامترها با Vertex AI Training با اجرای چندین آزمایش از برنامه آموزشی شما با مقادیر هایپرپارامترهای انتخابی شما، که در محدوده تعیین شده توسط شما تنظیم شدهاند، انجام میشود. Vertex AI نتایج هر آزمایش را پیگیری میکند و تنظیمات را برای آزمایشهای بعدی انجام میدهد.
برای استفاده از تنظیم هایپرپارامتر با Vertex AI Training، دو تغییر وجود دارد که باید در کد آموزشی خود اعمال کنید:
- برای هر هایپرپارامتری که میخواهید تنظیم کنید، یک آرگومان خط فرمان در ماژول آموزشی اصلی خود تعریف کنید.
- از مقداری که در آن آرگومانها ارسال شده است برای تنظیم هایپرپارامتر مربوطه در کد برنامه خود استفاده کنید.
آموزش توزیعشده
اگر یک پردازنده گرافیکی (GPU) واحد دارید، TensorFlow از این شتابدهنده برای سرعت بخشیدن به آموزش مدل بدون هیچ کار اضافی از جانب شما استفاده میکند. با این حال، اگر میخواهید از استفاده از چندین پردازنده گرافیکی (GPU) بهره بیشتری ببرید، باید از tf.distribute استفاده کنید که ماژول TensorFlow برای اجرای محاسبات در چندین دستگاه است.
این آزمایشگاه از tf.distribute.MirroredStrategy استفاده میکند که میتوانید آن را تنها با چند تغییر کد به برنامههای آموزشی خود اضافه کنید. این استراتژی یک کپی از مدل را در هر GPU روی دستگاه شما ایجاد میکند. بهروزرسانیهای بعدی گرادیان به صورت همزمان انجام میشوند. این بدان معناست که هر GPU عبورهای رو به جلو و عقب را از طریق مدل روی برش متفاوتی از دادههای ورودی محاسبه میکند. گرادیانهای محاسبه شده از هر یک از این برشها سپس در تمام GPUها جمع شده و در فرآیندی که به عنوان all-reduce شناخته میشود، میانگینگیری میشوند. پارامترهای مدل با استفاده از این گرادیانهای میانگینگیری شده بهروزرسانی میشوند.
برای تکمیل این آزمایش نیازی به دانستن جزئیات ندارید، اما اگر میخواهید درباره نحوه کار آموزش توزیعشده در TensorFlow بیشتر بدانید، ویدیوی زیر را ببینید:
۴. محیط خود را آماده کنید
برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعملهای اینجا را دنبال کنید.
مرحله ۱: فعال کردن رابط برنامهنویسی کاربردی موتور محاسبات
به Compute Engine بروید و اگر از قبل فعال نیست، آن را فعال کنید .
مرحله 2: فعال کردن API رجیستری کانتینر
به رجیستری کانتینر بروید و اگر فعال نیست، آن را فعال کنید. از این برای ایجاد یک کانتینر برای کار آموزشی سفارشی خود استفاده خواهید کرد.
مرحله 3: فعال کردن API هوش مصنوعی Vertex
به بخش Vertex AI در کنسول ابری خود بروید و روی Enable Vertex AI API کلیک کنید.

مرحله ۴: ایجاد یک نمونه از Vertex AI Workbench
از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

اگر API نوتبوکها فعال نیست، آن را فعال کنید.

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

سپس دفترچه یادداشت جدید را انتخاب کنید.

برای نوتبوک خود یک نام انتخاب کنید و سپس روی تنظیمات پیشرفته (Advanced Settings) کلیک کنید.

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

در قسمت امنیت، اگر از قبل فعال نشده است، گزینه «فعال کردن ترمینال» را انتخاب کنید.

میتوانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.
سپس، روی ایجاد (Create) کلیک کنید. آمادهسازی نمونه (instance) چند دقیقه طول خواهد کشید.
پس از ایجاد نمونه، گزینه Open JupyterLab را انتخاب کنید.

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

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

یک دایرکتوری جدید به نام vertex-codelab ایجاد کنید و با دستور cd وارد آن شوید.
mkdir vertex-codelab
cd vertex-codelab
دستور زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون که کد را در آن اضافه خواهید کرد، ایجاد شود:
mkdir trainer
touch trainer/task.py
اکنون باید موارد زیر را در دایرکتوری vertex-codelab خود داشته باشید:
+ trainer/
+ task.py
در مرحله بعد، فایل task.py که ایجاد کردهاید را باز کنید و تمام کد زیر را در آن قرار دهید.
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()
بیایید نگاه عمیقتری به کد بیندازیم و اجزای مختص آموزش توزیعشده و تنظیم هایپرپارامتر را بررسی کنیم.
آموزش توزیعشده
- در تابع
main()، شیءMirroredStrategyایجاد میشود. در مرحله بعد، متغیرهای مدل ایجاد شده را در محدوده استراتژی قرار میدهید. این مرحله به TensorFlow میگوید که کدام متغیرها باید در GPUها منعکس شوند. - اندازه دسته توسط
num_replicas_in_syncافزایش مییابد. افزایش اندازه دسته، بهترین روش هنگام استفاده از استراتژیهای موازیسازی دادههای همزمان در TensorFlow است. میتوانید اطلاعات بیشتر را اینجا بخوانید.
تنظیم هایپرپارامتر
- این اسکریپت کتابخانه
hypertuneرا وارد میکند. بعداً وقتی تصویر کانتینر را میسازیم، باید مطمئن شویم که این کتابخانه را نصب کردهایم. - تابع
get_args()یک آرگومان خط فرمان برای هر هایپرپارامتری که میخواهید تنظیم کنید، تعریف میکند. در این مثال، هایپرپارامترهایی که تنظیم میشوند عبارتند از نرخ یادگیری، مقدار مومنتوم در بهینهساز و تعداد واحدها در آخرین لایه پنهان مدل، اما میتوانید با موارد دیگر نیز آزمایش کنید. مقداری که در این آرگومانها ارسال میشود، سپس برای تنظیم هایپرپارامتر مربوطه در کد استفاده میشود (مثلاً setlearning_rate = args.learning_rate). - در انتهای تابع
main()، از کتابخانهhypertuneبرای تعریف معیاری که میخواهید بهینهسازی کنید استفاده میشود. در TensorFlow، متدmodel.fitدر Keras یک شیء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 انتخاب کنید، اما بعداً هنگام شروع کار تنظیم هایپرپارامتر، باید دوباره از این رشته استفاده کنید.
۶. کد را کانتینریزه کنید
اولین قدم برای کانتینرایز کردن کد شما، ایجاد یک Dockerfile است. در Dockerfile تمام دستورات مورد نیاز برای اجرای تصویر را قرار خواهید داد. این فایل تمام کتابخانههای لازم را نصب کرده و نقطه ورود کد آموزشی را تنظیم میکند.
مرحله ۱: نوشتن داکرفایل
از طریق ترمینال خود، مطمئن شوید که در دایرکتوری vertex-codelab هستید و یک Dockerfile خالی ایجاد کنید:
touch Dockerfile
اکنون باید موارد زیر را در دایرکتوری vertex-codelab خود داشته باشید:
+ Dockerfile
+ trainer/
+ task.py
فایل Docker را باز کنید و موارد زیر را در آن کپی کنید:
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"]
این داکرفایل از ایمیج داکر پردازنده گرافیکی کانتینر یادگیری عمیق TensorFlow Enterprise 2.7 استفاده میکند. کانتینرهای یادگیری عمیق در Google Cloud با بسیاری از چارچوبهای رایج یادگیری ماشین و علم داده از پیش نصب شده ارائه میشوند. پس از دانلود آن ایمیج، این داکرفایل نقطه ورود کد آموزشی را تنظیم میکند.
مرحله 2: ساخت کانتینر
از ترمینال خود، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین میکنید:
PROJECT_ID='your-cloud-project'
یک متغیر با آدرس URL تصویر کانتینر خود در رجیستری کانتینر گوگل تعریف کنید:
IMAGE_URI="gcr.io/$PROJECT_ID/horse-human-codelab:latest"
پیکربندی داکر
gcloud auth configure-docker
سپس، با اجرای دستور زیر از ریشه دایرکتوری vertex-codelab خود، کانتینر را بسازید:
docker build ./ -t $IMAGE_URI
در آخر، آن را به Google Container Registry ارسال کنید:
docker push $IMAGE_URI
مرحله ۳: ایجاد یک فضای ذخیرهسازی ابری
در کار آموزشیمان، مسیر را به یک سطل آمادهسازی (staging bucket) خواهیم رساند.
برای ایجاد یک باکت جدید در پروژه خود، دستور زیر را در ترمینال اجرا کنید.
BUCKET_NAME="gs://${PROJECT_ID}-hptune-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
۷. راهاندازی کار تنظیم هایپرپارامتر
مرحله 1: ایجاد کار آموزشی سفارشی با تنظیم هایپرپارامتر
از طریق لانچر، یک نوتبوک TensorFlow 2 جدید باز کنید.

کیت توسعه نرمافزاری (SDK) مربوط به پایتونِ Vertex AI را وارد کنید.
from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt
برای شروع کار تنظیم هایپرپارامتر، ابتدا باید worker_pool_specs را تعریف کنید که نوع ماشین و تصویر داکر را مشخص میکند. مشخصات زیر یک ماشین با دو پردازنده گرافیکی 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": 2
},
"replica_count": 1,
"container_spec": {
"image_uri": "gcr.io/{PROJECT_ID}/horse-human-codelab:latest"
}
}]
در مرحله بعد، parameter_spec تعریف کنید، که یک دیکشنری است که پارامترهایی را که میخواهید بهینه کنید مشخص میکند. کلید دیکشنری رشتهای است که برای هر هایپرپارامتر به آرگومان خط فرمان اختصاص دادهاید و مقدار دیکشنری، مشخصات پارامتر است.
برای هر هایپرپارامتر، باید نوع و همچنین محدوده مقادیری را که سرویس تنظیم امتحان خواهد کرد، تعریف کنید. هایپرپارامترها میتوانند از نوع Double، Integer، Categorical یا Discrete باشند. اگر نوع Double یا Integer را انتخاب کنید، باید حداقل و حداکثر مقدار را ارائه دهید. و اگر Categorical یا Discrete را انتخاب کنید، باید مقادیر را ارائه دهید. برای انواع Double و Integer، باید مقدار مقیاسبندی را نیز ارائه دهید. میتوانید در این ویدیو درباره نحوه انتخاب بهترین مقیاس بیشتر بیاموزید.
# 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 است که در کد برنامه آموزشی خود تنظیم میکنید و مقدار آن، هدف بهینهسازی است.
# 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'}
پس از تعریف مشخصات، یک CustomJob ایجاد خواهید کرد که مشخصات رایجی است که برای اجرای کار شما در هر یک از آزمایشهای تنظیم هایپرپارامتر استفاده خواهد شد.
شما باید {YOUR_BUCKET} را با باکتی که قبلاً ایجاد کردهاید جایگزین کنید.
# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='horses-humans',
worker_pool_specs=worker_pool_specs,
staging_bucket='gs://{YOUR_BUCKET}')
سپس، HyperparameterTuningJob را ایجاد و اجرا کنید.
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()
چند استدلال وجود دارد که باید به آنها توجه کرد:
- max_trial_count: شما باید برای تعداد آزمایشهایی که سرویس اجرا خواهد کرد، یک حد بالا تعیین کنید. آزمایشهای بیشتر عموماً منجر به نتایج بهتری میشوند، اما نقطهای از بازده نزولی وجود خواهد داشت که پس از آن آزمایشهای اضافی تأثیر کمی یا هیچ تأثیری بر معیاری که سعی در بهینهسازی آن دارید، ندارند. بهترین روش این است که با تعداد کمتری آزمایش شروع کنید و قبل از افزایش مقیاس، میزان تأثیرگذاری هایپرپارامترهای انتخابی خود را ارزیابی کنید.
- parallel_trial_count: اگر از آزمایشهای موازی استفاده میکنید، سرویس چندین خوشه پردازش آموزشی را فراهم میکند. افزایش تعداد آزمایشهای موازی، مدت زمان اجرای کار تنظیم هایپرپارامتر را کاهش میدهد؛ با این حال، میتواند اثربخشی کلی کار را کاهش دهد. دلیل این امر این است که استراتژی تنظیم پیشفرض از نتایج آزمایشهای قبلی برای اطلاعرسانی در مورد تخصیص مقادیر در آزمایشهای بعدی استفاده میکند.
- search_algorithm: میتوانید الگوریتم جستجو را روی شبکهای، تصادفی یا پیشفرض (هیچکدام) تنظیم کنید. گزینه پیشفرض، بهینهسازی بیزی را برای جستجوی فضای مقادیر ممکن ابرپارامتر اعمال میکند و الگوریتم پیشنهادی است. میتوانید اطلاعات بیشتر در مورد این الگوریتم را اینجا بیابید.
به محض شروع کار، میتوانید وضعیت را در رابط کاربری، در زیر تب HYPERPARAMETER TUNING JOBS پیگیری کنید.

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

🎉 تبریک میگویم! 🎉
شما یاد گرفتید که چگونه از Vertex AI برای موارد زیر استفاده کنید:
- اجرای یک کار تنظیم فراپارامتر با آموزش توزیعشده
برای کسب اطلاعات بیشتر در مورد بخشهای مختلف Vertex AI، مستندات را بررسی کنید.
۸. پاکسازی
از آنجا که نوتبوک را طوری پیکربندی کردهایم که پس از ۶۰ دقیقه بیکاری، زمان انقضا داشته باشد، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر میخواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر میخواهید نوتبوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

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