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

1. بررسی اجمالی

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

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

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

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

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

2. مقدمه ای بر Vertex AI

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

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

نمای کلی محصول Vertex

3. از نمای کلی مورد استفاده کنید

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

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

4. محیط خود را تنظیم کنید

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

مرحله 1: Compute Engine API را فعال کنید

به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید.

مرحله ۲: Vertex AI API را فعال کنید

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

داشبورد Vertex AI

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

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

منوی Vertex AI

اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.

Notebook_api

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

Notebooks_UI

سپس NEW NOTEBOOK را انتخاب کنید.

نوت بوک

نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید

create_notebook

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

اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.

enable_terminal

شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.

بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.

پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.

open_jupyterlab

5. مدل ثبت نام کنید

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

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

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

دانلود_مدل

از قسمت Cloud Storage کنسول Google Cloud، CREATE را انتخاب کنید

create_bucket

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

specify_bucket

مدل هاب TensorFlow را که دانلود کرده اید در سطل آپلود کنید. مطمئن شوید که ابتدا فایل را untar کرده اید.

gcs_model

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

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

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

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

مدل_رجیستری

IMPORT را انتخاب کنید

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

name_and_region

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

select_container

می توانید از بخش توضیح پذیری رد شوید.

سپس IMPORT را انتخاب کنید

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

imported_model

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

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

deploy_model

در قسمت Define your endpoint گزینه create new endpoint را انتخاب کنید و سپس به نقطه پایانی خود یک نام بدهید.

در تنظیمات مدل ، حداکثر تعداد گره های محاسباتی را روی 1 و نوع ماشین را روی n1-standard-2 تنظیم کنید و همه تنظیمات را به همان صورت باقی بگذارید. سپس روی DEPLOY کلیک کنید.

endpoint_settings

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

deploy_status

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

نوت بوک 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 .

endpoint_id

در مرحله بعد، نقطه پایانی خود را آزمایش خواهید کرد.

ابتدا تصویر زیر را دانلود کرده و در نمونه خود آپلود کنید.

test_image

تصویر را با PIL باز کنید. سپس اندازه و مقیاس را با ۲۵۵ تغییر دهید. توجه داشته باشید که اندازه تصویر مورد انتظار مدل را می‌توانید در صفحه Hub 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}")

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

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

مرحله 1: عملکرد سرویس را تغییر دهید

یک نوت بوک 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، محتوای درخواست به عنوان یک 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 ورودی 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)

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

در بخش های قبلی نحوه وارد کردن یک مدل به رجیستری مدل Vertex AI از طریق UI را مشاهده کردید. در این بخش یک روش جایگزین با استفاده از 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,
   )

مرحله 3: مدل تست

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

9. پاکسازی

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

توقف نمونه

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

ذخیره سازی را حذف کنید