Vertex AI-তে প্রাক-প্রশিক্ষিত টেনসরফ্লো ইমেজ মডেল থেকে ভবিষ্যদ্বাণী পান

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

এই ল্যাবে, আপনি একটি প্রি-ট্রেইনড ইমেজ ক্লাসিফিকেশন মডেল থেকে প্রেডিকশন পেতে Vertex AI ব্যবহার করবেন।

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

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

  • ভার্টেক্স এআই মডেল রেজিস্ট্রি-তে একটি টেনসরফ্লো মডেল ইম্পোর্ট করুন
  • অনলাইনে পূর্বাভাস পান
  • একটি TensorFlow সার্ভিং ফাংশন আপডেট করুন

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

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

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

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

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

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

এই ল্যাবে, আপনি শিখবেন কীভাবে TensorFlow Hub থেকে একটি প্রি-ট্রেইনড মডেল নিয়ে সেটিকে Vertex AI-তে ডেপ্লয় করতে হয়। TensorFlow Hub হলো বিভিন্ন ধরনের সমস্যার সমাধানের জন্য প্রশিক্ষিত মডেলের একটি ভান্ডার, যেমন—এম্বেডিংস, টেক্সট জেনারেশন, স্পিচ টু টেক্সট, ইমেজ সেগমেন্টেশন এবং আরও অনেক কিছু।

এই ল্যাবে ব্যবহৃত উদাহরণটি হলো ImageNet ডেটাসেটের উপর প্রি-ট্রেইনড একটি MobileNet V1 ইমেজ ক্লাসিফিকেশন মডেল । TensorFlow Hub বা এই ধরনের অন্যান্য ডিপ লার্নিং রিপোজিটরি থেকে রেডিমেড মডেল ব্যবহার করে, আপনি মডেল ট্রেনিং নিয়ে চিন্তা না করেই বিভিন্ন প্রেডিকশন টাস্কের জন্য উচ্চ মানের এমএল মডেল ডেপ্লয় করতে পারেন।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

নতুন নোটবুক

আপনার নোটবুকের একটি নাম দিন এবং 'Permission'-এর অধীনে 'Service account' নির্বাচন করুন।

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

উন্নত সেটিংস নির্বাচন করুন।

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

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

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

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

ইনস্ট্যান্সটি তৈরি হয়ে গেলে, ওপেন জুপিটারল্যাব (OPEN JUPYTERLAB ) নির্বাচন করুন।

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

৫. মডেল নিবন্ধন করুন

ধাপ ১: ক্লাউড স্টোরেজে মডেল আপলোড করুন

ImagNet ডেটাসেটের উপর প্রশিক্ষিত MobileNet V1 মডেলের TensorFlow Hub পৃষ্ঠায় যেতে এই লিঙ্কে ক্লিক করুন।

সংরক্ষিত মডেল আর্টিফ্যাক্টগুলো ডাউনলোড করতে ডাউনলোড নির্বাচন করুন।

ডাউনলোড_মডেল

গুগল ক্লাউড কনসোলের ক্লাউড স্টোরেজ বিভাগ থেকে, তৈরি করুন (CREATE) নির্বাচন করুন।

বালতি তৈরি করুন

আপনার বাকেটটির একটি নাম দিন এবং অঞ্চল হিসেবে us-central1 নির্বাচন করুন। তারপর CREATE-এ ক্লিক করুন।

বালতি নির্দিষ্ট করুন

আপনার ডাউনলোড করা TensorFlow hub মডেলটি বাকেটে আপলোড করুন। প্রথমে ফাইলটি আনটার করে নিতে ভুলবেন না।

জিসিএস_মডেল

আপনার বালতিটি দেখতে অনেকটা এইরকম হওয়া উচিত:

imagenet_mobilenet_v1_050_128_classification_5/
  saved_model.pb
  variables/
    variables.data-00000-of-00001
    variables.index

ধাপ ২: রেজিস্ট্রি-তে মডেল ইম্পোর্ট করুন

ক্লাউড কনসোলের ভার্টেক্স এআই মডেল রেজিস্ট্রি বিভাগে যান।

মডেল_রেজিস্ট্রি

আমদানি নির্বাচন করুন

নতুন মডেল হিসাবে আমদানি নির্বাচন করুন এবং তারপরে আপনার মডেলের জন্য একটি নাম দিন।

নাম_এবং_অঞ্চল

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

কন্টেইনার নির্বাচন করুন

আপনি ব্যাখ্যাযোগ্যতা অংশটি এড়িয়ে যেতে পারেন।

তারপর IMPORT নির্বাচন করুন

একবার ইম্পোর্ট করা হলে, আপনি মডেল রেজিস্ট্রি-তে আপনার মডেলটি দেখতে পাবেন।

