1. نظرة عامة
في هذا الدرس التطبيقي، ستتعلّم كيفية استخدام Vertex AI لضبط المعلَمات الفائقة والتدريب الموزَّع. على الرغم من أنّ هذا المختبر يستخدم TensorFlow لرمز النموذج، تنطبق المفاهيم على أُطر تعلُّم الآلة الأخرى أيضًا.
ما ستتعلمه
ستتعرَّف على كيفية:
- تدريب نموذج باستخدام التدريب الموزّع على حاوية مخصّصة
- إطلاق عدة تجارب لرمز التدريب من أجل ضبط المعلَمات الفائقة تلقائيًا
تبلغ التكلفة الإجمالية لتشغيل هذا الدرس التطبيقي على Google Cloud حوالي 6 دولار أمريكي.
2. مقدّمة عن Vertex AI
يستخدم هذا المختبر أحدث منتج مستند إلى الذكاء الاصطناعي متاح على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة على Google Cloud في تجربة تطوير سلسة. في السابق، كان يمكن الوصول إلى النماذج المدرَّبة باستخدام AutoML والنماذج المخصَّصة من خلال خدمات منفصلة. يجمع العرض الجديد بين كليهما في واجهة برمجة تطبيقات واحدة، بالإضافة إلى منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI. إذا كانت لديك أي ملاحظات، يُرجى الانتقال إلى صفحة الدعم.
تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي على التدريب ومساحة العمل.

3- نظرة عامة على حالة الاستخدام
في هذا المختبر، ستستخدم ميزة "ضبط المعلمات الفائقة" لاكتشاف المعلمات المثالية لنموذج تصنيف الصور الذي تم تدريبه على مجموعة بيانات "خيول أو بشر" من TensorFlow Datasets.
Hyperparameter Tuning
تعمل ميزة ضبط المَعلمات الفائقة باستخدام خدمة Vertex AI Training من خلال تنفيذ محاولات متعددة لتطبيق التدريب مع قيم للمَعلمات الفائقة التي تختارها، ويتم ضبطها ضمن الحدود التي تحدّدها. تتتبّع Vertex AI نتائج كل تجربة وتجري تعديلات على التجارب اللاحقة.
لاستخدام ميزة "ضبط المعلَمات الفائقة" مع Vertex AI Training، عليك إجراء تغييرَين على رمز التدريب:
- حدِّد وسيط سطر أوامر في وحدة التدريب الرئيسية لكلّ مَعلمة فائقة تريد ضبطها.
- استخدِم القيمة التي تم تمريرها في هذه الوسيطات لضبط المعلمة الفائقة المقابلة في رمز تطبيقك.
التدريب الموزَّع
إذا كان لديك وحدة معالجة رسومات واحدة، سيستخدم TensorFlow هذا المسرِّع لتسريع تدريب النموذج بدون أي جهد إضافي من جانبك. ومع ذلك، إذا كنت تريد الحصول على تعزيز إضافي من استخدام وحدات معالجة الرسومات المتعددة، عليك استخدام tf.distribute، وهي وحدة TensorFlow لتنفيذ عملية حسابية على أجهزة متعددة.
يستخدم هذا المختبر tf.distribute.MirroredStrategy، ويمكنك إضافته إلى تطبيقات التدريب من خلال إجراء بعض التغييرات على الرمز فقط. تنشئ هذه الاستراتيجية نسخة من النموذج على كل وحدة معالجة رسومات في جهازك. سيتم إجراء تحديثات التدرّج اللاحقة بشكل متزامن. وهذا يعني أنّ كل وحدة معالجة رسومات تحسب عمليات التمرير الأمامي والخلفي عبر النموذج على شريحة مختلفة من بيانات الإدخال. يتم بعد ذلك تجميع التدرجات المحسوبة من كل شريحة من هذه الشرائح على مستوى جميع وحدات معالجة الرسومات، ويتم حساب متوسطها في عملية تُعرف باسم all-reduce. يتم تعديل مَعلمات النموذج باستخدام هذه التدرّجات المتوسطة.
لست بحاجة إلى معرفة التفاصيل لإكمال هذه الميزة الاختبارية، ولكن إذا أردت معرفة المزيد عن طريقة عمل التدريب الموزّع في TensorFlow، يمكنك مشاهدة الفيديو أدناه:
4. إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Container Registry API
انتقِل إلى Container Registry وانقر على تفعيل إذا لم يكن مفعّلاً بعد. ستستخدم هذا المعرّف لإنشاء حاوية لمهمة التدريب المخصّصة.
الخطوة 3: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

