1. نظرة عامة
في هذا الدرس التطبيقي، ستستخدم Vertex AI لتشغيل مهمة ضبط المعلَمات الفائقة على Vertex AI Training.
هذا المختبر هو جزء من سلسلة فيديوهات من النموذج الأوّلي إلى الإنتاج. احرِص على إكمال المختبر السابق قبل تجربة هذا المختبر. يمكنك مشاهدة سلسلة الفيديوهات المصاحبة لمعرفة المزيد:
.
ما ستتعلمه
ستتعرَّف على كيفية:
- تعديل الرمز البرمجي لتطبيق التدريب لضبط المعلَمة الفائقة تلقائيًا
- ضبط مهمة ضبط المعلَمات الفائقة وتشغيلها باستخدام حزمة تطوير البرامج (SDK) للغة Python في Vertex AI
يبلغ إجمالي تكلفة تشغيل هذا الدرس التطبيقي على 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، يعرض الإجراء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، ولكن ستحتاج إلى استخدام السلسلة مرة أخرى لاحقًا عند بدء مهمة ضبط المعلمات الفائقة.
الخطوة 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: إنشاء الحاوية
من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
حدِّد مستودعًا في Artifact Registry. سنستخدم مستودع الرموز الذي أنشأناه في الدرس التطبيقي الأول.
REPO_NAME='flower-app'
حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم (URI) لصورة الحاوية في 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.
من Launcher، أنشئ دفتر ملاحظات 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، عليك أيضًا تقديم قيمة 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، وانتقِل إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":
