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 سرتاسر است. این آزمایشگاه بر روی محصولاتی که در زیر برجسته شده اند تمرکز خواهد کرد: پیش بینی ها و میز کار
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 کلیک کنید.
مرحله 3: یک نمونه Vertex AI Workbench ایجاد کنید
از بخش Vertex AI در Cloud Console خود، روی Workbench کلیک کنید:
اگر قبلاً API Notebooks وجود ندارد، آن را فعال کنید.
پس از فعال شدن، روی دفترچه یادداشت مدیریت شده کلیک کنید:
سپس NEW NOTEBOOK را انتخاب کنید.
نوت بوک خود را نامی بگذارید و در قسمت Permission حساب سرویس را انتخاب کنید
تنظیمات پیشرفته را انتخاب کنید.
اگر قبلاً فعال نشده است، در قسمت Security ، "Enable terminal" را انتخاب کنید.
شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.
بعد، روی ایجاد کلیک کنید. ارائه نمونه چند دقیقه طول می کشد.
پس از ایجاد نمونه، OPEN JUPYTERLAB را انتخاب کنید.
5. مدل ثبت نام کنید
مرحله 1: آپلود مدل در فضای ذخیرهسازی ابری
برای رفتن به صفحه TensorFlow Hub برای مدل MobileNet V1 که در مجموعه داده ImagNet آموزش دیده است، روی این پیوند کلیک کنید.
برای دانلود مصنوعات مدل ذخیره شده ، Download را انتخاب کنید.
از قسمت Cloud Storage کنسول Google Cloud، CREATE را انتخاب کنید
به سطل خود یک نام بدهید و us-central1 را به عنوان منطقه انتخاب کنید. سپس بر روی CREATE کلیک کنید
مدل هاب TensorFlow را که دانلود کرده اید در سطل آپلود کنید. مطمئن شوید که ابتدا فایل را untar کرده اید.
سطل شما باید چیزی شبیه به این باشد:
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 را انتخاب کنید و سپس یک نام برای مدل خود وارد کنید.
در قسمت تنظیمات مدل ، آخرین کانتینر از پیش ساخته شده TensorFlow را مشخص کنید. سپس، مسیری را در Cloud Storage که در آن مصنوعات مدل را ذخیره کردهاید، انتخاب کنید.
می توانید از بخش توضیح پذیری رد شوید.
سپس IMPORT را انتخاب کنید
پس از وارد کردن، مدل خود را در رجیستری مدل خواهید دید
6. استقرار مدل
از رجیستری Model، سه نقطه سمت راست مدل را انتخاب کنید و روی Deploy to endpoint کلیک کنید.
در قسمت Define your endpoint گزینه create new endpoint را انتخاب کنید و سپس به نقطه پایانی خود یک نام بدهید.
در تنظیمات مدل ، حداکثر تعداد گره های محاسباتی را روی 1 و نوع ماشین را روی n1-standard-2
تنظیم کنید و همه تنظیمات را به همان صورت باقی بگذارید. سپس روی DEPLOY کلیک کنید.
هنگام استقرار، وضعیت استقرار به Deployed on Vertex AI تغییر می کند.
7. پیش بینی ها را دریافت کنید
نوت بوک Workbench را که در مراحل راه اندازی ایجاد کردید باز کنید. از لانچر، یک نوت بوک جدید TensorFlow 2 ایجاد کنید.
برای وارد کردن کتابخانه های لازم، سلول زیر را اجرا کنید
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 باز کنید. سپس اندازه و مقیاس را با ۲۵۵ تغییر دهید. توجه داشته باشید که اندازه تصویر مورد انتظار مدل را میتوانید در صفحه 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 کلیک کنید: