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

1. ওভারভিউ

এই ল্যাবে, আপনি ভার্টেক্স এআই ব্যবহার করবেন একটি প্রাক-প্রশিক্ষিত ইমেজ ক্লাসিফিকেশন মডেল থেকে ভবিষ্যদ্বাণী পাবেন।

আপনি কি শিখুন

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

  • Vertex AI মডেল রেজিস্ট্রিতে একটি TensorFlow মডেল আমদানি করুন
  • অনলাইন ভবিষ্যদ্বাণী পান
  • একটি TensorFlow পরিবেশন ফাংশন আপডেট করুন

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

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

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

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

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

3. কেস ওভারভিউ ব্যবহার করুন

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

এই ল্যাবে ব্যবহৃত উদাহরণ হল একটি MobileNet V1 ইমেজ ক্লাসিফিকেশন মডেল যা ইমেজনেট ডেটাসেটে প্রাক-প্রশিক্ষিত। TensorFlow Hub বা অন্যান্য অনুরূপ গভীর শিক্ষার ভাণ্ডার থেকে শেলফ মডেলগুলি ব্যবহার করে, আপনি মডেল প্রশিক্ষণের বিষয়ে চিন্তা না করেই বেশ কয়েকটি ভবিষ্যদ্বাণীমূলক কাজের জন্য উচ্চ মানের ML মডেল স্থাপন করতে পারেন।

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

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

ধাপ 1: Compute Engine API সক্ষম করুন

কম্পিউট ইঞ্জিনে নেভিগেট করুন এবং সক্ষম নির্বাচন করুন যদি এটি ইতিমধ্যে সক্ষম না থাকে।

ধাপ 2: Vertex AI API সক্ষম করুন

আপনার ক্লাউড কনসোলের Vertex AI বিভাগে নেভিগেট করুন এবং Vertex AI API সক্ষম করুন ক্লিক করুন।

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

ধাপ 3: একটি ভার্টেক্স এআই ওয়ার্কবেঞ্চ উদাহরণ তৈরি করুন

আপনার ক্লাউড কনসোলের ভার্টেক্স এআই বিভাগ থেকে, ওয়ার্কবেঞ্চে ক্লিক করুন:

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

নোটবুক API সক্রিয় করুন যদি এটি ইতিমধ্যে না থাকে।

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

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

নোটবুক_ইউআই

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

নতুন_নোটবুক

আপনার নোটবুকে একটি নাম দিন এবং অনুমতির অধীনে পরিষেবা অ্যাকাউন্ট নির্বাচন করুন৷

তৈরি_নোটবুক

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

নিরাপত্তার অধীনে "টার্মিনাল সক্ষম করুন" নির্বাচন করুন যদি এটি ইতিমধ্যে সক্ষম না থাকে।

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

আপনি অন্যান্য উন্নত সেটিংসের মতোই ছেড়ে যেতে পারেন।

পরবর্তী, তৈরি করুন ক্লিক করুন। দৃষ্টান্তের ব্যবস্থা করতে কয়েক মিনিট সময় লাগবে।

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

open_jupyterlab

5. রেজিস্টার মডেল

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

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

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

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

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

তৈরি_বালতি

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

নির্দিষ্ট_বালতি

আপনার বালতিতে ডাউনলোড করা TensorFlow হাব মডেলটি আপলোড করুন। নিশ্চিত করুন যে আপনি প্রথমে ফাইলটি আনটার করেন।

gcs_model

আপনার বালতিটি এইরকম দেখতে হবে:

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

ধাপ 2: রেজিস্ট্রিতে মডেল আমদানি করুন

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

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

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

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

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

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

নির্বাচন_পাত্র

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

তারপর IMPORT সিলেক্ট করুন

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

আমদানি করা_মডেল

6. মডেল স্থাপন

মডেল রেজিস্ট্রি থেকে, মডেলের ডান পাশে তিনটি বিন্দু নির্বাচন করুন এবং শেষ পয়েন্টে Deploy এ ক্লিক করুন।

deploy_model

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

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

endpoint_settings

স্থাপন করা হলে, স্থাপনার স্থিতি Vertex AI-তে Deployed-এ পরিবর্তিত হবে।

deploy_status

7. ভবিষ্যদ্বাণী পান

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

tf_nb

প্রয়োজনীয় লাইব্রেরি আমদানি করতে নিম্নলিখিত ঘরটি চালান

from google.cloud import aiplatform

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

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

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

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

প্রকল্প_সংখ্যা

এবং ভার্টেক্স এআই এন্ডপয়েন্ট সেকশনে এন্ডপয়েন্ট আইডি।

endpoint_id

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

প্রথমে, নিচের ছবিটি ডাউনলোড করুন এবং আপনার উদাহরণে আপলোড করুন।

পরীক্ষা_চিত্র

পিআইএল দিয়ে ছবিটি খুলুন। তারপরে আকার পরিবর্তন করুন এবং 255 দ্বারা স্কেল করুন৷ মনে রাখবেন যে মডেলের দ্বারা প্রত্যাশিত চিত্রের আকারটি মডেলের টেনসরফ্লো হাব পৃষ্ঠায় পাওয়া যাবে৷

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

8. [ঐচ্ছিক] ভবিষ্যদ্বাণী অপ্টিমাইজ করতে TF সার্ভিং ব্যবহার করুন

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

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

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

from google.cloud import aiplatform

import tensorflow as tf

সংরক্ষিত মডেলের আর্টিফ্যাক্টগুলি ডাউনলোড করার পরিবর্তে, এবার আপনি hub.KerasLayer ব্যবহার করে মডেলটিকে টেনসরফ্লো-এ লোড করবেন, যা একটি কেরাস স্তর হিসাবে একটি টেনসরফ্লো সংরক্ষিত মডেলকে মোড়া। মডেলটি তৈরি করতে, আপনি ডাউনলোড করা TF হাব মডেলের সাথে কেরাস সিকোয়েন্সিয়াল 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 হিসাবে পরিবেশন ফাংশনে প্রেরণ করা হয়।

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

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

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

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 অনুরোধ প্যাকেট হিসাবে ভবিষ্যদ্বাণীর জন্য ডেটা পাঠান, তখন ছবির ডেটা বেস64 এনকোড করা হয়, কিন্তু TensorFlow মডেলটি নমপি ইনপুট নেয়। আপনার পরিবেশন ফাংশন base64 থেকে একটি নম্পি অ্যারেতে রূপান্তর করবে।

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

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)

ধাপ 2: রেজিস্ট্রিতে আমদানি করুন এবং স্থাপন করুন

পূর্ববর্তী বিভাগে আপনি দেখেছেন কিভাবে 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,
   )

ধাপ 3: টেস্ট মডেল

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

আবার ইমেজ লেবেল ডাউনলোড করুন

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 AI ব্যবহার করতে হয়:

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

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

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

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

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

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

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