প্রোটোটাইপ টু প্রোডাকশন: ভার্টেক্স এআই-এর উপর প্রশিক্ষণ বিতরণ করা হয়েছে

১. সংক্ষিপ্ত বিবরণ

এই ল্যাবে, আপনি TensorFlow ব্যবহার করে Vertex AI Training-এর উপর একটি ডিস্ট্রিবিউটেড ট্রেনিং জব চালাবেন।

এই ল্যাবটি ‘প্রোটোটাইপ টু প্রোডাকশন ’ ভিডিও সিরিজের একটি অংশ। এটি করার আগে আগের ল্যাবগুলো অবশ্যই সম্পন্ন করবেন। আরও জানতে আপনি এর সাথে থাকা ভিডিও সিরিজটি দেখতে পারেন:

.

আপনি যা শিখবেন

আপনি শিখবেন কীভাবে:

  • একাধিক জিপিইউ ব্যবহার করে একটি মেশিনে ডিস্ট্রিবিউটেড ট্রেনিং চালান।
  • একাধিক মেশিনে ডিস্ট্রিবিউটেড ট্রেনিং চালান

গুগল ক্লাউডে এই ল্যাবটি চালানোর মোট খরচ প্রায় ২ ডলার

২. ভার্টেক্স এআই-এর পরিচিতি

এই ল্যাবটি গুগল ক্লাউডে উপলব্ধ সর্বাধুনিক এআই প্রোডাক্টটি ব্যবহার করে। ভার্টেক্স এআই গুগল ক্লাউডের এমএল অফারিংগুলোকে একটি নির্বিঘ্ন ডেভেলপমেন্ট অভিজ্ঞতায় একীভূত করে। পূর্বে, অটোএমএল (AutoML) দিয়ে প্রশিক্ষিত মডেল এবং কাস্টম মডেলগুলো আলাদা সার্ভিসের মাধ্যমে অ্যাক্সেস করা যেত। নতুন অফারিংটি অন্যান্য নতুন প্রোডাক্টের সাথে উভয়কে একটি একক এপিআই-তে একত্রিত করেছে। আপনি আপনার বিদ্যমান প্রোজেক্টগুলোও ভার্টেক্স এআই-তে মাইগ্রেট করতে পারেন।

ভার্টেক্স এআই-এর এন্ড-টু-এন্ড এমএল ওয়ার্কফ্লো সমর্থন করার জন্য বিভিন্ন পণ্য রয়েছে। এই ল্যাবটি নিচে উল্লেখিত পণ্যগুলোর উপর আলোকপাত করবে: ট্রেনিং এবং ওয়ার্কবেঞ্চ।

ভার্টেক্স পণ্যের সংক্ষিপ্ত বিবরণ

৩. বিতরণকৃত প্রশিক্ষণের সংক্ষিপ্ত বিবরণ

আপনার যদি একটিমাত্র জিপিইউ থাকে, তাহলে TensorFlow আপনার কোনো অতিরিক্ত কাজ ছাড়াই মডেল প্রশিক্ষণের গতি বাড়াতে এই অ্যাক্সিলারেটরটি ব্যবহার করবে। তবে, আপনি যদি একাধিক জিপিইউ ব্যবহার করে অতিরিক্ত গতি পেতে চান, তাহলে আপনাকে tf.distribute ব্যবহার করতে হবে, যা হলো একাধিক ডিভাইসে গণনা চালানোর জন্য TensorFlow-এর একটি মডিউল।

এই ল্যাবের প্রথম অংশে tf.distribute.MirroredStrategy ব্যবহার করা হয়েছে, যা আপনি সামান্য কিছু কোড পরিবর্তনের মাধ্যমেই আপনার ট্রেনিং অ্যাপ্লিকেশনগুলোতে যোগ করতে পারেন। এই স্ট্র্যাটেজিটি আপনার মেশিনের প্রতিটি GPU-তে মডেলটির একটি কপি তৈরি করে। পরবর্তী গ্রেডিয়েন্ট আপডেটগুলো সিনক্রোনাস পদ্ধতিতে সম্পন্ন হবে। এর মানে হলো, প্রতিটি GPU ইনপুট ডেটার ভিন্ন ভিন্ন স্লাইসের উপর ভিত্তি করে মডেলটির ফরোয়ার্ড এবং ব্যাকওয়ার্ড পাস গণনা করে। এরপর এই প্রতিটি স্লাইস থেকে গণনা করা গ্রেডিয়েন্টগুলোকে সমস্ত GPU জুড়ে একত্রিত করে 'অল-রিডিউস' নামে পরিচিত একটি প্রক্রিয়ার মাধ্যমে গড় করা হয়। এই গড় গ্রেডিয়েন্টগুলো ব্যবহার করে মডেলের প্যারামিটারগুলো আপডেট করা হয়।