الخطوة 4: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:

فعِّل واجهة برمجة التطبيقات Notebooks API إذا لم تكن مفعَّلة بعد.

بعد التفعيل، انقر على دفاتر الملاحظات المُدارة:

بعد ذلك، انقر على دفتر ملاحظات جديد.

أدخِل اسمًا لدفتر الملاحظات، ثم انقر على الإعدادات المتقدّمة.

ضمن "الإعدادات المتقدّمة"، فعِّل ميزة "إيقاف التشغيل عند عدم النشاط" واضبط عدد الدقائق على 60. هذا يعني أنّه سيتم إيقاف دفتر الملاحظات تلقائيًا عند عدم استخدامه حتى لا تتكبّد تكاليف غير ضرورية.

ضمن "الأمان" (Security)، اختَر "تفعيل الجهاز" (Enable terminal) إذا لم يكن مفعّلاً.

يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء. سيستغرق توفير الجهاز الافتراضي بضع دقائق.
بعد إنشاء المثيل، انقر على فتح JupyterLab.

في المرة الأولى التي تستخدم فيها مثيلاً جديدًا، سيُطلب منك المصادقة. اتّبِع الخطوات الواردة في واجهة المستخدم لإجراء ذلك.

5- كتابة رمز التدريب
للبدء، افتح نافذة "محطة طرفية" من قائمة "مشغّل التطبيقات" في مثيل دفتر الملاحظات:

أنشئ دليلاً جديدًا باسم vertex-codelab وانتقِل إليه باستخدام الأمر cd.
mkdir vertex-codelab
cd vertex-codelab
نفِّذ ما يلي لإنشاء دليل لرمز التدريب وملف Python ستضيف فيه الرمز:
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 بالمتغيرات التي يجب نسخها على جميع وحدات معالجة الرسومات. - يتم زيادة حجم الدفعة بمقدار
num_replicas_in_sync. يُعدّ تغيير حجم الدُفعة من أفضل الممارسات عند استخدام استراتيجيات التوازي المتزامن للبيانات في TensorFlow. مزيد من المعلومات
Hyperparameter Tuning
- يستورد النص البرمجي مكتبة
hypertune. في وقت لاحق عندما ننشئ صورة الحاوية، علينا التأكّد من تثبيت هذه المكتبة. - تحدّد الدالة
get_args()وسيطة سطر أوامر لكل مَعلم فائق تريد ضبطه. في هذا المثال، ستتمّ ضبط المعلمات الفائقة، وهي معدّل التعلّم وقيمة الزخم في المحسِّن وعدد الوحدات في الطبقة المخفية الأخيرة من النموذج، ولكن يمكنك تجربة معلمات أخرى. يتم بعد ذلك استخدام القيمة التي تم تمريرها في هذه الوسيطات لضبط المعلمة الفائقة المقابلة في الرمز (مثل، ضبطlearning_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، ولكن ستحتاج إلى استخدام السلسلة مرة أخرى لاحقًا عند بدء مهمة ضبط المعلمات الفائقة.
6. تضمين الرمز البرمجي في حاوية
تتمثّل الخطوة الأولى في إنشاء حاوية لرمزك في إنشاء ملف Dockerfile. في Dockerfile، ستضمّن جميع الأوامر اللازمة لتشغيل الصورة. سيتم تثبيت جميع المكتبات الضرورية وإعداد نقطة الدخول لرمز التدريب.
الخطوة 1: كتابة Dockerfile
من "الوحدة الطرفية"، تأكَّد من أنّك في الدليل vertex-codelab وأنشئ ملف Dockerfile فارغًا:
touch Dockerfile
من المفترض أن يتضمّن دليل vertex-codelab الآن ما يلي:
+ Dockerfile
+ trainer/
+ task.py
افتح 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 هذا صورة Docker لوحدة معالجة الرسومات في Deep Learning Container TensorFlow Enterprise 2.7. تتضمّن حزم Deep Learning Containers على Google Cloud العديد من أُطر عمل تعلُّم الآلة وعلم البيانات الشائعة المثبَّتة مسبقًا. بعد تنزيل هذه الصورة، يضبط ملف Dockerfile نقطة الدخول لرمز التدريب.
الخطوة 2: إنشاء الحاوية
من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم (URI) لصورة الحاوية في Google Container Registry:
IMAGE_URI="gcr.io/$PROJECT_ID/horse-human-codelab:latest"
ضبط Docker
gcloud auth configure-docker
بعد ذلك، أنشئ الحاوية من خلال تنفيذ الأمر التالي من جذر دليل vertex-codelab:
docker build ./ -t $IMAGE_URI
أخيرًا، ادفعها إلى Google Container Registry:
docker push $IMAGE_URI
الخطوة 3: إنشاء حزمة Cloud Storage
في مهمة التدريب، سنمرّر المسار إلى حزمة مرحلية.
نفِّذ ما يلي في "الوحدة الطرفية" لإنشاء حزمة جديدة في مشروعك.
BUCKET_NAME="gs://${PROJECT_ID}-hptune-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
7. تشغيل مهمة ضبط المَعلمات الفائقة
الخطوة 1: إنشاء مهمة تدريب مخصّصة مع ضبط المعلمات الفائقة
من مشغّل التطبيقات، افتح دفتر ملاحظات TensorFlow 2 جديدًا.

استورِد حزمة تطوير البرامج (SDK) من Vertex AI في Python.
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": 2
},
"replica_count": 1,
"container_spec": {
"image_uri": "gcr.io/{PROJECT_ID}/horse-human-codelab: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 الذي تحدّده في الرمز البرمجي لتطبيق التدريب، والقيمة هي هدف التحسين.
# 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: يمكنك ضبط خوارزمية البحث على "شبكة" أو "عشوائي" أو "تلقائي" (None). يطبّق الخيار التلقائي التحسين البايزي للبحث في مساحة قيم المعلمات الفائقة المحتملة، وهو الخوارزمية المقترَحة. يمكنك الاطّلاع على مزيد من المعلومات حول هذه الخوارزمية هنا.
بعد بدء المهمة، ستتمكّن من تتبُّع الحالة في واجهة المستخدم ضمن علامة التبويب مَهام ضبط المعلمات الفائقة.

بعد اكتمال المهمة، يمكنك عرض نتائج التجارب وترتيبها لاكتشاف أفضل مجموعة من قيم المَعلمات الفائقة.

🎉 تهانينا! 🎉
تعرّفت على كيفية استخدام Vertex AI من أجل:
- تشغيل مهمة ضبط المعلَمة الفائقة باستخدام التدريب الموزّع
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex AI، اطّلِع على المستندات.
8. تنظيف
بما أنّنا ضبطنا دفتر الملاحظات على أن تنتهي مهلة عدم النشاط بعد 60 دقيقة، لسنا بحاجة إلى إيقاف الجهاز الظاهري. إذا أردت إيقاف الجهاز الافتراضي يدويًا، انقر على الزر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف".

لحذف حزمة التخزين، استخدِم قائمة التنقّل في Cloud Console، وانتقِل إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":
