প্রোটোটাইপ টু প্রোডাকশন: হাইপারপ্যারামিটার টিউনিং

1. ওভারভিউ

এই ল্যাবে, আপনি Vertex AI প্রশিক্ষণে একটি হাইপারপ্যারামিটার টিউনিং কাজ চালানোর জন্য Vertex AI ব্যবহার করবেন।

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

.

আপনি কি শিখুন

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

  • স্বয়ংক্রিয় হাইপারপ্যারামিটার টিউনিংয়ের জন্য প্রশিক্ষণ অ্যাপ্লিকেশন কোড পরিবর্তন করুন
  • Vertex AI Python SDK এর সাথে একটি হাইপারপ্যারামিটার টিউনিং কাজ কনফিগার করুন এবং চালু করুন

Google ক্লাউডে এই ল্যাবটি চালানোর জন্য মোট খরচ প্রায় $1

2. ভার্টেক্স এআই-এর ভূমিকা

এই ল্যাবটি Google ক্লাউডে উপলব্ধ নতুন AI পণ্য অফার ব্যবহার করে। Vertex AI Google ক্লাউড জুড়ে ML অফারগুলিকে একটি নিরবচ্ছিন্ন বিকাশের অভিজ্ঞতায় সংহত করে৷ পূর্বে, অটোএমএল এবং কাস্টম মডেলগুলির সাথে প্রশিক্ষিত মডেলগুলি পৃথক পরিষেবার মাধ্যমে অ্যাক্সেসযোগ্য ছিল। নতুন অফারটি অন্যান্য নতুন পণ্যের সাথে একটি একক API-এ উভয়কে একত্রিত করে। আপনি বিদ্যমান প্রকল্পগুলিকে Vertex AI-তে স্থানান্তর করতে পারেন।

Vertex AI এন্ড-টু-এন্ড ML ওয়ার্কফ্লো সমর্থন করার জন্য বিভিন্ন পণ্য অন্তর্ভুক্ত করে। এই ল্যাবটি নীচে হাইলাইট করা পণ্যগুলিতে ফোকাস করবে: প্রশিক্ষণ এবং ওয়ার্কবেঞ্চ৷

ভার্টেক্স পণ্য ওভারভিউ

3. আপনার পরিবেশ সেট আপ করুন

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

4. প্রশিক্ষণ অ্যাপ্লিকেশন কোড ধারণ করুন

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

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

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

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

flowers-hptune নামে একটি নতুন ডিরেক্টরি তৈরি করুন এবং এতে সিডি করুন:

mkdir flowers-hptune
cd flowers-hptune

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

mkdir trainer
touch trainer/task.py

আপনার flowers-hptune/ ডিরেক্টরিতে এখন আপনার নিম্নলিখিতগুলি থাকা উচিত:

+ trainer/
    + task.py

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

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

import tensorflow as tf
import numpy as np
import os
import hypertune
import argparse

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

  model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
  
  return model

def main():
  args = get_args()
  train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)
  model = create_model(args.num_units, args.learning_rate, args.momentum)
  history = model.fit(train_dataset, validation_data=validation_dataset, epochs=EPOCHS)

  # 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=EPOCHS)


if __name__ == "__main__":
    main()

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

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

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

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

আপনার টার্মিনাল থেকে, আপনার flowers-hptune ডিরেক্টরির মূলে একটি খালি ডকারফাইল তৈরি করুন:

touch Dockerfile

আপনার flowers-hptune/ ডিরেক্টরিতে এখন আপনার নিম্নলিখিতগুলি থাকা উচিত:

+ Dockerfile
+ trainer/
    + task.py

ডকারফাইলটি খুলুন এবং এতে নিম্নলিখিতটি অনুলিপি করুন। আপনি লক্ষ্য করবেন যে এটি আমরা প্রথম ল্যাবে ব্যবহার করা ডকারফাইলের সাথে প্রায় অভিন্ন, এখন আমরা ক্লাউডএমএল-হাইপারটিউন লাইব্রেরি ইনস্টল করছি।

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

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"]

