إنشاء نموذج أولي لمرحلة الإنتاج: توزيع تدريب على Vertex AI

1. نظرة عامة

في هذا الدرس، ستستخدم Vertex AI لتشغيل وظيفة تدريب موزّعة على Vertex AI Training باستخدام TensorFlow.

يشكّل هذا التمرين المعملي جزءًا من سلسلة فيديوهات النموذج الأوّلي للإنتاج. تأكّد من إكمال الميزات الاختبارية السابقة قبل تجربتها. يمكنك مشاهدة سلسلة الفيديوهات المصاحبة لمعرفة المزيد من المعلومات:

.

ما ستتعرّف عليه

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

  • تشغيل التدريب الموزّع على جهاز واحد مزوّد بوحدات معالجة رسومات متعددة
  • إجراء تدريب موزّع على أجهزة متعدّدة

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

2. مقدمة عن Vertex AI

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

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

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

3- نظرة عامة على التدريب الموزَّع

إذا كان لديك وحدة معالجة رسومات واحدة، سيستخدم TensorFlow هذا المسرّع لتسريع تدريب النموذج بدون أي جهد إضافي من جانبك. ومع ذلك، إذا كنت تريد الحصول على تحسين إضافي من خلال استخدام وحدات معالجة رسومات متعددة، عليك استخدام tf.distribute، وهي وحدة TensorFlow لتشغيل عملية حسابية على أجهزة متعددة.

يستخدم القسم الأول من هذا البرنامج التعليمي tf.distribute.MirroredStrategy، والذي يمكنك إضافته إلى تطبيقات التدريب من خلال إجراء بعض التغييرات على الرمز فقط. تنشئ هذه الاستراتيجية نسخة من النموذج على كل وحدة معالجة رسومات في جهازك. وسيتم إجراء تعديلات التدرج اللوني اللاحقة بشكل متزامن. وهذا يعني أنّ كل وحدة معالجة رسومات تحسب الخطوات إلى الأمام والخلف من خلال النموذج على شريحة مختلفة من بيانات الإدخال. بعد ذلك، يتم تجميع المشتقات المحسوبة من كل شريحة من هذه الشرائح على مستوى جميع وحدات معالجة الرسومات ويتم احتساب متوسطها في عملية تُعرف باسم all-reduce. يتم تعديل مَعلمات النموذج باستخدام هذه التدرجات المتوسطة.

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

لست بحاجة إلى معرفة التفاصيل لإكمال هذه التجربة، ولكن إذا كنت تريد معرفة المزيد عن آلية عمل التدريب الموزّع في TensorFlow، يمكنك الاطّلاع على الفيديو أدناه:

4. إعداد البيئة

أكمِل الخطوات الواردة في الميزة الاختبارية تدريب النماذج المخصّصة باستخدام Vertex AI لإعداد بيئتك.

5- التدريب على استخدام جهاز واحد مع وحدة معالجة رسومات متعددة

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

للبدء، افتح نافذة محطة طرفية من قائمة "المشغِّل" في دفتر ملاحظات Workbench الذي أنشأته في الدروس التطبيقية السابقة.

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

الخطوة 1: كتابة رمز التدريب

أنشئ دليلاً جديدًا باسم flowers-multi-gpu وانتقِل إليه باستخدام الأمر cd:

mkdir flowers-multi-gpu
cd flowers-multi-gpu

نفِّذ ما يلي لإنشاء دليل لرمز التدريب وملف Python الذي ستضيف إليه الرمز البرمجي أدناه.

mkdir trainer
touch trainer/task.py

من المفترض أن يتوفّر لديك الآن ما يلي في دليل flowers-multi-gpu/:

+ trainer/
    + task.py

بعد ذلك، افتح ملف task.py الذي أنشأته وانسخ الرمز أدناه.

عليك استبدال {your-gcs-bucket} في BUCKET_ROOT بحزمة Cloud Storage التي تم تخزين مجموعة بيانات الزهور فيها في الوحدة التجريبية 1.