আমদানিকৃত_মডেল

৬. মডেল স্থাপন করুন

মডেল রেজিস্ট্রি থেকে, মডেলের ডান পাশে থাকা তিনটি ডট নির্বাচন করুন এবং 'Deploy to endpoint'-এ ক্লিক করুন।

ডিপ্লয়_মডেল

আপনার এন্ডপয়েন্ট সংজ্ঞায়িত করুন- এর অধীনে নতুন এন্ডপয়েন্ট তৈরি করুন নির্বাচন করুন এবং তারপরে আপনার এন্ডপয়েন্টের একটি নাম দিন।

মডেল সেটিংস-এর অধীনে, কম্পিউট নোডের সর্বোচ্চ সংখ্যা ১ এবং মেশিনের ধরণ n1-standard-2 তে সেট করুন এবং বাকি সব সেটিংস অপরিবর্তিত রাখুন। তারপর DEPLOY-তে ক্লিক করুন।

এন্ডপয়েন্ট_সেটিংস

ডেপ্লয় করা হলে, Vertex AI-তে ডেপ্লয়মেন্ট স্ট্যাটাসটি 'Deployed'- এ পরিবর্তিত হবে।

স্থাপন_স্থিতি

৭. পূর্বাভাস পান

সেটআপ ধাপে তৈরি করা ওয়ার্কবেঞ্চ নোটবুকটি খুলুন। লঞ্চার থেকে একটি নতুন টেনসরফ্লো ২ নোটবুক তৈরি করুন।

tf_nb

প্রয়োজনীয় লাইব্রেরিগুলো ইম্পোর্ট করতে নিম্নলিখিত সেলটি চালান।

from google.cloud import aiplatform

import tensorflow as tf
import numpy as np
from PIL import Image

আপনি TensorFlow Hub থেকে যে MobileNet মডেলটি ডাউনলোড করেছেন, সেটি ImageNet ডেটাসেটের উপর প্রশিক্ষিত। MobileNet মডেলের আউটপুট হলো একটি সংখ্যা, যা ImageNet ডেটাসেটের একটি ক্লাস লেবেলের সাথে সঙ্গতিপূর্ণ। সেই সংখ্যাটিকে একটি স্ট্রিং লেবেলে রূপান্তর করতে, আপনাকে ছবির লেবেলগুলো ডাউনলোড করতে হবে।

# Download image labels

labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())

এন্ডপয়েন্টে পৌঁছানোর জন্য, আপনাকে এন্ডপয়েন্ট রিসোর্সটি সংজ্ঞায়িত করতে হবে। {PROJECT_NUMBER} এবং {ENDPOINT_ID} প্রতিস্থাপন করতে ভুলবেন না।

PROJECT_NUMBER = "{PROJECT_NUMBER}"
ENDPOINT_ID = "{ENDPOINT_ID}"

endpoint = aiplatform.Endpoint(
    endpoint_name=f"projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

আপনি কনসোলের হোমপেজে আপনার প্রজেক্ট নম্বরটি খুঁজে পাবেন।

প্রকল্প_নম্বর

এবং Vertex AI Endpoints সেকশনে থাকা এন্ডপয়েন্ট আইডি।

এন্ডপয়েন্ট_আইডি

এরপরে, আপনি আপনার এন্ডপয়েন্টটি পরীক্ষা করবেন।

প্রথমে, নিম্নলিখিত ছবিটি ডাউনলোড করে আপনার ইনস্ট্যান্সে আপলোড করুন।

পরীক্ষার ছবি

PIL দিয়ে ছবিটি খুলুন। তারপর এর আকার পরিবর্তন করুন এবং ২৫৫ দ্বারা স্কেল করুন। উল্লেখ্য যে, মডেলটির জন্য প্রত্যাশিত ছবির আকার মডেলটির TensorFlow হাব পৃষ্ঠায় পাওয়া যাবে।

IMAGE_PATH = "test-image.jpg"
IMAGE_SIZE = (128, 128)

im = Image.open(IMAGE_PATH)
im = im.resize(IMAGE_SIZE
im = np.array(im)/255.0

এরপরে, NumPy ডেটাটিকে একটি লিস্টে রূপান্তর করুন, যাতে এটিকে http রিকোয়েস্টের বডিতে পাঠানো যায়।

x_test = im.astype(np.float32).tolist()

সবশেষে, এন্ডপয়েন্টে একটি প্রেডিকশন কল করুন এবং তারপর সংশ্লিষ্ট স্ট্রিং লেবেলটি খুঁজে বের করুন।

# make prediction request
result = endpoint.predict(instances=[x_test]).predictions

# post process result
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]

print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")

৮. [ঐচ্ছিক] প্রেডিকশন অপ্টিমাইজ করতে টিএফ সার্ভিং ব্যবহার করুন

আরও বাস্তবসম্মত উদাহরণের জন্য, আপনি সম্ভবত প্রথমে নামপাই (NumPy)-তে লোড না করে, ছবিটি সরাসরি এন্ডপয়েন্টে পাঠাতে চাইবেন। এটি আরও কার্যকর, কিন্তু এর জন্য আপনাকে টেনসরফ্লো (TensorFlow) মডেলের সার্ভিং ফাংশনটি পরিবর্তন করতে হবে। আপনার মডেলের প্রত্যাশিত ফরম্যাটে ইনপুট ডেটা রূপান্তর করার জন্য এই পরিবর্তনটি প্রয়োজন।

ধাপ ১: পরিবেশন ফাংশন পরিবর্তন করুন

একটি নতুন TensorFlow নোটবুক খুলুন এবং প্রয়োজনীয় লাইব্রেরিগুলো ইম্পোর্ট করুন।

from google.cloud import aiplatform

import tensorflow as tf

সংরক্ষিত মডেল আর্টিফ্যাক্টগুলো ডাউনলোড করার পরিবর্তে, এবার আপনি hub.KerasLayer ব্যবহার করে মডেলটিকে TensorFlow-তে লোড করবেন, যা একটি TensorFlow SavedModel-কে Keras লেয়ার হিসেবে র‍্যাপ করে। মডেলটি তৈরি করার জন্য, আপনি ডাউনলোড করা TF Hub মডেলটিকে একটি লেয়ার হিসেবে ব্যবহার করে Keras Sequential API-এর মাধ্যমে মডেলটির ইনপুট শেপ নির্দিষ্ট করে দিতে পারেন।

tfhub_model = tf.keras.Sequential(
    [hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v1_050_128/classification/5")]
)
tfhub_model.build([None, 128, 128, 3])

আপনার পূর্বে তৈরি করা বাকেটটির URI নির্ধারণ করুন।

BUCKET_URI = "gs://{YOUR_BUCKET}"
MODEL_DIR = BUCKET_URI + "/bytes_model"

যখন আপনি কোনো অনলাইন প্রেডিকশন সার্ভারে একটি অনুরোধ পাঠান, তখন অনুরোধটি একটি HTTP সার্ভার গ্রহণ করে। HTTP সার্ভারটি HTTP অনুরোধের কন্টেন্ট বডি থেকে প্রেডিকশন অনুরোধটি নিষ্কাশন করে। নিষ্কাশিত প্রেডিকশন অনুরোধটি সার্ভিং ফাংশনে পাঠানো হয়। Vertex AI-এর আগে থেকে তৈরি প্রেডিকশন কন্টেইনারগুলোর ক্ষেত্রে, অনুরোধের কন্টেন্টটি একটি tf.string হিসেবে সার্ভিং ফাংশনে পাঠানো হয়।

প্রেডিকশন সার্ভিসে ছবি পাঠানোর জন্য, আপনাকে কম্প্রেস করা ইমেজ বাইটগুলোকে বেস ৬৪-এ এনকোড করতে হবে, যা নেটওয়ার্কের মাধ্যমে বাইনারি ডেটা প্রেরণের সময় বিষয়বস্তুকে পরিবর্তন থেকে সুরক্ষিত রাখে।

যেহেতু ডেপ্লয় করা মডেলটি ইনপুট ডেটা হিসেবে র (অসংকুচিত) বাইট গ্রহণ করে, তাই আপনাকে নিশ্চিত করতে হবে যে বেস ৬৪ এনকোডেড ডেটা প্রথমে র বাইটে (যেমন JPEG) রূপান্তরিত হয় এবং তারপর ডেপ্লয় করা মডেলে ইনপুট হিসেবে পাঠানোর আগে মডেলের ইনপুট প্রয়োজনীয়তা পূরণের জন্য প্রিপ্রসেস করা হয়।

এর সমাধান করতে, আপনি একটি সার্ভিং ফাংশন ( serving_fn ) সংজ্ঞায়িত করেন এবং এটিকে একটি প্রিপ্রসেসিং ধাপ হিসেবে মডেলের সাথে সংযুক্ত করেন। আপনি একটি @tf.function ডেকোরেটর যোগ করেন, যাতে সার্ভিং ফাংশনটি সিপিইউ-তে আপস্ট্রিমের পরিবর্তে অন্তর্নিহিত মডেলের সাথে ফিউজ হয়ে যায়।

CONCRETE_INPUT = "numpy_inputs"


def _preprocess(bytes_input):
    decoded = tf.io.decode_jpeg(bytes_input, channels=3)
    decoded = tf.image.convert_image_dtype(decoded, tf.float32)
    resized = tf.image.resize(decoded, size=(128, 128))
    return resized


@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def preprocess_fn(bytes_inputs):
    decoded_images = tf.map_fn(
        _preprocess, bytes_inputs, dtype=tf.float32, back_prop=False
    )
    return {
        CONCRETE_INPUT: decoded_images
    }  # User needs to make sure the key matches model's input


@tf.function(input_signature=[tf.TensorSpec([None], tf.string)])
def serving_fn(bytes_inputs):
    images = preprocess_fn(bytes_inputs)
    prob = m_call(**images)
    return prob


m_call = tf.function(tfhub_model.call).get_concrete_function(
    [tf.TensorSpec(shape=[None, 128, 128, 3], dtype=tf.float32, name=CONCRETE_INPUT)]
)

tf.saved_model.save(tfhub_model, MODEL_DIR, signatures={"serving_default": serving_fn})

যখন আপনি HTTP রিকোয়েস্ট প্যাকেট হিসেবে প্রেডিকশনের জন্য ডেটা পাঠান, তখন ইমেজ ডেটা base64 এনকোডেড থাকে, কিন্তু TensorFlow মডেল numpy ইনপুট গ্রহণ করে। আপনার সার্ভিং ফাংশনটি base64 থেকে numpy অ্যারেতে রূপান্তর করার কাজটি করবে।

প্রেডিকশন রিকোয়েস্ট করার সময়, আপনাকে মডেলের পরিবর্তে সার্ভিং ফাংশনে রিকোয়েস্টটি পাঠাতে হবে, এজন্য সার্ভিং ফাংশনের ইনপুট লেয়ারের নামটি জানা প্রয়োজন। এই নামটি সার্ভিং ফাংশন সিগনেচার থেকে পাওয়া যায়।

loaded = tf.saved_model.load(MODEL_DIR)

serving_input = list(
    loaded.signatures["serving_default"].structured_input_signature[1].keys()
)[0]
print("Serving function input name:", serving_input)

ধাপ ২: রেজিস্ট্রি-তে ইম্পোর্ট করুন এবং ডিপ্লয় করুন

পূর্ববর্তী বিভাগগুলিতে আপনারা দেখেছেন কিভাবে UI-এর মাধ্যমে Vertex AI মডেল রেজিস্ট্রি-তে একটি মডেল ইম্পোর্ট করতে হয়। এই বিভাগে আপনারা এর পরিবর্তে SDK ব্যবহার করে একটি বিকল্প উপায় দেখতে পাবেন। উল্লেখ্য যে, আপনি চাইলে এখানেও UI ব্যবহার করতে পারেন।

model = aiplatform.Model.upload(
    display_name="optimized-model",
    artifact_uri=MODEL_DIR,
    serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest",
)

print(model)

আপনি UI-এর পরিবর্তে SDK ব্যবহার করেও মডেলটি ডেপ্লয় করতে পারেন।

endpoint = model.deploy(
     deployed_model_display_name='my-bytes-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

ধাপ ৩: মডেল পরীক্ষা করুন

এখন আপনি এন্ডপয়েন্টটি পরীক্ষা করতে পারেন। যেহেতু আমরা সার্ভিং ফাংশনটি পরিবর্তন করেছি, তাই এবার আপনি প্রথমে NumPy-তে ছবিটি লোড না করেই সরাসরি (বেস৬৪ এনকোডেড) রিকোয়েস্টে পাঠাতে পারবেন। এর ফলে আপনি Vertex AI Predictions-এর আকারের সীমাবদ্ধতায় না পৌঁছেই আরও বড় আকারের ছবি পাঠাতে পারবেন।

ছবির লেবেলগুলো আবার ডাউনলোড করুন

import numpy as np
labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())

ছবিটিকে Base64 এনকোড করুন।

import base64

with open("test-image.jpg", "rb") as f:
    data = f.read()
b64str = base64.b64encode(data).decode("utf-8")

পূর্বে serving_input ভেরিয়েবলে সংজ্ঞায়িত করা সার্ভিং ফাংশনের ইনপুট লেয়ারের নামটি উল্লেখ করে একটি প্রেডিকশন কল করুন।

instances = [{serving_input: {"b64": b64str}}]

# Make request
result = endpoint.predict(instances=instances).predictions

# Convert image class to string label
predicted_class = tf.math.argmax(result[0], axis=-1)
string_label = imagenet_labels[predicted_class]

print(f"label ID: {predicted_class}")
print(f"string label: {string_label}")

🎉 অভিনন্দন! 🎉

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

  • একটি পূর্ব-প্রশিক্ষিত মডেল হোস্ট এবং স্থাপন করুন

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

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

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

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

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

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