ল্যাবের শেষের ঐচ্ছিক অংশে tf.distribute.MultiWorkerMirroredStrategy ব্যবহার করা হয়েছে, যা MirroredStrategy এর মতোই, তবে পার্থক্য হলো এটি একাধিক মেশিনে কাজ করে। এই মেশিনগুলোর প্রতিটিতে একাধিক GPU-ও থাকতে পারে। MirroredStrategy মতোই, MultiWorkerMirroredStrategy হলো একটি সিনক্রোনাস ডেটা প্যারালেলিজম স্ট্র্যাটেজি যা আপনি কোডে সামান্য কিছু পরিবর্তন করেই ব্যবহার করতে পারেন। একটি মেশিন থেকে একাধিক মেশিনে সিনক্রোনাস ডেটা প্যারালেলিজম ব্যবহারের ক্ষেত্রে প্রধান পার্থক্য হলো, প্রতিটি ধাপের শেষে গ্রেডিয়েন্টগুলোকে এখন একটি মেশিনের সমস্ত GPU এবং ক্লাস্টারের সমস্ত মেশিনের মধ্যে সিনক্রোনাইজ করতে হয়।

এই ল্যাবটি সম্পন্ন করার জন্য বিস্তারিত জানার প্রয়োজন নেই, কিন্তু TensorFlow-তে ডিস্ট্রিবিউটেড ট্রেনিং কীভাবে কাজ করে সে সম্পর্কে আরও জানতে চাইলে, নিচের ভিডিওটি দেখুন:

৪. আপনার পরিবেশ প্রস্তুত করুন

আপনার পরিবেশ সেট আপ করতে Vertex AI ল্যাবের সাহায্যে কাস্টম মডেল প্রশিক্ষণের ধাপগুলো সম্পূর্ণ করুন।

৫. একক মেশিনে একাধিক জিপিইউ প্রশিক্ষণ

আপনার ট্রেনিং অ্যাপ্লিকেশন কোড একটি ডকার কন্টেইনারে রেখে এবং এই কন্টেইনারটিকে গুগল আর্টিফ্যাক্ট রেজিস্ট্রি- তে পুশ করার মাধ্যমে আপনি আপনার ডিস্ট্রিবিউটেড ট্রেনিং জবটি ভার্টেক্স এআই-তে জমা দেবেন। এই পদ্ধতি ব্যবহার করে, আপনি যেকোনো ফ্রেমওয়ার্ক দিয়ে তৈরি একটি মডেলকে ট্রেইন করতে পারেন।

শুরু করার জন্য, পূর্ববর্তী ল্যাবগুলোতে আপনার তৈরি করা ওয়ার্কবেঞ্চ নোটবুকের লঞ্চার মেনু থেকে একটি টার্মিনাল উইন্ডো খুলুন।

নোটবুকে টার্মিনাল খুলুন

ধাপ ১: প্রশিক্ষণ কোড লিখুন

flowers-multi-gpu নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং এর ভেতরে যান:

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

ট্রেনিং কোডের জন্য একটি ডিরেক্টরি এবং একটি পাইথন ফাইল তৈরি করতে নিম্নলিখিত কমান্ডটি চালান, যেখানে আপনি নিচের কোডটি যোগ করবেন।

mkdir trainer
touch trainer/task.py

আপনার flowers-multi-gpu/ ডিরেক্টরিতে এখন নিম্নলিখিত বিষয়গুলো থাকা উচিত:

+ trainer/
    + task.py