import tensorflow as tf
import numpy as np
import os

## 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 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():
  '''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(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

def main():  

  # Create distribution strategy
  strategy = tf.distribute.MirroredStrategy()

  # Get data
  GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
  train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

  # Wrap model creation and compilation within scope of strategy
  with strategy.scope():
    model = create_model()
    model.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                  metrics=['accuracy'])

  history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=EPOCHS
  )

  model.save(f'{BUCKET_ROOT}/model_output')


if __name__ == "__main__":
    main()

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

  • في الدالة main()، يتم إنشاء العنصر MirroredStrategy. بعد ذلك، يمكنك إنشاء متغيرات النموذج في نطاق الاستراتيجية. تُعلم هذه الخطوة TensorFlow بالمتغيّرات التي يجب نسخها على وحدات معالجة الرسومات.
  • يتم تكبير حجم الحزمة بمقدار num_replicas_in_sync. يُعدّ تغيير حجم الحزمة من أفضل الممارسات عند استخدام استراتيجيات التوازي المتزامن للبيانات في TensorFlow. يمكنك الاطّلاع على مزيد من المعلومات هنا.

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

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

من Terminal، أنشئ ملف Dockerfile فارغًا في جذر دليل flowers:

touch Dockerfile

من المفترض أن يتوفّر لديك الآن ما يلي في دليل flowers-multi-gpu/:

+ Dockerfile
+ trainer/
    + task.py

افتح Dockerfile وانسخ ما يلي إليه:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

# 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'

حدِّد متغيّرًا باستخدام معرّف الموارد المتسلسل لصورة الحاوية في Artifact Registry:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_distributed:single_machine

ضبط إعدادات Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

بعد ذلك، يمكنك إنشاء الحاوية من خلال تنفيذ ما يلي من جذر دليل flowers-multi-gpu:

docker build ./ -t $IMAGE_URI

أخيرًا، إرساله إلى Artifact Registry:

docker push $IMAGE_URI

بعد دفع الحاوية إلى Artifact Registry، تكون الآن مستعدًا لبدء مهمة التدريب.

الخطوة 4: تشغيل المهمة باستخدام حزمة تطوير البرامج

في هذا القسم، ستتعرّف على كيفية ضبط وبدء مهمة التدريب الموزّع باستخدام حزمة تطوير البرامج (SDK) Vertex AI Python.

من أداة "المشغِّل"، أنشئ دفتر ملاحظات TensorFlow 2.

new_notebook

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

from google.cloud import aiplatform

ثم حدِّد CustomContainerTrainingJob.

عليك استبدال {PROJECT_ID} في container_uri و{YOUR_BUCKET} في staging_bucket.

job = aiplatform.CustomContainerTrainingJob(display_name='flowers-multi-gpu',
                                            container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:single_machine',
                                            staging_bucket='gs://{YOUR_BUCKET}')

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

my_custom_job.run(replica_count=1,
                  machine_type='n1-standard-4',
                  accelerator_type='NVIDIA_TESLA_V100',
                  accelerator_count=2)

في وحدة التحكّم، ستتمكّن من الاطّلاع على مستوى تقدّم وظيفتك.

multigpu_job

6- [اختياري] تدريب متعدّد العمال

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

افتح نافذة طرفية جديدة في مثيل ورقة الملاحظات:

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

الخطوة 1: كتابة رمز التدريب

أنشئ دليلاً جديدًا باسم flowers-multi-machine وانتقِل إليه باستخدام الأمر cd:

mkdir flowers-multi-machine
cd flowers-multi-machine

نفِّذ ما يلي لإنشاء دليل لرمز التدريب وملف Python الذي ستضيف إليه الرمز البرمجي أدناه.

mkdir trainer
touch trainer/task.py

من المفترض أن يتوفّر لديك الآن ما يلي في دليل flowers-multi-machine/:

+ trainer/
    + task.py

بعد ذلك، افتح ملف task.py الذي أنشأته للتو وانسخ الرمز البرمجي أدناه.

عليك استبدال {your-gcs-bucket} في BUCKET_ROOT بحزمة Cloud Storage التي تم تخزين مجموعة بيانات الزهور فيها في الوحدة التجريبية 1.

import tensorflow as tf
import numpy as np
import os

## 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'
SAVE_MODEL_DIR = f'{BUCKET_ROOT}/multi-machine-output'

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():
  '''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(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

def _is_chief(task_type, task_id):
  '''Helper function. Determines if machine is chief.'''

  return task_type == 'chief'


def _get_temp_dir(dirpath, task_id):
  '''Helper function. Gets temporary directory for saving model.'''

  base_dirpath = 'workertemp_' + str(task_id)
  temp_dir = os.path.join(dirpath, base_dirpath)
  tf.io.gfile.makedirs(temp_dir)
  return temp_dir


def write_filepath(filepath, task_type, task_id):
  '''Helper function. Gets filepath to save model.'''

  dirpath = os.path.dirname(filepath)
  base = os.path.basename(filepath)
  if not _is_chief(task_type, task_id):
    dirpath = _get_temp_dir(dirpath, task_id)
  return os.path.join(dirpath, base)

def main():
  # Create distribution strategy
  strategy = tf.distribute.MultiWorkerMirroredStrategy()

  # Get data
  GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
  train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

  # Wrap variable creation within strategy scope
  with strategy.scope():
    model = create_model()
    model.compile(optimizer=tf.keras.optimizers.Adam(),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                  metrics=['accuracy'])

  history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=EPOCHS
  )

  # Determine type and task of the machine from
  # the strategy cluster resolver
  task_type, task_id = (strategy.cluster_resolver.task_type,
                        strategy.cluster_resolver.task_id)

  # Based on the type and task, write to the desired model path
  write_model_path = write_filepath(SAVE_MODEL_DIR, task_type, task_id)
  model.save(write_model_path)

