ভার্টেক্স এআই: ডিস্ট্রিবিউটেড হাইপারপ্যারামিটার টিউনিং

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

এই ল্যাবে, আপনি হাইপারপ্যারামিটার টিউনিং এবং ডিস্ট্রিবিউটেড ট্রেনিংয়ের জন্য ভার্টেক্স এআই (Vertex AI) ব্যবহার করতে শিখবেন। যদিও এই ল্যাবে মডেল কোডের জন্য টেনসরফ্লো (TensorFlow) ব্যবহার করা হয়েছে, এর ধারণাগুলো অন্যান্য এমএল (ML) ফ্রেমওয়ার্কের ক্ষেত্রেও প্রযোজ্য।

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

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

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

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

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

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

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

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

৩. ব্যবহারের ক্ষেত্রের সংক্ষিপ্ত বিবরণ

এই ল্যাবে, আপনি TensorFlow Datasets থেকে নেওয়া ঘোড়া অথবা মানুষের ডেটাসেটের উপর প্রশিক্ষিত একটি ইমেজ ক্লাসিফিকেশন মডেলের জন্য সর্বোত্তম প্যারামিটার খুঁজে বের করতে হাইপারপ্যারামিটার টিউনিং ব্যবহার করবেন।

হাইপারপ্যারামিটার টিউনিং

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

Vertex AI Training-এর সাথে হাইপারপ্যারামিটার টিউনিং ব্যবহার করতে হলে, আপনার ট্রেনিং কোডে দুটি পরিবর্তন করতে হবে:

  1. আপনার প্রধান প্রশিক্ষণ মডিউলে, আপনি যে প্রতিটি হাইপারপ্যারামিটার টিউন করতে চান তার জন্য একটি কমান্ড-লাইন আর্গুমেন্ট নির্ধারণ করুন।
  2. আপনার অ্যাপ্লিকেশনের কোডে সংশ্লিষ্ট হাইপারপ্যারামিটার সেট করতে ওই আর্গুমেন্টগুলোতে দেওয়া মান ব্যবহার করুন।

বিতরণকৃত প্রশিক্ষণ

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

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

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

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

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

ধাপ ১: কম্পিউট ইঞ্জিন এপিআই সক্রিয় করুন

Compute Engine- এ যান এবং যদি এটি আগে থেকে চালু না থাকে, তাহলে Enable নির্বাচন করুন।

ধাপ ২: কন্টেইনার রেজিস্ট্রি এপিআই সক্রিয় করুন

কন্টেইনার রেজিস্ট্রি- তে যান এবং যদি আগে থেকে সক্ষম করা না থাকে তবে তা নির্বাচন করুন। আপনার কাস্টম ট্রেনিং জবের জন্য একটি কন্টেইনার তৈরি করতে আপনি এটি ব্যবহার করবেন।

ধাপ ৩: Vertex AI API সক্রিয় করুন

আপনার ক্লাউড কনসোলের Vertex AI বিভাগে যান এবং Enable Vertex AI API-তে ক্লিক করুন।

ভার্টেক্স এআই ড্যাশবোর্ড

ধাপ ৪: একটি Vertex AI Workbench ইনস্ট্যান্স তৈরি করুন

আপনার ক্লাউড কনসোলের Vertex AI সেকশন থেকে Workbench-এ ক্লিক করুন:

ভার্টেক্স এআই মেনু

নোটবুকস এপিআই (Notebooks API) সক্রিয় করুন, যদি আগে থেকে সক্রিয় করা না থাকে।

নোটবুক_এপিআই

একবার চালু হয়ে গেলে, ম্যানেজড নোটবুকস-এ ক্লিক করুন:

নোটবুকস_ইউআই

তারপর নতুন নোটবুক নির্বাচন করুন।

নতুন নোটবুক

আপনার নোটবুকটির একটি নাম দিন, এবং তারপর অ্যাডভান্সড সেটিংস-এ ক্লিক করুন।

নোটবুক তৈরি করুন

অ্যাডভান্সড সেটিংস-এর অধীনে, আইডল শাটডাউন চালু করুন এবং মিনিটের সংখ্যা ৬০-এ সেট করুন। এর মানে হলো, আপনার নোটবুকটি ব্যবহার না করা হলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে, ফলে আপনার অপ্রয়োজনীয় খরচ হবে না।

নিষ্ক্রিয়_সময়সীমা

সিকিউরিটি-এর অধীনে, 'Enable terminal' নির্বাচন করুন, যদি এটি আগে থেকে সক্রিয় করা না থাকে।

সক্ষম-টার্মিনাল

আপনি অন্যান্য সমস্ত উন্নত সেটিংস অপরিবর্তিত রাখতে পারেন।

এরপর, Create-এ ক্লিক করুন। ইনস্ট্যান্সটি প্রোভিশন হতে কয়েক মিনিট সময় লাগবে।

ইনস্ট্যান্সটি তৈরি হয়ে গেলে, Open JupyterLab নির্বাচন করুন।

ওপেন_জুপিটারল্যাব

আপনি যখন প্রথমবার একটি নতুন ইনস্ট্যান্স ব্যবহার করবেন, তখন আপনাকে প্রমাণীকরণের জন্য বলা হবে। এটি করার জন্য UI-তে দেওয়া ধাপগুলো অনুসরণ করুন।

প্রমাণীকরণ

৫. প্রশিক্ষণ কোড লিখুন

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

লঞ্চার_টার্মিনাল

vertex-codelab নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং এর ভেতরে প্রবেশ করুন।

mkdir vertex-codelab
cd vertex-codelab

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

mkdir trainer
touch trainer/task.py

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

+ trainer/
    + task.py

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

import tensorflow as tf
import tensorflow_datasets as tfds
import argparse
import hypertune
import os

NUM_EPOCHS = 10
BATCH_SIZE = 64

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(batch_size):
  '''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(batch_size)

  # Create validation dataset
  validation_data = data['test'].map(preprocess_data)
  validation_data  = validation_data.batch(batch_size)

  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()

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

  # Get data
  GLOBAL_BATCH_SIZE = BATCH_SIZE * strategy.num_replicas_in_sync
  train_data, validation_data = create_dataset(GLOBAL_BATCH_SIZE)

  # Wrap variable creation within strategy scope
  with strategy.scope():
    model = create_model(args.num_units, args.learning_rate, args.momentum)

  # Train model
  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. main() ফাংশনে MirroredStrategy অবজেক্টটি তৈরি করা হয়। এরপর, আপনি আপনার মডেল ভেরিয়েবল তৈরির কাজটি স্ট্র্যাটেজিটির স্কোপের মধ্যে রাখেন। এই ধাপটি TensorFlow-কে বলে দেয় যে কোন ভেরিয়েবলগুলো GPU-গুলোর মধ্যে মিরর করা উচিত।
  2. ব্যাচ সাইজ num_replicas_in_sync দ্বারা বাড়ানো হয়। TensorFlow-তে সিনক্রোনাস ডেটা প্যারালেলিজম কৌশল ব্যবহার করার সময় ব্যাচ সাইজ বাড়ানো একটি উত্তম অনুশীলন। আপনি এখানে আরও জানতে পারেন।

হাইপারপ্যারামিটার টিউনিং

  1. স্ক্রিপ্টটি hypertune লাইব্রেরি ইম্পোর্ট করে। পরবর্তীতে যখন আমরা কন্টেইনার ইমেজ বিল্ড করব, তখন আমাদের এই লাইব্রেরিটি ইনস্টল করা নিশ্চিত করতে হবে।
  2. get_args() ফাংশনটি আপনার টিউন করতে চাওয়া প্রতিটি হাইপারপ্যারামিটারের জন্য একটি কমান্ড-লাইন আর্গুমেন্ট নির্ধারণ করে। এই উদাহরণে, যে হাইপারপ্যারামিটারগুলো টিউন করা হবে সেগুলো হলো লার্নিং রেট, অপটিমাইজারের মোমেন্টাম ভ্যালু এবং মডেলের শেষ হিডেন লেয়ারের ইউনিটের সংখ্যা, তবে আপনি চাইলে অন্যগুলো নিয়েও পরীক্ষা করতে পারেন। এরপর, ওই আর্গুমেন্টগুলোতে পাস করা ভ্যালুটি কোডে সংশ্লিষ্ট হাইপারপ্যারামিটার সেট করতে ব্যবহৃত হয় (যেমন, set learning_rate = args.learning_rate )।
  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
 ]

আপনি যদি চান যে হাইপারপ্যারামিটার টিউনিং সার্ভিসটি মডেলের ভ্যালিডেশন অ্যাকুরেসি সর্বাধিক করে এমন মানগুলো খুঁজে বের করুক, তাহলে মেট্রিকটিকে val_accuracy তালিকার শেষ এন্ট্রি (অথবা NUM_EPOCS - 1 ) হিসেবে সংজ্ঞায়িত করুন। এরপর, এই মেট্রিকটি HyperTune এর একটি ইনস্ট্যান্সে পাস করুন। আপনি hyperparameter_metric_tag এর জন্য আপনার পছন্দমতো যেকোনো স্ট্রিং বেছে নিতে পারেন, কিন্তু পরে যখন আপনি হাইপারপ্যারামিটার টিউনিং কাজটি শুরু করবেন, তখন আপনাকে আবার সেই স্ট্রিংটি ব্যবহার করতে হবে।

৬. কোডকে কন্টেইনারাইজ করুন

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

ধাপ ১: ডকারফাইল লিখুন

আপনার টার্মিনাল থেকে, নিশ্চিত করুন যে আপনি vertex-codelab ডিরেক্টরিতে আছেন এবং একটি খালি Dockerfile তৈরি করুন:

touch Dockerfile

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

+ Dockerfile
+ trainer/
    + task.py

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 ডকার ইমেজ ব্যবহার করে। গুগল ক্লাউডের ডিপ লার্নিং কন্টেইনারগুলোতে অনেক প্রচলিত এমএল (ML) এবং ডেটা সায়েন্স ফ্রেমওয়ার্ক আগে থেকেই ইনস্টল করা থাকে। সেই ইমেজটি ডাউনলোড করার পর, এই ডকারফাইলটি ট্রেনিং কোডের জন্য এন্ট্রি পয়েন্ট সেট আপ করে।

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

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

PROJECT_ID='your-cloud-project'

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

IMAGE_URI="gcr.io/$PROJECT_ID/horse-human-codelab:latest"

ডকার কনফিগার করুন

gcloud auth configure-docker

এরপর, আপনার vertex-codelab ডিরেক্টরির রুট থেকে নিম্নলিখিত কমান্ডটি চালিয়ে কন্টেইনারটি বিল্ড করুন:

docker build ./ -t $IMAGE_URI

সবশেষে, এটিকে গুগল কন্টেইনার রেজিস্ট্রি-তে পুশ করুন:

docker push $IMAGE_URI

ধাপ ৩: একটি ক্লাউড স্টোরেজ বাকেট তৈরি করুন

আমাদের প্রশিক্ষণের কাজে, আমরা একটি স্টেজিং বাকেটের দিকে যাব।

আপনার প্রোজেক্টে একটি নতুন বাকেট তৈরি করতে আপনার টার্মিনালে নিম্নলিখিত কমান্ডটি চালান।

BUCKET_NAME="gs://${PROJECT_ID}-hptune-bucket"
gsutil mb -l us-central1 $BUCKET_NAME

৭. হাইপারপ্যারামিটার টিউনিং কাজটি চালু করুন

ধাপ ১: হাইপারপ্যারামিটার টিউনিং সহ কাস্টম ট্রেনিং জব তৈরি করুন

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

নতুন নোটবুক

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

from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt

হাইপারপ্যারামিটার টিউনিং জবটি চালু করতে, আপনাকে প্রথমে worker_pool_specs নির্ধারণ করতে হবে, যা মেশিনের ধরন এবং ডকার ইমেজ নির্দিষ্ট করে। নিম্নলিখিত স্পেকটি দুটি NVIDIA Tesla V100 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 = [{
    "machine_spec": {
        "machine_type": "n1-standard-4",
        "accelerator_type": "NVIDIA_TESLA_V100",
        "accelerator_count": 2
    },
    "replica_count": 1,
    "container_spec": {
        "image_uri": "gcr.io/{PROJECT_ID}/horse-human-codelab:latest"
    }
}]

এরপরে, ` parameter_spec নির্ধারণ করুন, যা একটি ডিকশনারি এবং এতে আপনি যে প্যারামিটারগুলো অপ্টিমাইজ করতে চান তা নির্দিষ্ট করা থাকে। ডিকশনারির কী (key) হলো প্রতিটি হাইপারপ্যারামিটারের জন্য কমান্ড লাইন আর্গুমেন্টে আপনার দেওয়া স্ট্রিং, এবং ডিকশনারির ভ্যালু (value) হলো প্যারামিটারের নির্দিষ্টকরণ।

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

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

সংজ্ঞায়িত করার জন্য চূড়ান্ত স্পেকটি হলো metric_spec , যা অপটিমাইজ করার জন্য মেট্রিককে প্রতিনিধিত্বকারী একটি ডিকশনারি। ডিকশনারিটির কী (key) হলো hyperparameter_metric_tag যা আপনি আপনার ট্রেনিং অ্যাপ্লিকেশন কোডে সেট করেছেন, এবং ভ্যালুটি হলো অপটিমাইজেশনের লক্ষ্য।

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

একবার স্পেকগুলো সংজ্ঞায়িত হয়ে গেলে, আপনি একটি CustomJob তৈরি করবেন, যেটি হলো সেই সাধারণ স্পেক যা প্রতিটি হাইপারপ্যারামিটার টিউনিং ট্রায়ালে আপনার জবটি চালানোর জন্য ব্যবহৃত হবে।

আপনাকে {YOUR_BUCKET} এর জায়গায় আপনার আগে তৈরি করা বাকেটটি বসাতে হবে।

# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='horses-humans',
                              worker_pool_specs=worker_pool_specs,
                              staging_bucket='gs://{YOUR_BUCKET}')

এরপর, HyperparameterTuningJob টি তৈরি করে চালান।

hp_job = aiplatform.HyperparameterTuningJob(
    display_name='horses-humans',
    custom_job=my_custom_job,
    metric_spec=metric_spec,
    parameter_spec=parameter_spec,
    max_trial_count=6,
    parallel_trial_count=2,
    search_algorithm=None)

hp_job.run()

এখানে কয়েকটি উল্লেখযোগ্য যুক্তি রয়েছে:

  • max_trial_count: সার্ভিসটি কতগুলো ট্রায়াল চালাবে, তার একটি ঊর্ধ্বসীমা আপনাকে নির্ধারণ করতে হবে। সাধারণত, বেশি ট্রায়াল ভালো ফলাফল দেয়, কিন্তু একটি নির্দিষ্ট পর্যায় আসবে, যার পরে অতিরিক্ত ট্রায়ালগুলো আপনার অপটিমাইজ করার চেষ্টাকৃত মেট্রিকের উপর সামান্য বা কোনো প্রভাবই ফেলবে না। সবচেয়ে ভালো উপায় হলো, ট্রায়ালের সংখ্যা না বাড়িয়ে অল্প দিয়ে শুরু করা এবং আপনার নির্বাচিত হাইপারপ্যারামিটারগুলো কতটা প্রভাবশালী, সে সম্পর্কে একটি ধারণা নেওয়া।
  • parallel_trial_count: আপনি যদি প্যারালাল ট্রায়াল ব্যবহার করেন, তাহলে সার্ভিসটি একাধিক ট্রেনিং প্রসেসিং ক্লাস্টার সরবরাহ করে। প্যারালাল ট্রায়ালের সংখ্যা বাড়ালে হাইপারপ্যারামিটার টিউনিং জবটি চলতে যে সময় লাগে তা কমে যায়; তবে, এটি সামগ্রিকভাবে জবটির কার্যকারিতা কমিয়ে দিতে পারে। এর কারণ হলো, ডিফল্ট টিউনিং স্ট্র্যাটেজি পরবর্তী ট্রায়ালগুলোতে মান নির্ধারণের জন্য পূর্ববর্তী ট্রায়ালগুলোর ফলাফল ব্যবহার করে।
  • সার্চ অ্যালগরিদম: আপনি সার্চ অ্যালগরিদমটি গ্রিড, র‍্যান্ডম, বা ডিফল্ট (কোনোটিই নয়) হিসেবে সেট করতে পারেন। ডিফল্ট অপশনটি সম্ভাব্য হাইপারপ্যারামিটার মানগুলোর পরিসরে অনুসন্ধানের জন্য বেসিয়ান অপটিমাইজেশন প্রয়োগ করে এবং এটিই প্রস্তাবিত অ্যালগরিদম। আপনি এই অ্যালগরিদম সম্পর্কে এখানে আরও জানতে পারবেন।

কাজটি শুরু হয়ে গেলে, আপনি UI-তে HYPERPARAMETER TUNING JOBS ট্যাবের অধীনে এর অবস্থা ট্র্যাক করতে পারবেন।

এইচপি_জব

কাজটি সম্পন্ন হয়ে গেলে, আপনি হাইপারপ্যারামিটার মানগুলির সেরা সমন্বয় খুঁজে বের করার জন্য আপনার পরীক্ষাগুলির ফলাফল দেখতে এবং সাজাতে পারবেন।

এইচপি_ফলাফল

🎉 অভিনন্দন! 🎉

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

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

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

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

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

মুছে ফেলুন

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

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