پیش‌بینی‌هایی را از یک مدل تصویری TensorFlow از پیش آموزش‌دیده در Vertex AI دریافت کنید

۱. مرور کلی

در این آزمایش، شما با استفاده از Vertex AI ، پیش‌بینی‌هایی را از یک مدل طبقه‌بندی تصویر از پیش آموزش‌دیده دریافت خواهید کرد.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • یک مدل TensorFlow را به رجیستری مدل Vertex AI وارد کنید
  • دریافت پیش‌بینی‌های آنلاین
  • به‌روزرسانی یک تابع سرویس‌دهنده TensorFlow

هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۱ دلار است.

۲. مقدمه‌ای بر هوش مصنوعی ورتکس

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می‌کند. Vertex AI، محصولات یادگیری ماشین را در سراسر Google Cloud در یک تجربه توسعه یکپارچه ادغام می‌کند. پیش از این، مدل‌های آموزش‌دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. این محصول جدید، هر دو را در یک API واحد، به همراه سایر محصولات جدید، ترکیب می‌کند. همچنین می‌توانید پروژه‌های موجود را به Vertex AI منتقل کنید.

هوش مصنوعی ورتکس شامل محصولات مختلفی برای پشتیبانی از گردش‌های کاری یادگیری ماشینی سرتاسری است. این آزمایشگاه بر روی محصولات برجسته زیر تمرکز خواهد کرد: پیش‌بینی‌ها و میز کار

بررسی اجمالی محصولات ورتکس

۳. مرور کلی موارد استفاده

در این آزمایشگاه، یاد خواهید گرفت که چگونه یک مدل از پیش آموزش دیده از TensorFlow Hub را بگیرید و آن را روی Vertex AI مستقر کنید. TensorFlow Hub مخزنی از مدل‌های آموزش دیده برای انواع حوزه‌های مسئله، مانند جاسازی‌ها، تولید متن، تبدیل گفتار به متن، تقسیم‌بندی تصویر و موارد دیگر است.

مثالی که در این آزمایشگاه استفاده شده است، یک مدل طبقه‌بندی تصویر MobileNet V1 است که از قبل روی مجموعه داده ImageNet آموزش داده شده است. با بهره‌گیری از مدل‌های آماده از TensorFlow Hub یا سایر مخازن یادگیری عمیق مشابه، می‌توانید مدل‌های یادگیری ماشین با کیفیت بالا را برای تعدادی از وظایف پیش‌بینی بدون نگرانی در مورد آموزش مدل، مستقر کنید.

۴. محیط خود را آماده کنید

برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل‌های اینجا را دنبال کنید.

مرحله ۱: فعال کردن رابط برنامه‌نویسی کاربردی موتور محاسبات

به Compute Engine بروید و اگر از قبل فعال نیست، آن را فعال کنید .

مرحله 2: فعال کردن API هوش مصنوعی Vertex

به بخش Vertex AI در کنسول ابری خود بروید و روی Enable Vertex AI API کلیک کنید.

داشبورد هوش مصنوعی ورتکس

مرحله 3: یک نمونه Vertex AI Workbench ایجاد کنید

از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

منوی هوش مصنوعی ورتکس

اگر API نوت‌بوک‌ها فعال نیست، آن را فعال کنید.

نوت‌بوک_آپی

پس از فعال کردن، روی «دفترچه‌های مدیریت‌شده» کلیک کنید:

رابط کاربری نوت‌بوک‌ها

سپس دفترچه یادداشت جدید را انتخاب کنید.

نوت بوک_جدید

برای نوت‌بوک خود یک نام انتخاب کنید و در قسمت Permission، گزینه Service account را انتخاب کنید.

ایجاد_نوت_بوک

تنظیمات پیشرفته را انتخاب کنید.

در قسمت امنیت، اگر از قبل فعال نشده است، گزینه «فعال کردن ترمینال» را انتخاب کنید.

enable_terminal

می‌توانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.

سپس، روی ایجاد (Create) کلیک کنید. آماده‌سازی نمونه (instance) چند دقیقه طول خواهد کشید.

پس از ایجاد نمونه، گزینه‌ی «باز کردن JUPYTERLAB» را انتخاب کنید.

open_jupyterlab

۵. مدل ثبت نام

مرحله ۱: آپلود مدل در فضای ذخیره‌سازی ابری

برای رفتن به صفحه TensorFlow Hub برای مدل MobileNet V1 که روی مجموعه داده ImagNet آموزش داده شده است، روی این لینک کلیک کنید.

برای دانلود مصنوعات مدل ذخیره شده، دانلود را انتخاب کنید.

دانلود_مدل

از بخش Cloud Storage در کنسول Google Cloud، گزینه CREATE را انتخاب کنید.

ایجاد_باکت

برای سطل خود یک نام انتخاب کنید و us-central1 را به عنوان منطقه انتخاب کنید. سپس روی CREATE کلیک کنید.

specified_bucket

مدل هاب TensorFlow که دانلود کرده‌اید را در باکت آپلود کنید. ابتدا مطمئن شوید که فایل را از حالت فشرده خارج کرده‌اید.

مدل gcs

سطل شما باید چیزی شبیه به این باشد:

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

مرحله ۲: وارد کردن مدل به رجیستری