if __name__ == "__main__":
    main()

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

  • في الدالة main()، يتم إنشاء الكائن MultiWorkerMirroredStrategy. بعد ذلك، يمكنك إنشاء متغيرات النموذج في نطاق الاستراتيجية. تُخبر هذه الخطوة المهمة TensorFlow بالمتغيّرات التي يجب نسخها في النُسخ المكرّرة.
  • يتم تكبير حجم الحزمة بمقدار num_replicas_in_sync. يُعدّ تغيير حجم الحزمة من أفضل الممارسات عند استخدام استراتيجيات التوازي المتزامن للبيانات في TensorFlow.
  • يكون حفظ النموذج أكثر تعقيدًا قليلاً في حالة استخدام عدة عاملِين لأنّ الوجهة يجب أن تكون مختلفة لكل عامل. سيحفظ العامل الرئيسي النموذج في دليل النموذج المطلوب، بينما سيحفظ العمال الآخرون النموذج في أدلة مؤقتة. من المهم أن تكون هذه الدلائل المؤقتة فريدة لمنع عدة مستخدمين من الكتابة في الموقع الجغرافي نفسه. يمكن أن يتضمّن الحفظ عمليات جماعية، ما يعني أنّه على جميع العمال الحفظ وليس فقط على رئيس الفريق. تتضمّن الدوالّ _is_chief() و_get_temp_dir() وwrite_filepath() والدالة main() جميعًا رمزًا نموذجيًا يساعد في حفظ النموذج.

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

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

من الوحدة الطرفية، أنشئ ملف Dockerfile في جذر دليل الزهور الخاص بك:

touch Dockerfile

من المفترض أن يتوفّر لديك الآن ما يلي في دليل flowers-multi-machine/:

+ Dockerfile
+ trainer/
    + task.py

افتح الملف الشامل وانسخ ما يلي إليه:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

# 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 الذي أنشأناه في التمرين المعملي الأول.

