يمكنك الحصول على توقّعات من نموذج صور TensorFlow المدرَّب مسبقًا على Vertex AI

1. نظرة عامة

في هذا الدرس التطبيقي، ستستخدم Vertex AI للحصول على توقّعات من نموذج تصنيف صور مدرَّب مسبقًا.

ما ستتعلمه

ستتعرَّف على كيفية:

  • استيراد نموذج TensorFlow إلى "سجلّ نماذج Vertex AI"
  • الحصول على توقّعات على الإنترنت
  • تعديل دالة عرض TensorFlow

يبلغ إجمالي تكلفة تشغيل هذا الدرس التطبيقي على Google Cloud حوالي 1 دولار أمريكي.

2. مقدّمة عن Vertex AI

يستخدم هذا المختبر أحدث منتج مستند إلى الذكاء الاصطناعي متاح على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة على Google Cloud في تجربة تطوير سلسة. في السابق، كان يمكن الوصول إلى النماذج المدرَّبة باستخدام AutoML والنماذج المخصَّصة من خلال خدمات منفصلة. يجمع العرض الجديد بين كليهما في واجهة برمجة تطبيقات واحدة، بالإضافة إلى منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI.

تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي على المنتجات الموضّحة أدناه: التوقّعات ومساحة العمل.

نظرة عامة على منتجات Vertex

3- نظرة عامة على حالة الاستخدام

في هذا الدرس التطبيقي، ستتعلّم كيفية الحصول على نموذج مدرَّب مسبقًا من TensorFlow Hub ونشره على Vertex AI. ‫TensorFlow Hub هو مستودع لنماذج مدرَّبة لمجموعة متنوعة من مجالات المشاكل، مثل التضمينات وإنشاء النصوص وتحويل الكلام إلى نص وتقسيم الصور وغير ذلك.

المثال المستخدَم في هذا التمرين العملي هو نموذج تصنيف الصور MobileNet V1 الذي تم تدريبه مسبقًا على مجموعة بيانات ImageNet. من خلال الاستفادة من النماذج الجاهزة من TensorFlow Hub أو مستودعات التعلّم العميق الأخرى المشابهة، يمكنك نشر نماذج تعلّم آلة عالية الجودة لعدد من مهام التوقّع بدون الحاجة إلى القلق بشأن تدريب النماذج.

4. إعداد البيئة

يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.

الخطوة 1: تفعيل Compute Engine API

انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد.

الخطوة 2: تفعيل واجهة برمجة التطبيقات Vertex AI API

انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

لوحة بيانات Vertex AI

الخطوة 3: إنشاء مثيل Vertex AI Workbench

من قسم Vertex AI في Cloud Console، انقر على Workbench:

قائمة Vertex AI

فعِّل واجهة برمجة التطبيقات Notebooks API إذا لم تكن مفعَّلة بعد.

Notebook_api

بعد التفعيل، انقر على دفاتر الملاحظات المُدارة:

Notebooks_UI

بعد ذلك، انقر على دفتر ملاحظات جديد.

new_notebook

أدخِل اسمًا لدفتر الملاحظات، وضِمن الإذن، اختَر حساب الخدمة.

create_notebook

انقر على الإعدادات المتقدّمة.

ضمن الأمان، اختَر "تفعيل الجهاز" إذا لم يكن مفعّلاً.

enable_terminal

يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.

بعد ذلك، انقر على إنشاء. سيستغرق توفير الجهاز الافتراضي بضع دقائق.

بعد إنشاء الآلة الافتراضية، انقر على فتح JUPYTERLAB.

open_jupyterlab

5- تسجيل النموذج

الخطوة 1: تحميل النموذج إلى Cloud Storage

انقر على هذا الرابط للانتقال إلى صفحة TensorFlow Hub الخاصة بنموذج MobileNet V1 الذي تم تدريبه على مجموعة بيانات ImagNet.

انقر على تنزيل لتنزيل عناصر النموذج المحفوظة.

download_model

من قسم Cloud Storage في Google Cloud Console، اختَر إنشاء.

create_bucket

أدخِل اسمًا للحزمة واختَر us-central1 كمنطقة. بعد ذلك، انقر على إنشاء.

specify_bucket

حمِّل نموذج TensorFlow Hub الذي نزّلته إلى الحزمة. تأكَّد من فك ضغط الملف أولاً.

gcs_model

يجب أن يبدو الحِزم على النحو التالي:

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

الخطوة 2: استيراد النموذج إلى السجل

انتقِل إلى قسم سجلّ النماذج في Vertex AI ضِمن Cloud Console.

model_registry

انقر على IMPORT.

انقر على استيراد كنموذج جديد، ثمّ أدخِل اسمًا لنموذجك.

