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.

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

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

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
افتح 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: إنشاء الحاوية
من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال 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_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)
في هذا القسم، ستتعرّف على كيفية إعداد مهمة التدريب الموزّع وتشغيلها باستخدام حزمة تطوير البرامج (SDK) الخاصة بلغة Python في Vertex AI.
من Launcher، أنشئ دفتر ملاحظات TensorFlow 2.

استورِد حزمة تطوير البرامج (SDK) لخدمة Vertex AI.
from google.cloud import aiplatform
بعد ذلك، حدِّد worker_pool_specs.
توفّر Vertex AI 4 مجموعات من العاملين لتغطية الأنواع المختلفة من مهام الآلة.
تضبط مجموعة العاملين 0 العامل الأساسي أو الرئيسي أو عامل الجدولة أو "الرئيسي". في MultiWorkerMirroredStrategy، يتم تصنيف جميع الآلات على أنّها آلات عاملة، وهي الآلات المادية التي يتم عليها تنفيذ العمليات الحسابية المنسوخة. بالإضافة إلى كل جهاز يعمل كعامل، يجب أن يكون هناك عامل واحد يتولى بعض المهام الإضافية، مثل حفظ نقاط التفتيش وكتابة ملفات الملخّص في TensorBoard. يُعرف هذا الجهاز باسم "الرئيس". لا يمكن أن يكون هناك سوى عامل رئيسي واحد، لذا سيكون عدد العمال في مجموعة العمال 0 دائمًا 1.
مجموعة العمال 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()
في وحدة التحكّم، ستتمكّن من الاطّلاع على مستوى تقدّم مهمتك.

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

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