نمونه اولیه برای تولید: آموزش توزیع شده در Vertex AI

۱. مرور کلی

در این آزمایش، شما از Vertex AI برای اجرای یک کار آموزشی توزیع‌شده روی Vertex AI Training با استفاده از TensorFlow استفاده خواهید کرد.

این آزمایشگاه بخشی از مجموعه ویدیوهای «نمونه اولیه تا تولید» است. قبل از انجام این آزمایش، حتماً آزمایش‌های قبلی را انجام دهید. برای کسب اطلاعات بیشتر می‌توانید مجموعه ویدیوهای همراه را تماشا کنید:

.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • اجرای آموزش توزیع‌شده روی یک دستگاه واحد با چندین پردازنده گرافیکی
  • اجرای آموزش توزیع‌شده در چندین ماشین

هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۲ دلار است.

۲. مقدمه‌ای بر هوش مصنوعی ورتکس

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می‌کند. Vertex AI، محصولات یادگیری ماشین را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می‌کند. پیش از این، مدل‌های آموزش‌دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. این محصول جدید، هر دو را در یک API واحد، به همراه سایر محصولات جدید، ترکیب می‌کند. همچنین می‌توانید پروژه‌های موجود را به Vertex AI منتقل کنید.

Vertex AI شامل محصولات مختلفی برای پشتیبانی از گردش‌های کاری یادگیری ماشینی سرتاسری است. این آزمایشگاه بر روی محصولات برجسته زیر تمرکز خواهد کرد: آموزش و میز کار

بررسی اجمالی محصولات ورتکس

۳. مرور کلی آموزش توزیع‌شده

اگر یک پردازنده گرافیکی (GPU) واحد دارید، TensorFlow از این شتاب‌دهنده برای سرعت بخشیدن به آموزش مدل بدون هیچ کار اضافی از جانب شما استفاده می‌کند. با این حال، اگر می‌خواهید از استفاده از چندین پردازنده گرافیکی (GPU) بهره بیشتری ببرید، باید از tf.distribute استفاده کنید که ماژول TensorFlow برای اجرای محاسبات در چندین دستگاه است.

بخش اول این آزمایش از tf.distribute.MirroredStrategy استفاده می‌کند که می‌توانید آن را تنها با چند تغییر کد به برنامه‌های آموزشی خود اضافه کنید. این استراتژی یک کپی از مدل را در هر GPU روی دستگاه شما ایجاد می‌کند. به‌روزرسانی‌های بعدی گرادیان به صورت همزمان انجام می‌شوند. این بدان معناست که هر GPU عبورهای رو به جلو و عقب را از طریق مدل روی برش متفاوتی از داده‌های ورودی محاسبه می‌کند. گرادیان‌های محاسبه شده از هر یک از این برش‌ها سپس در تمام GPUها جمع شده و در فرآیندی که به عنوان all-reduce شناخته می‌شود، میانگین‌گیری می‌شوند. پارامترهای مدل با استفاده از این گرادیان‌های میانگین‌گیری شده به‌روزرسانی می‌شوند.

بخش اختیاری در انتهای تمرین از tf.distribute.MultiWorkerMirroredStrategy استفاده می‌کند که مشابه MirroredStrategy است با این تفاوت که روی چندین ماشین کار می‌کند. هر یک از این ماشین‌ها نیز ممکن است چندین GPU داشته باشند. مانند MirroredStrategy ، MultiWorkerMirroredStrategy یک استراتژی موازی‌سازی داده‌های همزمان است که می‌توانید تنها با چند تغییر کد از آن استفاده کنید. تفاوت اصلی هنگام حرکت از موازی‌سازی داده‌های همزمان روی یک ماشین به چند ماشین این است که گرادیان‌ها در انتهای هر مرحله اکنون باید در تمام GPUهای یک ماشین و در تمام ماشین‌های موجود در خوشه همگام‌سازی شوند.

برای تکمیل این آزمایش نیازی به دانستن جزئیات ندارید، اما اگر می‌خواهید درباره نحوه کار آموزش توزیع‌شده در TensorFlow بیشتر بدانید، ویدیوی زیر را ببینید:

۴. محیط خود را آماده کنید

مراحل آموزش مدل‌های سفارشی با آزمایشگاه Vertex AI را برای راه‌اندازی محیط خود تکمیل کنید.

۵. آموزش تک ماشین، چند پردازنده گرافیکی

شما با قرار دادن کد برنامه آموزشی خود در یک کانتینر Docker و ارسال این کانتینر به Google Artifact Registry ، کار آموزشی توزیع‌شده خود را به Vertex AI ارسال خواهید کرد. با استفاده از این رویکرد، می‌توانید مدلی را که با هر چارچوبی ساخته شده است، آموزش دهید.

برای شروع، از منوی Launcher نوت‌بوک Workbench که در آزمایش‌های قبلی ایجاد کرده‌اید، یک پنجره ترمینال باز کنید.

ترمینال را در نوت بوک باز کنید