এরপর, আপনার তৈরি করা task.py ফাইলটি খুলুন এবং নিচের কোডটি কপি করুন।

আপনাকে BUCKET_ROOT এ থাকা {your-gcs-bucket} এর জায়গায় সেই ক্লাউড স্টোরেজ বাকেটটি বসাতে হবে, যেখানে আপনি ল্যাব ১- এ ফুলের ডেটাসেটটি সংরক্ষণ করেছিলেন।

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-তে সিনক্রোনাস ডেটা প্যারালেলিজম কৌশল ব্যবহার করার সময় ব্যাচ সাইজ বাড়ানো একটি উত্তম অনুশীলন। আপনি এখানে আরও জানতে পারেন।

ধাপ ২: একটি ডকারফাইল তৈরি করুন

আপনার কোডকে কন্টেইনারাইজ করতে, আপনাকে একটি ডকারফাইল তৈরি করতে হবে। ডকারফাইলটিতে ইমেজটি চালানোর জন্য প্রয়োজনীয় সমস্ত কমান্ড অন্তর্ভুক্ত করতে হবে। এটি সমস্ত প্রয়োজনীয় লাইব্রেরি ইনস্টল করবে এবং ট্রেনিং কোডের জন্য এন্ট্রি পয়েন্ট সেট আপ করবে।

আপনার টার্মিনাল থেকে, flowers ডিরেক্টরির রুটে একটি খালি 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"]

ধাপ ৩: কন্টেইনারটি তৈরি করুন

আপনার প্রোজেক্টের জন্য একটি এনভ ভ্যারিয়েবল নির্ধারণ করতে, আপনার টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান এবং অবশ্যই your-cloud-project এর জায়গায় আপনার প্রোজেক্টের আইডি বসাবেন:

PROJECT_ID='your-cloud-project'

আর্টিফ্যাক্ট রেজিস্ট্রি-তে একটি রিপো তৈরি করুন। আমরা প্রথম ল্যাবে তৈরি করা রিপোটি ব্যবহার করব।

REPO_NAME='flower-app'

আর্টিফ্যাক্ট রেজিস্ট্রি-তে আপনার কন্টেইনার ইমেজের URI দিয়ে একটি ভেরিয়েবল সংজ্ঞায়িত করুন:

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

সবশেষে, এটিকে আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করুন:

docker push $IMAGE_URI

কন্টেইনারটি আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করা হয়ে গেলে, আপনি এখন ট্রেনিং জবটি শুরু করার জন্য প্রস্তুত।

ধাপ ৪: SDK ব্যবহার করে জবটি চালান।

এই অংশে, আপনি দেখতে পাবেন কিভাবে Vertex AI Python SDK ব্যবহার করে ডিস্ট্রিবিউটেড ট্রেনিং জব কনফিগার এবং চালু করতে হয়।

লঞ্চার থেকে একটি TensorFlow 2 নোটবুক তৈরি করুন।

নতুন নোটবুক

Vertex AI SDK ইম্পোর্ট করুন।

from google.cloud import aiplatform

এরপর, একটি CustomContainerTrainingJob সংজ্ঞায়িত করুন।

আপনাকে container_uri তে {PROJECT_ID} এবং staging_bucket{YOUR_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)

কনসোলে আপনি আপনার কাজের অগ্রগতি দেখতে পারবেন।

মাল্টিজিপিইউ_জব

৬. [ঐচ্ছিক] একাধিক কর্মী প্রশিক্ষণ

এখন যেহেতু আপনি একাধিক জিপিইউ সহ একটি একক মেশিনে ডিস্ট্রিবিউটেড ট্রেনিং চেষ্টা করেছেন, আপনি একাধিক মেশিনে প্রশিক্ষণ দিয়ে আপনার ডিস্ট্রিবিউটেড ট্রেনিং দক্ষতাকে পরবর্তী স্তরে নিয়ে যেতে পারেন। খরচ কম রাখার জন্য, আমরা সেই মেশিনগুলিতে কোনো জিপিইউ যোগ করব না, তবে আপনি চাইলে জিপিইউ যোগ করে পরীক্ষা করতে পারেন।

আপনার নোটবুক ইনস্ট্যান্সে একটি নতুন টার্মিনাল উইন্ডো খুলুন:

নোটবুকে টার্মিনাল খুলুন

ধাপ ১: প্রশিক্ষণ কোড লিখুন

flowers-multi-machine নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং এর ভেতরে যান:

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

ট্রেনিং কোডের জন্য একটি ডিরেক্টরি এবং একটি পাইথন ফাইল তৈরি করতে নিম্নলিখিত কমান্ডটি চালান, যেখানে আপনি নিচের কোডটি যোগ করবেন।

mkdir trainer
touch trainer/task.py

আপনার flowers-multi-machine/ ডিরেক্টরিতে এখন নিম্নলিখিত বিষয়গুলো থাকা উচিত:

+ trainer/
    + task.py

এরপর, আপনার তৈরি করা task.py ফাইলটি খুলুন এবং নিচের কোডটি কপি করুন।

আপনাকে BUCKET_ROOT এ থাকা {your-gcs-bucket} এর জায়গায় সেই ক্লাউড স্টোরেজ বাকেটটি বসাতে হবে, যেখানে আপনি ল্যাব ১- এ ফুলের ডেটাসেটটি সংরক্ষণ করেছিলেন।

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() ফাংশন—এই সবগুলোতেই বয়লারপ্লেট কোড থাকে যা মডেল সেভ করতে সাহায্য করে।

ধাপ ২: একটি ডকারফাইল তৈরি করুন

আপনার কোডকে কন্টেইনারাইজ করতে, আপনাকে একটি ডকারফাইল তৈরি করতে হবে। ডকারফাইলটিতে ইমেজটি চালানোর জন্য প্রয়োজনীয় সমস্ত কমান্ড অন্তর্ভুক্ত করতে হবে। এটি সমস্ত প্রয়োজনীয় লাইব্রেরি ইনস্টল করবে এবং ট্রেনিং কোডের জন্য এন্ট্রি পয়েন্ট সেট আপ করবে।

আপনার টার্মিনাল থেকে, flowers ডিরেক্টরির রুটে একটি খালি 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"]

ধাপ ৩: কন্টেইনারটি তৈরি করুন

আপনার প্রোজেক্টের জন্য একটি এনভ ভ্যারিয়েবল নির্ধারণ করতে, আপনার টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালান এবং অবশ্যই your-cloud-project এর জায়গায় আপনার প্রোজেক্টের আইডি বসাবেন:

PROJECT_ID='your-cloud-project'

আর্টিফ্যাক্ট রেজিস্ট্রি-তে একটি রিপো তৈরি করুন। আমরা প্রথম ল্যাবে তৈরি করা রিপোটি ব্যবহার করব।

REPO_NAME='flower-app'

গুগল আর্টিফ্যাক্ট রেজিস্ট্রি-তে আপনার কন্টেইনার ইমেজের URI দিয়ে একটি ভেরিয়েবল নির্ধারণ করুন:

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

সবশেষে, এটিকে আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করুন:

docker push $IMAGE_URI

কন্টেইনারটি আর্টিফ্যাক্ট রেজিস্ট্রি-তে পুশ করা হয়ে গেলে, আপনি এখন ট্রেনিং জবটি শুরু করার জন্য প্রস্তুত।

ধাপ ৪: SDK ব্যবহার করে জবটি চালান।

এই অংশে, আপনি দেখতে পাবেন কিভাবে Vertex AI Python SDK ব্যবহার করে ডিস্ট্রিবিউটেড ট্রেনিং জব কনফিগার এবং চালু করতে হয়।

লঞ্চার থেকে একটি TensorFlow 2 নোটবুক তৈরি করুন।

নতুন নোটবুক

Vertex AI SDK ইম্পোর্ট করুন।

from google.cloud import aiplatform

তারপর, worker_pool_specs সংজ্ঞায়িত করুন।

ভার্টেক্স এআই বিভিন্ন ধরনের মেশিন টাস্ক সম্পন্ন করার জন্য ৪টি ওয়ার্কার পুল প্রদান করে।

