Vertex AI: ضبط المعلَمة الفائقة

1. نظرة عامة

في هذا الدرس التطبيقي، ستستخدم Vertex AI لتنفيذ مهمة ضبط المعلَمات الفائقة لنموذج TensorFlow. على الرغم من أنّ هذا المختبر يستخدم TensorFlow لرمز النموذج، تنطبق المفاهيم على أُطر تعلُّم الآلة الأخرى أيضًا.

ما ستتعلمه

ستتعرَّف على كيفية:

  • تعديل الرمز البرمجي لتطبيق التدريب لضبط المعلَمة الفائقة تلقائيًا
  • إعداد مهمة ضبط المعلَمات الفائقة وتشغيلها من واجهة مستخدم Vertex AI
  • ضبط مهمة تحسين المعلَمات الفائقة وتشغيلها باستخدام حزمة تطوير البرامج (SDK) من Vertex AI بلغة Python

تبلغ التكلفة الإجمالية لتشغيل هذا المختبر على Google Cloud حوالي 3 دولار أمريكي.

2. مقدمة عن Vertex AI

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

تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي على المنتجات الموضّحة أدناه: التدريب وWorkbench.

نظرة عامة على منتجات Vertex

3- إعداد البيئة

يجب أن يكون لديك مشروع على 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.

لوحة بيانات Vertex AI

الخطوة 4: إنشاء مثيل Vertex AI Workbench

من قسم Vertex AI في Cloud Console، انقر على Workbench:

قائمة Vertex AI

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

Notebook_api

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

Notebooks_UI

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

new_notebook

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

create_notebook

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

idle_timeout

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

enable_terminal

يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.

بعد ذلك، انقر على إنشاء. سيستغرق توفير الجهاز الافتراضي بضع دقائق.

بعد إنشاء المثيل، انقر على فتح JupyterLab.

open_jupyterlab

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

مصادقة

4. تضمين الرمز البرمجي لتطبيق التدريب في حاوية

النموذج الذي ستدرّبه وتعدّله في هذا المختبر هو نموذج لتصنيف الصور تم تدريبه على مجموعة بيانات الخيول أو البشر من TensorFlow Datasets.

سترسل مهمة ضبط المعلمات الفائقة هذه إلى Vertex AI من خلال وضع الرمز البرمجي لتطبيق التدريب في حاوية Docker وإرسال هذه الحاوية إلى Google Container Registry. باستخدام هذا الأسلوب، يمكنك ضبط المعلمات الفائقة لنموذج تم إنشاؤه باستخدام أي إطار عمل.

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

فتح نافذة طرفية في دفتر الملاحظات

أنشئ دليلاً جديدًا باسم 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 العديد من أُطر عمل تعلُّم الآلة وعلم البيانات الشائعة المثبَّتة مسبقًا. بعد تنزيل هذه الصورة، يضبط ملف Dockerfile نقطة الدخول لرمز التدريب. لم يتم إنشاء هذه الملفات بعد. في الخطوة التالية، ستضيف الرمز اللازم لتدريب النموذج وضبطه.

الخطوة 2: إضافة رمز تدريب النموذج

من "وحدة التحكّم"، شغِّل ما يلي لإنشاء دليل لرمز التدريب وملف Python حيث ستضيف الرمز:

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()

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

  1. يستورد النص البرمجي مكتبة hypertune. يُرجى العِلم أنّ ملف Dockerfile من الخطوة 1 يتضمّن تعليمات لتثبيت هذه المكتبة باستخدام pip.
  2. تحدّد الدالة get_args() وسيطة سطر أوامر لكل مَعلم فائق تريد ضبطه. في هذا المثال، ستتمّ ضبط المعلمات الفائقة، وهي معدّل التعلّم وقيمة الزخم في المحسِّن وعدد الوحدات في الطبقة المخفية الأخيرة من النموذج، ولكن يمكنك تجربة معلمات أخرى. يتم بعد ذلك استخدام القيمة التي تم تمريرها في هذه الوسيطات لضبط المعلمة الفائقة المقابلة في الرمز.
  3. في نهاية الدالة 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، ولكن ستحتاج إلى استخدام السلسلة مرة أخرى لاحقًا عند بدء مهمة ضبط المعلمات الفائقة.

الخطوة 3: إنشاء الحاوية

من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:

PROJECT_ID='your-cloud-project'

حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم (URI) لصورة الحاوية في Google Container Registry:

IMAGE_URI="gcr.io/$PROJECT_ID/horse-human:hypertune"

ضبط Docker

gcloud auth configure-docker

بعد ذلك، أنشئ الحاوية من خلال تنفيذ الأمر التالي من جذر دليل horses_or_humans:

docker build ./ -t $IMAGE_URI

أخيرًا، ادفعها إلى Google Container Registry:

docker push $IMAGE_URI

بعد إرسال الحاوية إلى Container Registry، يمكنك الآن بدء مهمة ضبط فائق لمَعلمات النموذج المخصّص.

5- تنفيذ مهمة ضبط المعلَمات الفائقة على Vertex AI

يستخدم هذا المختبر التدريب المخصّص من خلال حاوية مخصّصة على Google Container Registry، ولكن يمكنك أيضًا تشغيل مهمة ضبط المعلَمات الفائقة باستخدام حاوية معدّة مسبقًا في Vertex AI.

للبدء، انتقِل إلى قسم التدريب في قسم Vertex في وحدة تحكّم Cloud:

قائمة uCAIP

الخطوة 1: ضبط مهمة التدريب