REPO_NAME='flower-app'

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

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_distributed:multi_machine

ضبط إعدادات Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

بعد ذلك، يمكنك إنشاء الحاوية من خلال تنفيذ ما يلي من جذر دليل flowers-multi-machine:

docker build ./ -t $IMAGE_URI

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

docker push $IMAGE_URI

بعد دفع الحاوية إلى Artifact Registry، تكون الآن مستعدًا لبدء مهمة التدريب.

الخطوة 4: تنفيذ المهمة باستخدام حزمة تطوير البرامج

في هذا القسم، ستتعرّف على كيفية ضبط وبدء مهمة التدريب الموزّع باستخدام حزمة تطوير البرامج (SDK) Vertex AI Python.

من أداة "المشغِّل"، أنشئ دفتر ملاحظات TensorFlow 2.

new_notebook

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

from google.cloud import aiplatform

بعد ذلك، حدِّد worker_pool_specs.

توفّر Vertex AI 4 مجموعات عامل لتغطية الأنواع المختلفة من مهام الآلة.

تهيئ مجموعة العمال 0 العناصر الأساسية أو الرئيس أو أداة الجدولة أو "الرئيسية". في MultiWorkerMirroredStrategy، يتم تصنيف جميع الأجهزة على أنّها أجهزة عامل، وهي الأجهزة المادية التي يتم تنفيذ العمليات الحسابية المكرّرة عليها. بالإضافة إلى أنّ كل جهاز هو عامل، يجب أن يكون هناك عامل واحد يتولّى بعض الأعمال الإضافية، مثل حفظ نقاط التحقق وكتابة ملفات التلخيص في TensorBoard. ويُعرف هذا الجهاز باسم "الجهاز الرئيسي". لا يتوفّر سوى عامل رئيسي واحد، لذا سيكون عدد العمال في مجموعة العمال 0 دائمًا واحدًا.

مجموعة العمال 1 هي المكان الذي تضبط فيه عدد العمال الإضافي للمجموعة.

يمثّل القاموس الأول في قائمة worker_pool_specs مجموعة العمال 0، ويمثّل القاموس الثاني مجموعة العمال 1. في هذا العيّنة، تكون الإعدادات متطابقة. ومع ذلك، إذا أردت التدريب على 3 أجهزة، عليك إضافة عمال إضافيين إلى مجموعة العمال 1 من خلال ضبط replica_count على 2. إذا أردت إضافة وحدات معالجة الرسومات، عليك إضافة الوسيطات accelerator_type وaccelerator_count إلى machine_spec لكلتا مجموعتَي العمال. يُرجى العِلم أنّه إذا كنت تريد استخدام وحدات معالجة الرسومات مع MultiWorkerMirroredStrategy، يجب أن يتضمّن كل جهاز في المجموعة عددًا متطابقًا من وحدات معالجة الرسومات. ولن تنجح المهمة في حال عدم إجراء ذلك.

عليك استبدال {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=[
     {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-4",
        },
        "container_spec": {"image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:multi_machine"}
      },
      {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-4",
        },
        "container_spec": {"image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_distributed:multi_machine"}
      }
          ]

بعد ذلك، أنشئ CustomJob وشغِّله، مع استبدال {YOUR_BUCKET} في staging_bucket بحزمة في مشروعك لعرض الإصدارات التجريبية.

my_custom_job = aiplatform.CustomJob(display_name='flowers-multi-worker',
                                     worker_pool_specs=worker_pool_specs,
                                     staging_bucket='gs://{YOUR_BUCKET}')

my_custom_job.run()

في وحدة التحكّم، ستتمكّن من الاطّلاع على مستوى تقدّم وظيفتك.

multi_worker_job

🎉 تهانينا. 🎉

لقد تعلّمت كيفية استخدام Vertex AI لتنفيذ ما يلي:

  • تشغيل مهام التدريب الموزّعة باستخدام TensorFlow

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

7- تنظيف

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

إيقاف المثيل

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

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