ধাপ 3: ধারক তৈরি করুন

আপনার টার্মিনাল থেকে, আপনার প্রকল্পের জন্য একটি env ভেরিয়েবল সংজ্ঞায়িত করতে নিম্নলিখিতটি চালান, আপনার প্রকল্পের আইডি দিয়ে your-cloud-project প্রতিস্থাপন নিশ্চিত করুন:

PROJECT_ID='your-cloud-project'

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

REPO_NAME='flower-app'

Google আর্টিফ্যাক্ট রেজিস্ট্রিতে আপনার কন্টেইনার ইমেজের URI সহ একটি পরিবর্তনশীল সংজ্ঞায়িত করুন:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image_hptune:latest

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

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

তারপর, আপনার flower-hptune ডিরেক্টরির রুট থেকে নিম্নলিখিতগুলি চালিয়ে ধারকটি তৈরি করুন:

docker build ./ -t $IMAGE_URI

অবশেষে, এটি আর্টিফ্যাক্ট রেজিস্ট্রিতে ঠেলে দিন:

docker push $IMAGE_URI

কনটেইনারটিকে আর্টিফ্যাক্ট রেজিস্ট্রিতে ঠেলে দিয়ে, আপনি এখন প্রশিক্ষণের কাজ শুরু করতে প্রস্তুত।

5. SDK দিয়ে হাইপারপ্যারামিটার টিউনিং কাজ চালান

এই বিভাগে, আপনি Vertex Python API ব্যবহার করে হাইপারপ্যারামিটার টিউনিং কাজ কনফিগার এবং জমা দিতে শিখবেন।

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

নতুন_নোটবুক

Vertex AI 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": 1
    },
    "replica_count": 1,
    "container_spec": {
        "image_uri": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_hptune:latest"
    }
}]

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

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

# 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 , যা অপ্টিমাইজ করার জন্য মেট্রিককে উপস্থাপন করে একটি অভিধান। অভিধান কী হল hyperparameter_metric_tag যা আপনি আপনার প্রশিক্ষণ অ্যাপ্লিকেশন কোডে সেট করেছেন এবং মান হল অপ্টিমাইজেশন লক্ষ্য।

# Dictionary representing metric 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'}

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

আপনার আগে তৈরি করা বালতি দিয়ে আপনাকে {YOUR_BUCKET} প্রতিস্থাপন করতে হবে।

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

তারপর, HyperparameterTuningJob তৈরি করুন এবং চালান।

hp_job = aiplatform.HyperparameterTuningJob(
    display_name='flowers-hptune-job',
    custom_job=my_custom_job,
    metric_spec=metric_spec,
    parameter_spec=parameter_spec,
    max_trial_count=15,
    parallel_trial_count=3)

hp_job.run()

উল্লেখ্য কয়েকটি যুক্তি আছে:

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

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

এইচপি_জব

এবং এটি সমাপ্ত হলে, আপনি প্রতিটি পরীক্ষার ফলাফল এবং মানগুলির কোন সেটটি সেরা পারফর্ম করেছে তা দেখতে পারেন৷

hp_ফলাফল

🎉 অভিনন্দন! 🎉

আপনি শিখেছেন কিভাবে Vertex AI ব্যবহার করতে হয়:

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

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

6. পরিষ্কার করা

যেহেতু আমরা নোটবুকটিকে 60 নিষ্ক্রিয় মিনিটের পরে টাইম আউট করার জন্য কনফিগার করেছি, আমাদের উদাহরণটি বন্ধ করার বিষয়ে চিন্তা করার দরকার নেই৷ আপনি যদি দৃষ্টান্তটি ম্যানুয়ালি বন্ধ করতে চান, তাহলে কনসোলের Vertex AI Workbench বিভাগে স্টপ বোতামে ক্লিক করুন। আপনি যদি নোটবুকটি সম্পূর্ণরূপে মুছে ফেলতে চান তবে মুছুন বোতামটি ক্লিক করুন।

উদাহরণ বন্ধ করুন

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

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