انقر على إنشاء لإدخال مَعلمات مهمة ضبط المَعلمات الفائقة.

  • ضمن مجموعة البيانات، اختَر ما مِن مجموعة بيانات مُدارة.
  • بعد ذلك، اختَر التدريب المخصّص (متقدّم) كطريقة التدريب وانقر على متابعة.
  • أدخِل horses-humans-hyptertune (أو أي اسم آخر تريد إطلاقه على نموذجك) في حقل اسم النموذج
  • انقر على متابعة.

في خطوة إعدادات الحاوية، اختَر حاوية مخصّصة:

خيار الحاوية المخصّصة

في المربّع الأول (صورة الحاوية)، أدخِل قيمة المتغيّر IMAGE_URI من القسم السابق. يجب أن يكون: gcr.io/your-cloud-project/horse-human:hypertune، مع اسم مشروعك. اترك بقية الحقول فارغة وانقر على متابعة.

الخطوة 2: ضبط مهمة تحسين المعلمات الفائقة

اختَر تفعيل ضبط المعلَمة الفائقة.

المعلَمات الفائقة

ضبط المَعلمات الفائقة

بعد ذلك، عليك إضافة المَعلمات الفائقة التي ضبطتها كوسيطات سطر أوامر في الرمز البرمجي لتطبيق التدريب. عند إضافة معلَمة فائقة، عليك أولاً تقديم الاسم. يجب أن يتطابق هذا الاسم مع اسم الوسيط الذي تم تمريره إلى argparse.

learning_rate_name

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

learning_rate_typelearning_rate_name

بالنسبة إلى النوعَين Double وInteger، عليك أيضًا تقديم قيمة Scaling.

learning_rate_scale

بعد إضافة المَعلمة الفائقة learning_rate، أضِف مَعلمات momentum وnum_units.

momentum_config

numneruons_config

إعداد المقياس

بعد إضافة المَعلمات الفائقة، عليك تقديم المقياس الذي تريد تحسينه بالإضافة إلى الهدف. يجب أن يكون هذا المعرّف هو نفسه hyperparameter_metric_tag الذي ضبطته في تطبيق التدريب.

metric_config

ستنفّذ خدمة "ضبط المَعلمات الفائقة" في Vertex AI عدة تجارب لتطبيق التدريب باستخدام القيم التي تم ضبطها في الخطوات السابقة. عليك وضع حدّ أقصى لعدد المحاولات التي ستنفّذها الخدمة. تؤدي المزيد من المحاولات بشكل عام إلى نتائج أفضل، ولكن سيأتي وقت تقلّ فيه العائدات، وبعدها لن يكون للمحاولات الإضافية تأثير كبير أو لن يكون لها أي تأثير على المقياس الذي تحاول تحسينه. من أفضل الممارسات البدء بعدد أقل من المحاولات والتعرّف على مدى تأثير المعلمات الفائقة التي اخترتها قبل التوسّع إلى عدد كبير من المحاولات.

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

لأغراض توضيحية، يمكنك ضبط عدد المحاولات على 15 والحد الأقصى لعدد المحاولات المتوازية على 3. يمكنك تجربة أرقام مختلفة، ولكن قد يؤدي ذلك إلى إطالة مدة الضبط وزيادة التكلفة.

trial_config

الخطوة الأخيرة هي اختيار "الخوارزمية التلقائية" كخوارزمية البحث، والتي ستستخدم Google Vizier لإجراء التحسين البايزي لضبط المعلمات الفائقة. مزيد من المعلومات حول هذه الخوارزمية

algorithm_config

انقر على متابعة.

الخطوة 3: ضبط الحساب

في الحوسبة والأسعار، اترك المنطقة المحدّدة كما هي واضبط مجموعة العاملين 0 على النحو التالي.

نوع الجهاز

انقر على بدء التدريب لبدء مهمة ضبط المعلمات الفائقة. في قسم "التدريب" (Training) ضمن علامة التبويب مهام ضبط المعلمات الفائقة (HYPERPARAMETER TUNING JOBS) في وحدة التحكّم، سيظهر لك ما يلي:

مهام Hyperparam

عند الانتهاء، ستتمكّن من النقر على اسم المهمة والاطّلاع على نتائج تجارب الضبط.

نتائج المعلَمات الفائقة

🎉 تهانينا! 🎉

تعرّفت على كيفية استخدام Vertex AI من أجل:

  • ابدأ مهمة ضبط المعلَمة الفائقة لرمز التدريب المقدَّم في حاوية مخصّصة. لقد استخدمت نموذج TensorFlow في هذا المثال، ولكن يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل باستخدام حاويات مخصّصة.

لمزيد من المعلومات عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.

6. [اختياري] استخدام حزمة تطوير البرامج (SDK) الخاصة بـ Vertex

يوضّح القسم السابق كيفية تشغيل مهمة ضبط المعلمات الفائقة من خلال واجهة المستخدم. في هذا القسم، ستتعرّف على طريقة بديلة لإرسال مهمة ضبط المعلمات الفائقة باستخدام Vertex Python API.

من Launcher، أنشئ دفتر ملاحظات TensorFlow 2.

new_notebook

استورِد حزمة تطوير البرامج (SDK) الخاصة بخدمة Vertex AI.

from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt

لبدء مهمة ضبط المعلمات الفائقة، عليك أولاً تحديد المواصفات التالية. عليك استبدال {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 دقيقة، لسنا بحاجة إلى إيقاف الجهاز الظاهري. إذا أردت إيقاف الجهاز الافتراضي يدويًا، انقر على الزر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف".

إيقاف الجهاز الافتراضي

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

حذف مساحة التخزين