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

1. نظرة عامة

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

المعلومات التي تطّلع عليها

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

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

2. مقدّمة عن Vertex AI

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

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

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

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

ستحتاج إلى مشروع Google Cloud Platform مع تفعيل الفوترة لتشغيل هذا الدرس التطبيقي حول الترميز. لإنشاء مشروع، يُرجى اتّباع التعليمات هنا.

الخطوة 1: تفعيل واجهة برمجة تطبيقات Compute Engine

انتقِل إلى 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. رمز تطبيق التدريب على Containerize

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

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

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

فتح الوحدة الطرفية في ورقة الملاحظات

أنشئ دليلاً جديدًا باسم horses_or_humans وأضِفه إليه:

mkdir horses_or_humans
cd horses_or_humans

الخطوة 1: إنشاء ملف شامل

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

من الوحدة الطرفية، أنشئ ملف Dockerfile فارغًا:

touch 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"]

يستخدم هذا الملف الشامل صورة Deep Learning Container TensorFlow Enterprise 2.7 GPU Docker. تأتي حاويات التعلّم المتعمق على Google Cloud مع العديد من أُطر العمل الشائعة لتعلُّم الآلة وعلوم البيانات والمثبَّتة مسبقًا. بعد تنزيل تلك الصورة، يُعِدّ هذا الملف الشامل نقطة الدخول لرمز التدريب. لم تنشئ هذه الملفات بعد. وفي الخطوة التالية، ستضيف الرمز لتدريب النموذج وضبطه.

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

من Terminal، شغِّل ما يلي لإنشاء دليل لرمز التدريب وملف 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. لاحظ أن الملف الشامل من الخطوة 1 تضمن تعليمات لتثبيت هذه المكتبة.
  2. تحدّد الدالة get_args() وسيطة سطر أوامر لكل معلَمة فائقة تريد ضبطها. في هذا المثال، تكون المعلَمات الفائقة التي سيتم ضبطها هي معدّل التعلّم وقيمة الزخم في أداة التحسين وعدد الوحدات في آخر طبقة مخفية من النموذج، ولكن لا تتردد في تجربة معلَمات أخرى. ويتم بعد ذلك استخدام القيمة التي تم تمريرها في هذه الوسيطات لضبط المعلَمة الفائقة المقابلة في الرمز.
  3. في نهاية الدالة main()، يتم استخدام مكتبة hypertune لتحديد المقياس الذي تريد تحسينه. في TensorFlow، تعرض طريقة keras model.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، ولكنك ستحتاج إلى استخدام السلسلة مرة أخرى لاحقًا عند بدء مهمة ضبط المعلَمة الفائقة.

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

من "المحطة الطرفية"، شغِّل ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال 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 Console:

قائمة 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

بالنسبة إلى النوعين "مزدوج" و"عدد صحيح"، ستحتاج أيضًا إلى تقديم قيمة "تحجيم".

learning_rate_scale

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

momentum_config

numneruons_config

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

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

metric_config

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

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

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

trial_config

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

algorithm_config

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

الخطوة 3: ضبط Compute

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

نوع الجهاز

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

وظائف Hyperparam

عند الانتهاء، ستتمكن من النقر على اسم الوظيفة ورؤية نتائج تجارب التوليف.

مخرجات معلَمة Hyperparam

🎉 تهانينا. 🎉

لقد تعلمت كيفية استخدام Vertex AI لإجراء ما يلي:

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

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

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

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

من "مشغّل التطبيقات"، أنشِئ ورقة ملاحظات TensorFlow 2.

new_notebook

استورِد حزمة تطوير برامج 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 على وحدة التحكّم. إذا كنت ترغب في حذف الدفتر بالكامل، فانقر فوق الزر "Delete" (حذف).

إيقاف المثيل

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

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