1. نظرة عامة
في هذا الدرس العملي، ستستخدم Vertex AI للحصول على توقّعات من نموذج مصنّف صور مدرَّب مسبقًا.
ما ستتعرّف عليه
ستتعرّف على كيفية:
- استيراد نموذج TensorFlow إلى "سجلّ نماذج Vertex AI"
- الحصول على توقّعات على الإنترنت
- تعديل وظيفة عرض TensorFlow
تبلغ التكلفة الإجمالية لتنفيذ هذا البرنامج التدريبي على Google Cloud حوالي 1 دولار أمريكي.
2. مقدمة عن Vertex AI
يستخدم هذا المختبر أحدث منتجات الذكاء الاصطناعي المتاحة على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة في Google Cloud في تجربة تطوير سلسة. في السابق، كان بالإمكان الوصول إلى النماذج المدربة باستخدام AutoML والنماذج المخصّصة من خلال خدمات منفصلة. ويجمع العرض الجديد بين الاثنين في واجهة برمجة تطبيقات واحدة، إلى جانب منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI.
تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم سير عمل تعلُّم الآلة من البداية إلى النهاية. سيركّز هذا الدرس التطبيقي على المنتجات المميّزة أدناه: التوقّعات وWorkbench.
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.
الخطوة 3: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:
فعِّل Notebooks API إذا لم يسبق لك تفعيلها.
بعد التفعيل، انقر على المفكرات المُدارة:
بعد ذلك، اختَر دفتر ملاحظات جديد.
أدخِل اسمًا لدفتر الملاحظات، وضمن الإذن، اختَر حساب الخدمة.
انقر على الإعدادات المتقدّمة.
ضمن الأمان، اختَر "تفعيل الوحدة الطرفية" إذا لم يسبق لك تفعيلها.
يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء. ستستغرق عملية توفير المثيل بضع دقائق.
بعد إنشاء المثيل، اختَر فتح JUPYTERLAB.
5- تسجيل النموذج
الخطوة 1: تحميل النموذج إلى Cloud Storage
انقر على هذا الرابط للانتقال إلى صفحة TensorFlow Hub لنموذج MobileNet V1 الذي تم تدريبه على مجموعة بيانات ImagNet.
انقر على تنزيل لتنزيل عناصر النموذج المحفوظة.
من قسم Cloud Storage في وحدة تحكّم Google Cloud، اختَر إنشاء.
يُرجى تسمية الحزمة واختيار us-central1 منطقة. بعد ذلك، انقر على إنشاء.
حمِّل نموذج TensorFlow hub الذي نزّلته إلى الحزمة. احرص على فك ضغط الملف أولاً.
يجب أن تبدو الحزمة على النحو التالي:
imagenet_mobilenet_v1_050_128_classification_5/
saved_model.pb
variables/
variables.data-00000-of-00001
variables.index
الخطوة 2: استيراد النموذج إلى قاعدة بيانات المسجّلين
انتقِل إلى قسم سجلّ النماذج في Vertex AI ضمن وحدة تحكّم Cloud.
انقر على استيراد.
اختَر الاستيراد كنموذج جديد، ثم أدخِل اسمًا لنموذجك.
ضمن إعدادات النموذج، حدِّد أحدث حاوية TensorFlow مُنشأة مسبقًا. بعد ذلك، اختَر المسار في Cloud Storage حيث تم تخزين عناصر النموذج.
يمكنك تخطّي قسم التفسير.
بعد ذلك، اختَر استيراد.
بعد الاستيراد، سيظهر النموذج في سجلّ النماذج.
6- نموذج النشر
من "سجلّ النماذج"، اختَر النقاط الثلاث على يسار النموذج وانقر على نشر إلى نقطة النهاية.
ضمن تحديد نقطة النهاية، اختَر إنشاء نقطة نهاية جديدة، ثمّ أدخِل اسمًا لنقطة النهاية.
ضمن إعدادات النموذج، اضبط الحد الأقصى لعدد العقد الحاسوبية على 1، واضبط نوع الجهاز على n1-standard-2
، واترك جميع الإعدادات الأخرى كما هي. ثم انقر على نشر.
عند نشر التطبيق، ستتغيّر حالة النشر إلى تم نشره على 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
بعد ذلك، عليك اختبار نقطة النهاية.
أولاً، نزِّل الصورة التالية وحمِّلها على المثيل الخاص بك.
افتح الصورة باستخدام 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
، والذي يغلف نموذج 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])
حدِّد عنوان URL للحزمة التي أنشأتها سابقًا.
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
لدمج وظيفة العرض مع النموذج الأساسي (بدلاً من استخدام وحدة المعالجة المركزية).
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، انتقِل إلى "مساحة التخزين" واختَر الحزمة وانقر على "حذف":