1. نظرة عامة
في هذا الدرس التطبيقي، ستستخدم Vertex AI لتشغيل مهمة ضبط المَعلمات الفائقة في أداة "تدريب Vertex AI".
يشكّل هذا التمرين المعملي جزءًا من سلسلة فيديوهات النموذج الأوّلي للإنتاج. تأكّد من إكمال الدرس التطبيقي السابق قبل تجربته. يمكنك مشاهدة سلسلة الفيديوهات المصاحبة للحصول على مزيد من المعلومات:
.
ما ستتعرّف عليه
وستتعرّف على كيفية:
- تعديل رمز تطبيق التدريب لضبط المَعلمات الفائقة تلقائيًا
- ضبط وبدء مهمة ضبط المَعلمات الفائقة باستخدام حزمة تطوير البرامج (SDK) Vertex AI Python
تبلغ التكلفة الإجمالية لتنفيذ هذا البرنامج التدريبي على Google Cloud حوالي $1.
2. مقدّمة عن Vertex AI
يستخدم هذا المختبر أحدث منتجات الذكاء الاصطناعي المتاحة على Google Cloud. تدمج Vertex AI حلول تعلُّم الآلة في Google Cloud ضمن تجربة تطوير سلسة. في السابق، كان بالإمكان الوصول إلى النماذج المدربة باستخدام AutoML والنماذج المخصّصة من خلال خدمات منفصلة. ويجمع العرض الجديد بين الاثنين في واجهة برمجة تطبيقات واحدة، إلى جانب منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI.
تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم سير عمل تعلُّم الآلة من البداية إلى النهاية. سيركّز هذا الدرس التطبيقي على المنتجات المميّزة أدناه: التدريب وWorkbench.
3- إعداد البيئة
أكمِل الخطوات الواردة في مختبر تدريب النماذج المخصّصة باستخدام Vertex AI لإعداد بيئتك.
4. حاوية رمز تطبيق التدريب
ستُرسِل مهمة التدريب هذه إلى Vertex AI عن طريق وضع رمز تطبيق التدريب في حاوية Docker ودفع هذه الحاوية إلى Google Artifact Registry. باستخدام هذا النهج، يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل وضبطه.
للبدء، افتح نافذة محطة طرفية من قائمة "المشغِّل" في دفتر ملاحظات Workbench الذي أنشأته في الدروس التطبيقية السابقة.
الخطوة 1: كتابة رمز التدريب
أنشئ دليلاً جديدًا باسم flowers-hptune
وانتقِل إليه باستخدام الأمر cd:
mkdir flowers-hptune
cd flowers-hptune
نفِّذ ما يلي لإنشاء دليل لرمز التدريب وملف Python الذي ستضيف إليه الرمز البرمجي أدناه.
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()
قبل إنشاء الحاوية، لنلقِ نظرة أعمق على الرمز البرمجي. هناك بعض المكوّنات التي تخصّ استخدام خدمة ضبط المَعلمات الفائقة.
- يستورد النص البرمجي مكتبة
hypertune
. - تحدّد الدالة
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
، ولكن عليك استخدام السلسلة مرة أخرى لاحقًا عند بدء مهمة ضبط المدخلات الفائقة.
الخطوة 2: إنشاء ملف شامل
لتضمين الرمز البرمجي في حاوية، عليك إنشاء ملف Dockerfile. في Dockerfile، ستضمّن جميع الأوامر اللازمة لتشغيل الصورة. سيتم تثبيت جميع المكتبات اللازمة وإعداد نقطة الدخول لرمز التدريب.
من Terminal، أنشئ ملف Dockerfile فارغًا في جذر دليل flowers-hptune
:
touch Dockerfile
من المفترض أن يتوفّر لديك الآن ما يلي في دليل flowers-hptune/
:
+ Dockerfile
+ trainer/
+ task.py
افتح ملف Dockerfile وانسخ ما يلي إليه. ستلاحظ أن هذا الملف متطابق تقريبًا مع ملف Dockerfile الذي استخدمناه في التمرين المعملي الأول، باستثناء أننا نثبّت الآن مكتبة cloudml- Hyertune.
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: إنشاء الحاوية
من Terminal، نفِّذ ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال your-cloud-project
بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
حدِّد مستودعًا في Artifact Registry. سنستخدم المستودع الذي أنشأناه في الدرس التطبيقي الأول.
REPO_NAME='flower-app'
حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم لصورة الحاوية في Google Artifact Registry:
IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_hptune:latest
ضبط إعدادات Docker
gcloud auth configure-docker \
us-central1-docker.pkg.dev
بعد ذلك، يمكنك إنشاء الحاوية من خلال تنفيذ ما يلي من جذر دليل flower-hptune
:
docker build ./ -t $IMAGE_URI
أخيرًا، إرساله إلى Artifact Registry:
docker push $IMAGE_URI
بعد دفع الحاوية إلى Artifact Registry، تكون الآن مستعدًا لبدء مهمة التدريب.
5- تشغيل وظيفة ضبط المَعلمات الفائقة باستخدام حزمة تطوير البرامج (SDK)
في هذا القسم، ستتعرّف على كيفية ضبط وظيفة ضبط المَعلمات الفائقة وإرسالها باستخدام Vertex Python API.
من أداة "المشغِّل"، أنشئ دفتر ملاحظات TensorFlow 2.
استورِد حزمة تطوير البرامج (SDK) لخدمة Vertex AI.
from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt
لبدء مهمة ضبط المَعلمات الفائقة، عليك أولاً تحديد 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، عليك تقديم حدّ أدنى وحدّ أقصى للقيمة. وإذا اخترت "فئوية" أو "متقطّعة"، عليك تقديم القيم. بالنسبة إلى نوعَي 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: يمكنك ضبط خوارزمية البحث على شبكة أو عشوائي أو تلقائي (بدون). يُطبق الخيار الافتراضي تحسين بايز للبحث في مساحة قيم المعلمات الفائقة المحتملة وهو الخوارزمية الموصى بها. يمكنك الاطّلاع على مزيد من المعلومات عن هذه الخوارزمية هنا.
في وحدة التحكّم، ستتمكّن من الاطّلاع على مستوى تقدّم وظيفتك.
وعند الانتهاء، يمكنك الاطّلاع على نتائج كلّ تجربة ومجموعة القيم التي حقّقت أفضل أداء.
🎉 تهانينا. 🎉
لقد تعلّمت كيفية استخدام Vertex AI لتنفيذ ما يلي:
- تشغيل مهمة ضبط معلَمة فائقة
لمعرفة المزيد عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.
6- تنظيف
بما أنّنا ضبطنا دفتر البيانات على إيقافه بعد 60 دقيقة من عدم النشاط، لا داعي للقلق بشأن إيقافه. إذا أردت إيقاف المثيل يدويًا، انقر على زر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا كنت ترغب في حذف المفكرة بالكامل، فانقر فوق الزر حذف.
لحذف حزمة التخزين، استخدِم قائمة التنقّل في Cloud Console للانتقال إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":