ওয়ার্কার পুল ০ প্রাইমারি, চিফ, শিডিউলার বা "মাস্টার" কনফিগার করে। MultiWorkerMirroredStrategy তে, সমস্ত মেশিনকে ওয়ার্কার হিসেবে মনোনীত করা হয়, যেগুলো হলো সেই ফিজিক্যাল মেশিন যেখানে রেপ্লিকেটেড কম্পিউটেশন এক্সিকিউট করা হয়। প্রতিটি মেশিন ওয়ার্কার হওয়ার পাশাপাশি, এমন একটি ওয়ার্কার থাকা প্রয়োজন যা কিছু অতিরিক্ত কাজ করে, যেমন চেকপয়েন্ট সেভ করা এবং টেনসরবোর্ডে সামারি ফাইল লেখা। এই মেশিনটি চিফ নামে পরিচিত। চিফ ওয়ার্কার সবসময় একজনই থাকে, তাই ওয়ার্কার পুল ০-এর জন্য আপনার ওয়ার্কারের সংখ্যা সর্বদা ১ হবে।

ওয়ার্কার পুল ১ হলো সেই জায়গা যেখানে আপনি আপনার ক্লাস্টারের জন্য অতিরিক্ত ওয়ার্কারদের কনফিগার করেন।

worker_pool_specs তালিকার প্রথম ডিকশনারিটি ওয়ার্কার পুল ০ এবং দ্বিতীয় ডিকশনারিটি ওয়ার্কার পুল ১-কে নির্দেশ করে। এই স্যাম্পলে, দুটি কনফিগারেশন একই। তবে, আপনি যদি ৩টি মেশিনে ট্রেনিং করাতে চান, তাহলে replica_count কে ২ সেট করে ওয়ার্কার পুল ১-এ অতিরিক্ত ওয়ার্কার যোগ করতে হবে। আপনি যদি GPU যোগ করতে চান, তাহলে উভয় ওয়ার্কার পুলের machine_specaccelerator_type এবং accelerator_count আর্গুমেন্টগুলো যোগ করতে হবে। মনে রাখবেন, আপনি যদি MultiWorkerMirroredStrategy সাথে GPU ব্যবহার করতে চান, তাহলে ক্লাস্টারের প্রতিটি মেশিনে অবশ্যই একই সংখ্যক GPU থাকতে হবে। অন্যথায় জবটি ব্যর্থ হবে।

আপনাকে image_uri তে {PROJECT_ID} প্রতিস্থাপন করতে হবে।

# 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 তৈরি করে চালান, এবং staging_bucket এ থাকা {YOUR_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()

কনসোলে আপনি আপনার কাজের অগ্রগতি দেখতে পারবেন।

একাধিক_কর্মীর_কাজ

🎉 অভিনন্দন! 🎉

আপনি শিখেছেন কীভাবে ভার্টেক্স এআই ব্যবহার করে:

  • TensorFlow দিয়ে ডিস্ট্রিবিউটেড ট্রেনিং জব চালান

Vertex-এর বিভিন্ন অংশ সম্পর্কে আরও জানতে ডকুমেন্টেশন দেখুন।

৭. পরিচ্ছন্নতা

যেহেতু আমরা নোটবুকটিকে ৬০ মিনিট নিষ্ক্রিয় থাকার পর টাইম আউট হওয়ার জন্য কনফিগার করেছি, তাই ইনস্ট্যান্সটি শাট ডাউন করার বিষয়ে আমাদের চিন্তা করার দরকার নেই। আপনি যদি ইনস্ট্যান্সটি ম্যানুয়ালি শাট ডাউন করতে চান, তাহলে কনসোলের Vertex AI Workbench সেকশনে থাকা Stop বাটনে ক্লিক করুন। আর যদি নোটবুকটি পুরোপুরি মুছে ফেলতে চান, তাহলে Delete বাটনে ক্লিক করুন।

স্টপ ইনস্ট্যান্স

স্টোরেজ বাকেটটি ডিলিট করতে, আপনার ক্লাউড কনসোলের নেভিগেশন মেনু ব্যবহার করে স্টোরেজ-এ যান, আপনার বাকেটটি সিলেক্ট করুন এবং ডিলিট-এ ক্লিক করুন:

স্টোরেজ মুছে ফেলুন