name_and_region

ضمن إعدادات النموذج، حدِّد أحدث حاوية TensorFlow مُنشأة مسبقًا. بعد ذلك، اختَر المسار في Cloud Storage حيث خزّنت عناصر نموذج التعلّم الآلي.

select_container

يمكنك تخطّي قسم التفسير.

بعد ذلك، انقر على IMPORT.

بعد الاستيراد، سيظهر النموذج في سجلّ النماذج.

imported_model

6. نشر النموذج

من "سجلّ النماذج"، انقر على النقاط الثلاث على يسار النموذج، ثم انقر على نشر إلى نقطة نهاية.

deploy_model

ضمن تحديد نقطة النهاية، اختَر إنشاء نقطة نهاية جديدة، ثمّ أدخِل اسمًا لنقطة النهاية.

ضمن إعدادات النموذج، اضبط الحد الأقصى لعدد عُقد الحوسبة على 1، ونوع الجهاز على n1-standard-2، واترك جميع الإعدادات الأخرى كما هي. ثم انقر على نشر.

endpoint_settings

عند تفعيل النموذج، ستتغيّر حالة التفعيل إلى تم التفعيل على 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}")

يمكنك العثور على رقم مشروعك في الصفحة الرئيسية لوحدة التحكّم.

project_number

ويظهر معرّف نقطة النهاية في قسم نقاط النهاية في Vertex AI.

endpoint_id

بعد ذلك، ستختبر نقطة النهاية.

أولاً، نزِّل الصورة التالية وحمِّلها إلى مثيلك.

test_image

افتح الصورة باستخدام PIL. بعد ذلك، غيِّر الحجم واضبط المقياس على 255. يُرجى العِلم أنّه يمكن العثور على حجم الصورة المتوقّع من النموذج في صفحة TensorFlow hub الخاصة بالنموذج.

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 Serving لتحسين التوقّعات

للحصول على أمثلة أكثر واقعية، من الأفضل إرسال الصورة نفسها مباشرةً إلى نقطة النهاية بدلاً من تحميلها في NumPy أولاً. هذه الطريقة أكثر فعالية، ولكن عليك تعديل دالة العرض الخاصة بنموذج TensorFlow. هذا التعديل مطلوب لتحويل بيانات الإدخال إلى التنسيق الذي يتوقّعه النموذج.

الخطوة 1: تعديل دالة العرض

افتح دفتر ملاحظات TensorFlow جديدًا واستورِد المكتبات اللازمة.

from google.cloud import aiplatform

import tensorflow as tf

بدلاً من تنزيل عناصر النموذج المحفوظ، ستحمّل النموذج هذه المرة إلى TensorFlow باستخدام hub.KerasLayer، الذي يغلّف نموذج SavedModel من TensorFlow كطبقة 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.

لتمرير الصور إلى خدمة التوقّع، عليك ترميز وحدات بايت الصورة المضغوطة إلى base 64، ما يجعل المحتوى آمنًا من التعديل أثناء نقل البيانات الثنائية عبر الشبكة.

بما أنّ النموذج الذي تم نشره يتوقّع أن تكون بيانات الإدخال على شكل وحدات بايت أولية (غير مضغوطة)، عليك التأكّد من إعادة تحويل البيانات المشفرة بترميز Base64 إلى وحدات بايت أولية (مثل 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)

الخطوة 2: الاستيراد إلى قاعدة بيانات المسجّلين والنشر

في الأقسام السابقة، تعرّفت على كيفية استيراد نموذج إلى "سجلّ نماذج Vertex AI" من خلال واجهة المستخدم. في هذا القسم، ستتعرّف على طريقة بديلة تستخدم حزمة تطوير البرامج (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: اختبار النموذج

يمكنك الآن اختبار نقطة النهاية. بما أنّنا عدّلنا دالة العرض، يمكنك هذه المرة إرسال الصورة مباشرةً (ترميز base64) في الطلب بدلاً من تحميل الصورة في NumPy أولاً. سيسمح لك ذلك أيضًا بإرسال صور أكبر بدون تجاوز الحد الأقصى لحجم "توقّعات Vertex AI".

تنزيل تصنيفات الصور مرة أخرى

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 تتضمّن ميزة إيقاف التشغيل عند عدم النشاط، لسنا بحاجة إلى القلق بشأن إيقاف الجهاز الظاهري. إذا أردت إيقاف الجهاز الافتراضي يدويًا، انقر على الزر "إيقاف" في قسم Vertex AI Workbench في وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف".

إيقاف الجهاز الافتراضي

لحذف حزمة التخزين، استخدِم قائمة التنقّل في Cloud Console، وانتقِل إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":

حذف مساحة التخزين