مرحله ۱: نوشتن کد آموزشی

یک دایرکتوری جدید به نام flowers-multi-gpu ایجاد کنید و با دستور cd به آن وارد شوید:

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

دستور زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون ایجاد شود که کد زیر را در آن اضافه خواهید کرد.

mkdir trainer
touch trainer/task.py

اکنون باید موارد زیر را در دایرکتوری flowers-multi-gpu/ خود داشته باشید:

+ trainer/
    + task.py

سپس، فایل task.py که ایجاد کردید را باز کنید و کد زیر را در آن کپی کنید.

شما باید {your-gcs-bucket} در BUCKET_ROOT با باکت Cloud Storage که مجموعه داده‌های گل‌ها را در تمرین ۱ ذخیره کرده‌اید، جایگزین کنید.

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 می‌گوید که کدام متغیرها باید در GPUها منعکس شوند.
  • اندازه دسته توسط num_replicas_in_sync افزایش می‌یابد. افزایش اندازه دسته، بهترین روش هنگام استفاده از استراتژی‌های موازی‌سازی داده‌های همزمان در TensorFlow است. می‌توانید اطلاعات بیشتر را اینجا بخوانید.

مرحله ۲: ایجاد یک داکرفایل

برای کانتینرایز کردن کد خود، باید یک Dockerfile ایجاد کنید. در Dockerfile تمام دستورات مورد نیاز برای اجرای تصویر را قرار خواهید داد. این فایل تمام کتابخانه‌های لازم را نصب کرده و نقطه ورود کد آموزشی را تنظیم می‌کند.

از طریق ترمینال خود، یک Dockerfile خالی در ریشه دایرکتوری flowers خود ایجاد کنید:

touch Dockerfile

اکنون باید موارد زیر را در دایرکتوری flowers-multi-gpu/ خود داشته باشید:

+ Dockerfile
+ trainer/
    + task.py

فایل Docker را باز کنید و موارد زیر را در آن کپی کنید:

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: ساخت کانتینر

از ترمینال خود، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین می‌کنید:

PROJECT_ID='your-cloud-project'

یک مخزن در رجیستری مصنوعات ایجاد کنید. ما از مخزنی که در تمرین اول ایجاد کردیم استفاده خواهیم کرد.

REPO_NAME='flower-app'

یک متغیر با URI تصویر کانتینر خود در رجیستری Artifact تعریف کنید:

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

پیکربندی داکر

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

سپس، با اجرای دستور زیر از ریشه دایرکتوری flowers-multi-gpu کانتینر را بسازید:

docker build ./ -t $IMAGE_URI

در آخر، آن را به رجیستری مصنوعات (Artifact Registry) منتقل کنید:

docker push $IMAGE_URI

با قرار دادن کانتینر در فهرست آثار باستانی، اکنون آماده‌اید تا کار آموزشی را شروع کنید.

مرحله ۴: اجرای کار با SDK

در این بخش، نحوه پیکربندی و راه‌اندازی کار آموزشی توزیع‌شده با استفاده از Vertex AI Python SDK را خواهید دید.

از طریق Launcher، یک دفترچه یادداشت TensorFlow 2 ایجاد کنید.

نوت بوک_جدید

Vertex AI SDK را وارد کنید.

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}')

پس از تعریف کار، می‌توانید آن را اجرا کنید. تعداد شتاب‌دهنده‌ها را روی ۲ تنظیم خواهید کرد. اگر فقط از ۱ پردازنده گرافیکی استفاده کنیم، این آموزش توزیع‌شده محسوب نمی‌شود . آموزش توزیع‌شده روی یک دستگاه زمانی است که از ۲ یا چند شتاب‌دهنده استفاده می‌کنید.

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

در کنسول، می‌توانید پیشرفت کار خود را مشاهده کنید.

multigpu_job

۶. [اختیاری] آموزش چندکارگری

حالا که آموزش توزیع‌شده را روی یک ماشین واحد با چندین پردازنده گرافیکی امتحان کرده‌اید، می‌توانید مهارت‌های آموزش توزیع‌شده خود را با آموزش در چندین ماشین به سطح بالاتری ببرید. برای کاهش هزینه‌ها، ما هیچ پردازنده گرافیکی به آن ماشین‌ها اضافه نمی‌کنیم، اما اگر مایل باشید می‌توانید با اضافه کردن پردازنده‌های گرافیکی آزمایش کنید.

یک پنجره ترمینال جدید در نمونه نوت‌بوک خود باز کنید:

ترمینال را در نوت بوک باز کنید

مرحله ۱: نوشتن کد آموزشی

یک دایرکتوری جدید به نام flowers-multi-machine ایجاد کنید و با دستور cd به آن وارد شوید:

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

دستور زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون ایجاد شود که کد زیر را در آن اضافه خواهید کرد.

mkdir trainer
touch trainer/task.py

اکنون باید موارد زیر را در دایرکتوری flowers-multi-machine/ خود داشته باشید:

+ trainer/
    + task.py