به بخش رجیستری Vertex AI Model در کنسول Cloud بروید.

مدل_رجیستری

انتخاب واردات

گزینه Import as new model را انتخاب کنید و سپس نامی برای مدل خود انتخاب کنید.

نام_و_منطقه

در قسمت تنظیمات مدل، جدیدترین کانتینر از پیش ساخته شده TensorFlow را مشخص کنید. سپس، مسیری را در فضای ذخیره‌سازی ابری که مصنوعات مدل را در آن ذخیره کرده‌اید، انتخاب کنید.

select_container

می‌توانید از بخش «قابلیت توضیح» صرف نظر کنید.

سپس گزینه واردات (IMPORT) را انتخاب کنید.

پس از وارد کردن، مدل خود را در رجیستری مدل مشاهده خواهید کرد

مدل_وارد_شده

۶. استقرار مدل

از رجیستری مدل، سه نقطه سمت راست مدل را انتخاب کنید و روی Deploy to endpoint کلیک کنید.

deploy_model

در قسمت تعریف نقطه پایانی، گزینه ایجاد نقطه پایانی جدید (create new endpoint) را انتخاب کنید و سپس به نقطه پایانی خود یک نام بدهید.

در قسمت تنظیمات مدل (Model settings) ، حداکثر تعداد گره‌های محاسباتی (Maximum number of compute nodes) را روی ۱ و نوع ماشین (machine type) را روی n1-standard-2 تنظیم کنید و سایر تنظیمات را به همان صورت باقی بگذارید. سپس روی DEPLOY کلیک کنید.

تنظیمات نقطه پایانی

هنگام استقرار، وضعیت استقرار به Deployed on Vertex AI تغییر خواهد کرد.

وضعیت_استقرار

۷. پیش‌بینی‌ها را دریافت کنید

دفترچه یادداشت Workbench که در مراحل راه‌اندازی ایجاد کرده‌اید را باز کنید. از طریق لانچر، یک دفترچه یادداشت TensorFlow 2 جدید ایجاد کنید.

tf_nb

برای وارد کردن کتابخانه‌های لازم، سلول زیر را اجرا کنید

from google.cloud import aiplatform

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

مدل MobileNet که از TensorFlow Hub دانلود کرده‌اید، روی مجموعه داده 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}")

۸. [اختیاری] از سرویس TF برای بهینه‌سازی پیش‌بینی‌ها استفاده کنید

برای مثال‌های واقع‌گرایانه‌تر، احتمالاً می‌خواهید خود تصویر را مستقیماً به نقطه پایانی ارسال کنید، به جای اینکه ابتدا آن را در NumPy بارگذاری کنید. این روش کارآمدتر است، اما باید تابع ارائه مدل TensorFlow را تغییر دهید. این تغییر برای تبدیل داده‌های ورودی به فرمتی که مدل شما انتظار دارد، لازم است.

مرحله ۱: اصلاح تابع سرویس‌دهی

یک نوت‌بوک TensorFlow جدید باز کنید و کتابخانه‌های لازم را وارد کنید.

from google.cloud import aiplatform

import tensorflow as tf

به جای دانلود مصنوعات مدل ذخیره شده، این بار مدل را با استفاده از hub.KerasLayer در TensorFlow بارگذاری خواهید کرد، که یک TensorFlow SavedModel را به عنوان یک لایه Keras در بر می‌گیرد. برای ایجاد مدل، می‌توانید از Keras Sequential API با مدل TF Hub دانلود شده به عنوان یک لایه استفاده کنید و شکل ورودی را به مدل مشخص کنید.

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 اضافه می‌کنید تا تابع سرویس‌دهنده به مدل زیرین (به جای بالادست در 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 ارسال می‌کنید، داده‌های تصویر به صورت 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)

مرحله ۲: وارد کردن به رجیستری و استقرار

در بخش‌های قبلی نحوه‌ی وارد کردن یک مدل به Vertex AI Model Registry از طریق رابط کاربری را مشاهده کردید. در این بخش، روش جایگزین دیگری را با استفاده از SDK مشاهده خواهید کرد. توجه داشته باشید که در صورت تمایل، همچنان می‌توانید از رابط کاربری در اینجا استفاده کنید.

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)

همچنین می‌توانید مدل را با استفاده از 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,
   )

مرحله ۳: مدل آزمایشی

حالا می‌توانید نقطه پایانی را آزمایش کنید. از آنجایی که ما تابع ارائه را تغییر دادیم، این بار می‌توانید تصویر را مستقیماً (با کدگذاری base64) در درخواست ارسال کنید، به جای اینکه ابتدا تصویر را در 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 AI برای موارد زیر استفاده کنید:

  • میزبانی و استقرار یک مدل از پیش آموزش دیده

برای کسب اطلاعات بیشتر در مورد بخش‌های مختلف Vertex، مستندات آن را بررسی کنید.

۹. پاکسازی

از آنجا که نوت‌بوک‌های مدیریت‌شده توسط Vertex AI Workbench دارای قابلیت خاموش شدن در حالت بی‌کاری هستند، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می‌خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می‌خواهید نوت‌بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

مثال را متوقف کنید

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:

حذف فضای ذخیره‌سازی