سپس، فایل task.py که ایجاد کردید را باز کنید و کد زیر را در آن کپی کنید.

شما باید {your-gcs-bucket} در BUCKET_ROOT با باکت Cloud Storage که مجموعه داده‌های گل‌ها را در تمرین ۱ ذخیره کرده‌اید، جایگزین کنید.

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() همگی شامل کد تکراری هستند که به ذخیره مدل کمک می‌کنند.

مرحله ۲: ایجاد یک داکرفایل

برای کانتینرایز کردن کد خود، باید یک Dockerfile ایجاد کنید. در Dockerfile تمام دستورات مورد نیاز برای اجرای تصویر را قرار خواهید داد. این فایل تمام کتابخانه‌های لازم را نصب کرده و نقطه ورود کد آموزشی را تنظیم می‌کند.

از طریق ترمینال خود، یک Dockerfile خالی در ریشه دایرکتوری flowers خود ایجاد کنید:

touch Dockerfile

اکنون باید موارد زیر را در دایرکتوری flowers-multi-machine/ خود داشته باشید:

+ Dockerfile
+ trainer/
    + task.py

فایل Docker را باز کنید و موارد زیر را در آن کپی کنید:

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: ساخت کانتینر

از ترمینال خود، دستور زیر را برای تعریف یک متغیر env برای پروژه خود اجرا کنید، و مطمئن شوید که your-cloud-project را با شناسه پروژه خود جایگزین می‌کنید:

PROJECT_ID='your-cloud-project'

یک مخزن در رجیستری مصنوعات ایجاد کنید. ما از مخزنی که در تمرین اول ایجاد کردیم استفاده خواهیم کرد.

REPO_NAME='flower-app'

یک متغیر با URI تصویر کانتینر خود در Google Artifact Registry تعریف کنید:

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

پیکربندی داکر

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

سپس، با اجرای دستور زیر از ریشه دایرکتوری flowers-multi-machine ، کانتینر را بسازید:

docker build ./ -t $IMAGE_URI

در آخر، آن را به رجیستری مصنوعات (Artifact Registry) منتقل کنید:

docker push $IMAGE_URI

با قرار دادن کانتینر در فهرست آثار باستانی، اکنون آماده‌اید تا کار آموزشی را شروع کنید.

مرحله ۴: اجرای کار با SDK

در این بخش، نحوه پیکربندی و راه‌اندازی کار آموزشی توزیع‌شده با استفاده از Vertex AI Python SDK را خواهید دید.

از طریق Launcher، یک دفترچه یادداشت TensorFlow 2 ایجاد کنید.

نوت بوک_جدید

Vertex AI SDK را وارد کنید.

from google.cloud import aiplatform

سپس، worker_pool_specs را تعریف کنید.

Vertex AI چهار گروه کاری (worker pool) برای پوشش انواع مختلف وظایف ماشینی فراهم می‌کند.

Worker pool 0، Primary، chief، scheduler یا "master" را پیکربندی می‌کند. در MultiWorkerMirroredStrategy ، همه ماشین‌ها به عنوان worker تعیین می‌شوند، که ماشین‌های فیزیکی هستند که محاسبات تکثیر شده روی آنها اجرا می‌شود. علاوه بر اینکه هر ماشین یک worker است، باید یک worker وجود داشته باشد که کارهای اضافی مانند ذخیره Checkpointها و نوشتن فایل‌های خلاصه در TensorBoard را انجام دهد. این ماشین به عنوان chief شناخته می‌شود. فقط یک worker chief وجود دارد، بنابراین تعداد worker شما برای Worker pool 0 همیشه ۱ خواهد بود.

Worker Pool 1 جایی است که شما Worker های اضافی را برای کلاستر خود پیکربندی می‌کنید.

اولین دیکشنری در لیست worker_pool_specs نشان دهنده Worker pool 0 و دومین دیکشنری نشان دهنده Worker pool 1 است. در این نمونه، دو پیکربندی یکسان هستند. با این حال، اگر می‌خواستید روی ۳ ماشین آموزش دهید، باید با تنظیم replica_count روی ۲، workerهای بیشتری را به Worker pool 1 اضافه کنید. اگر می‌خواستید GPU اضافه کنید، باید آرگومان‌های accelerator_type و accelerator_count را برای هر دو worker pool به machine_spec اضافه کنید. توجه داشته باشید که اگر می‌خواهید از GPUها با MultiWorkerMirroredStrategy استفاده کنید، هر ماشین در خوشه باید تعداد یکسانی GPU داشته باشد. در غیر این صورت، کار با شکست مواجه خواهد شد.

شما باید {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 با یک 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، مستندات آن را بررسی کنید.

۷. پاکسازی

از آنجا که نوت‌بوک را طوری پیکربندی کرده‌ایم که پس از ۶۰ دقیقه بیکاری، زمان انقضا داشته باشد، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می‌خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می‌خواهید نوت‌بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

مثال را متوقف کنید

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:

حذف فضای ذخیره‌سازی