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

3- إعداد البيئة
يجب أن يكون لديك مشروع على Google Cloud Platform مع تفعيل الفوترة لتتمكّن من تنفيذ هذا الدرس العملي. لإنشاء مشروع، اتّبِع التعليمات هنا.
الخطوة 1: تفعيل Compute Engine API
انتقِل إلى Compute Engine وانقر على تفعيل إذا لم يكن مفعّلاً بعد. يجب توفير هذه المعلومات لإنشاء مثيل دفتر الملاحظات.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة Vertex AI API.

الخطوة 3: تفعيل واجهة برمجة التطبيقات Container Registry API
انتقِل إلى Container Registry وانقر على تفعيل إذا لم يكن مفعّلاً بعد. ستستخدم هذا المعرّف لإنشاء حاوية لمهمة التدريب المخصّصة.
الخطوة 4: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:

من هناك، ضمن دفاتر ملاحظات يديرها المستخدم، انقر على دفتر ملاحظات جديد:

بعد ذلك، اختَر أحدث إصدار من نوع مثيل TensorFlow Enterprise (مع LTS) بدون وحدات معالجة الرسومات:

استخدِم الخيارات التلقائية، ثم انقر على إنشاء.
يستند النموذج الذي سنتدرّب عليه ونعرضه في هذا الدرس التطبيقي إلى هذا الدليل من مستندات TensorFlow. يستخدم البرنامج التعليمي مجموعة بيانات Auto MPG من Kaggle للتنبؤ بالكفاءة في استهلاك الوقود في مركبة.
4. تضمين رمز التدريب في حاوية
سنرسل مهمة التدريب هذه إلى Vertex من خلال وضع رمز التدريب في حاوية Docker وإرسال هذه الحاوية إلى Google Container Registry. باستخدام هذا الأسلوب، يمكننا تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل.
للبدء، افتح نافذة "محطة طرفية" من قائمة "مشغّل التطبيقات" في مثيل دفتر الملاحظات:

أنشئ دليلاً جديدًا باسم mpg وانتقِل إليه باستخدام الأمر cd:
mkdir mpg
cd mpg
الخطوة 1: إنشاء ملف Dockerfile
تتمثل خطوتنا الأولى في إنشاء حاوية للرمز في إنشاء ملف Dockerfile. في ملف Dockerfile، سنضمّن جميع الأوامر اللازمة لتشغيل الصورة. سيتم تثبيت جميع المكتبات التي نستخدمها وإعداد نقطة الدخول لرمز التدريب. من "وحدة التحكّم"، أنشئ ملف Dockerfile فارغًا:
touch Dockerfile
افتح Dockerfile وانسخ ما يلي فيه:
FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-6
WORKDIR /
# Copies the trainer code to the docker image.
COPY trainer /trainer
# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]
يستخدم ملف Docker هذا صورة Deep Learning Container TensorFlow Enterprise 2.3 Docker. تتضمّن حزم Deep Learning Containers على Google Cloud العديد من أُطر عمل تعلُّم الآلة وعلم البيانات الشائعة المثبَّتة مسبقًا. يتضمّن الإصدار الذي نستخدمه TF Enterprise 2.3 وPandas وScikit-learn وغيرها. بعد تنزيل هذه الصورة، يضبط ملف Dockerfile نقطة الدخول لرمز التدريب. لم ننشئ هذه الملفات بعد، وفي الخطوة التالية، سنضيف الرمز اللازم لتدريب النموذج وتصديره.
الخطوة 2: إنشاء حزمة Cloud Storage
في مهمة التدريب، سنصدّر نموذج TensorFlow المدرَّب إلى حزمة Cloud Storage. سيستخدم Vertex هذا الإعداد لقراءة مواد عرض النموذج التي تم تصديرها ونشر النموذج. من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
بعد ذلك، شغِّل ما يلي في "الوحدة الطرفية" لإنشاء حزمة جديدة في مشروعك. العلامة -l (الموقع الجغرافي) مهمة لأنّها يجب أن تكون في المنطقة نفسها التي ستنشر فيها نقطة نهاية نموذج لاحقًا في البرنامج التعليمي:
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
الخطوة 3: إضافة رمز تدريب النموذج
من "الوحدة الطرفية"، شغِّل ما يلي لإنشاء دليل لرمز التدريب وملف Python حيث سنضيف الرمز:
mkdir trainer
touch trainer/train.py
يجب أن يتضمّن الدليل mpg/ ما يلي:
+ Dockerfile
+ trainer/
+ train.py
بعد ذلك، افتح ملف train.py الذي أنشأته للتو وانسخ الرمز أدناه (هذا الرمز مقتبس من البرنامج التعليمي في مستندات TensorFlow).
في بداية الملف، عدِّل المتغيّر BUCKET باستخدام اسم "حزمة التخزين" التي أنشأتها في الخطوة السابقة:
import numpy as np
import pandas as pd
import pathlib
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
print(tf.__version__)
"""## The Auto MPG dataset
The dataset is available from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/).
### Get the data
First download the dataset.
"""
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
dataset_path
"""Import it using pandas"""
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Model Year', 'Origin']
dataset = pd.read_csv(dataset_path, names=column_names,
na_values = "?", comment='\t',
sep=" ", skipinitialspace=True)
dataset.tail()
# TODO: replace `your-gcs-bucket` with the name of the Storage bucket you created earlier
BUCKET = 'gs://your-gcs-bucket'
"""### Clean the data
The dataset contains a few unknown values.
"""
dataset.isna().sum()
"""To keep this initial tutorial simple drop those rows."""
dataset = dataset.dropna()
"""The `"Origin"` column is really categorical, not numeric. So convert that to a one-hot:"""
dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})
dataset = pd.get_dummies(dataset, prefix='', prefix_sep='')
dataset.tail()
"""### Split the data into train and test
Now split the dataset into a training set and a test set.
We will use the test set in the final evaluation of our model.
"""
train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)
"""### Inspect the data
Have a quick look at the joint distribution of a few pairs of columns from the training set.
Also look at the overall statistics:
"""
train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
train_stats
"""### Split features from labels
Separate the target value, or "label", from the features. This label is the value that you will train the model to predict.
"""
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')
"""### Normalize the data
Look again at the `train_stats` block above and note how different the ranges of each feature are.
It is good practice to normalize features that use different scales and ranges. Although the model *might* converge without feature normalization, it makes training more difficult, and it makes the resulting model dependent on the choice of units used in the input.
Note: Although we intentionally generate these statistics from only the training dataset, these statistics will also be used to normalize the test dataset. We need to do that to project the test dataset into the same distribution that the model has been trained on.
"""
def norm(x):
return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)
"""This normalized data is what we will use to train the model.
Caution: The statistics used to normalize the inputs here (mean and standard deviation) need to be applied to any other data that is fed to the model, along with the one-hot encoding that we did earlier. That includes the test set as well as live data when the model is used in production.
## The model
### Build the model
Let's build our model. Here, we'll use a `Sequential` model with two densely connected hidden layers, and an output layer that returns a single, continuous value. The model building steps are wrapped in a function, `build_model`, since we'll create a second model, later on.
"""
def build_model():
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
layers.Dense(64, activation='relu'),
layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
model = build_model()
"""### Inspect the model
Use the `.summary` method to print a simple description of the model
"""
model.summary()
"""Now try out the model. Take a batch of `10` examples from the training data and call `model.predict` on it.
It seems to be working, and it produces a result of the expected shape and type.
### Train the model
Train the model for 1000 epochs, and record the training and validation accuracy in the `history` object.
Visualize the model's training progress using the stats stored in the `history` object.
This graph shows little improvement, or even degradation in the validation error after about 100 epochs. Let's update the `model.fit` call to automatically stop training when the validation score doesn't improve. We'll use an *EarlyStopping callback* that tests a training condition for every epoch. If a set amount of epochs elapses without showing improvement, then automatically stop the training.
You can learn more about this callback [here](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping).
"""
model = build_model()
EPOCHS = 1000
# The patience parameter is the amount of epochs to check for improvement
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
early_history = model.fit(normed_train_data, train_labels,
epochs=EPOCHS, validation_split = 0.2,
callbacks=[early_stop])
# Export model and save to GCS
model.save(BUCKET + '/mpg/model')
الخطوة 4: إنشاء الحاوية واختبارها محليًا
من "وحدة التحكّم"، حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم (URI) لصورة الحاوية في Google Container Registry:
IMAGE_URI="gcr.io/$PROJECT_ID/mpg:v1"
بعد ذلك، أنشئ الحاوية من خلال تنفيذ الأمر التالي من جذر دليل mpg:
docker build ./ -t $IMAGE_URI
شغِّل الحاوية داخل مثيل دفتر الملاحظات للتأكّد من أنّها تعمل بشكل صحيح:
docker run $IMAGE_URI
من المفترض أن ينتهي تدريب النموذج في غضون دقيقة إلى دقيقتَين بدقة تحقّق تبلغ %72 تقريبًا (قد تختلف الدقة المحدّدة). عند الانتهاء من تشغيل الحاوية محليًا، يمكنك نقلها إلى Google Container Registry:
docker push $IMAGE_URI
بعد أن تم إرسال الحاوية إلى Container Registry، أصبحنا الآن جاهزين لبدء مهمة تدريب نموذج مخصّص.
5- تنفيذ مهمة تدريب على Vertex AI
توفّر لك Vertex AI خيارَين لتدريب النماذج:
- AutoML: يمكنك تدريب نماذج عالية الجودة بأقل جهد ممكن وبدون الحاجة إلى خبرة في تعلُّم الآلة.
- التدريب المخصّص: شغِّل تطبيقات التدريب المخصّصة في السحابة الإلكترونية باستخدام إحدى الحاويات المُنشأة مسبقًا من Google Cloud أو استخدِم الحاويات الخاصة بك.
في هذا المختبر، نستخدم التدريب المخصّص من خلال الحاوية المخصّصة الخاصة بنا على Google Container Registry. للبدء، انتقِل إلى قسم النماذج في قسم Vertex ضمن "وحدة تحكّم Google Cloud":

الخطوة 1: بدء مهمة التدريب
انقر على إنشاء لإدخال مَعلمات مهمة التدريب والنموذج الذي تم نشره:
- ضمن مجموعة البيانات، اختَر ما مِن مجموعة بيانات مُدارة.
- بعد ذلك، اختَر التدريب المخصّص (متقدّم) كطريقة التدريب وانقر على متابعة.
- انقر على متابعة.
في الخطوة التالية، أدخِل mpg (أو أي اسم آخر تريد إطلاقه على النموذج) في حقل اسم النموذج. بعد ذلك، اختَر حاوية مخصّصة:

في مربّع النص صورة الحاوية، انقر على تصفّح وابحث عن صورة Docker التي حمّلتها للتو إلى Container Registry. اترك بقية الحقول فارغة وانقر على متابعة.
لن نستخدم ضبط المعلمات الفائقة في هذا البرنامج التعليمي، لذا اترِك المربّع Enable hyperparameter tuning بدون تحديد وانقر على Continue.
في الحوسبة والأسعار، اترك المنطقة المحدّدة كما هي واختَر n1-standard-4 كنوع الجهاز:

اترك حقول أداة التسريع فارغة وانقر على متابعة. بما أنّ النموذج في هذا العرض التوضيحي يتم تدريبه بسرعة، سنستخدم نوع جهاز أصغر.
ضمن خطوة حاوية التوقّعات، اختَر حاوية مُعدّة مسبقًا، ثمّ اختَر TensorFlow 2.6.
اترك الإعدادات التلقائية للحاوية المُنشأة مسبقًا كما هي. ضِمن دليل النماذج، أدخِل حزمة GCS مع الدليل الفرعي mpg. هذا هو المسار في نص برمجة تدريب النموذج الذي يتم فيه تصدير النموذج المدرَّب:

ستبحث Vertex في هذا الموقع الجغرافي عند نشر نموذجك. أنت الآن جاهز للتدريب. انقر على بدء التدريب لبدء مهمة التدريب. في قسم "التدريب" في وحدة التحكّم، سيظهر لك ما يلي:

6. نشر نقطة نهاية نموذج
عند إعداد مهمة التدريب، حدّدنا المكان الذي يجب أن تبحث فيه Vertex AI عن مواد عرض النموذج الذي تم تصديره. كجزء من مسار التدريب، ستنشئ Vertex مورد نموذج استنادًا إلى مسار مادة العرض هذه. إنّ مورد النموذج نفسه ليس نموذجًا تم تفعيله، ولكن بمجرد توفّر نموذج لديك، يمكنك تفعيله في نقطة نهاية. لمزيد من المعلومات حول النماذج ونقاط النهاية في Vertex AI، يمكنك الاطّلاع على المستندات.
في هذه الخطوة، سننشئ نقطة نهاية للنموذج المدرَّب. يمكننا استخدام ذلك للحصول على توقّعات بشأن نموذجنا من خلال Vertex AI API.
الخطوة 1: نشر نقطة النهاية
عند اكتمال مهمة التدريب، من المفترض أن يظهر لك نموذج باسم mpg (أو أي اسم اخترته) في قسم النماذج في وحدة التحكّم:

عندما تم تنفيذ مهمة التدريب، أنشأت Vertex مورد نموذج لك. لاستخدام هذا النموذج، عليك نشر نقطة نهاية. يمكن أن يكون لديك العديد من نقاط النهاية لكل نموذج. انقر على النموذج، ثمّ انقر على تفعيل النموذج في نقطة نهاية.
اختَر إنشاء نقطة نهاية جديدة وأدخِل اسمًا لها، مثل v1. اترك خيار الوصول العادي محدّدًا، ثم انقر على متابعة.
اترك تقسيم عدد الزيارات على 100 وأدخِل 1 في الحد الأدنى لعدد عُقد الحوسبة. ضمن نوع الجهاز، اختَر n1-standard-2 (أو أي نوع جهاز تريده). اترك بقية الإعدادات التلقائية محدّدة، ثم انقر على متابعة. لن نفعِّل ميزة الرصد لهذا النموذج، لذا انقر بعد ذلك على تفعيل لبدء عملية تفعيل نقطة النهاية.
سيستغرق نشر نقطة النهاية من 10 إلى 15 دقيقة، وستصلك رسالة إلكترونية عند اكتمال عملية النشر. عند انتهاء نشر نقطة النهاية، سيظهر لك ما يلي، ما يشير إلى نشر نقطة نهاية واحدة ضمن مورد "النموذج":

الخطوة 2: الحصول على توقّعات من النموذج الذي تم نشره
سنحصل على توقّعات من النموذج المدرَّب من دفتر ملاحظات Python، وذلك باستخدام Vertex Python API. ارجع إلى مثيل دفتر الملاحظات، وأنشئ دفتر ملاحظات Python 3 من "مشغّل التطبيقات":

في دفتر الملاحظات، نفِّذ ما يلي في خلية لتثبيت حزمة تطوير البرامج (SDK) الخاصة بمنصة Vertex AI:
!pip3 install google-cloud-aiplatform --upgrade --user
بعد ذلك، أضِف خلية في دفتر الملاحظات لاستيراد حزمة SDK وإنشاء مرجع لنقطة النهاية التي نشرتها للتو:
from google.cloud import aiplatform
endpoint = aiplatform.Endpoint(
endpoint_name="projects/YOUR-PROJECT-NUMBER/locations/us-central1/endpoints/YOUR-ENDPOINT-ID"
)
عليك استبدال قيمتَين في السلسلة endpoint_name أعلاه برقم مشروعك ونقطة النهاية. يمكنك العثور على رقم مشروعك من خلال الانتقال إلى لوحة بيانات المشروع والحصول على قيمة "رقم المشروع".
يمكنك العثور على معرّف نقطة النهاية في قسم نقاط النهاية في وحدة التحكّم هنا:

أخيرًا، يمكنك إجراء عملية توقّع لنقطة النهاية من خلال نسخ الرمز أدناه وتشغيله في خلية جديدة:
test_mpg = [1.4838871833555929,
1.8659883497083019,
2.234620276849616,
1.0187816540094903,
-2.530890710602246,
-1.6046416850441676,
-0.4651483719733302,
-0.4952254087173721,
0.7746763768735953]
response = endpoint.predict([test_mpg])
print('API response: ', response)
print('Predicted MPG: ', response.predictions[0][0])
يتضمّن هذا المثال قيمًا عادية، وهو التنسيق الذي يتوقّعه نموذجنا.
نفِّذ هذه الخلية، ومن المفترض أن تظهر لك نتيجة توقّعية تبلغ حوالي 16 ميلاً لكل غالون.
🎉 تهانينا! 🎉
تعرّفت على كيفية استخدام Vertex AI من أجل:
- تدريب نموذج من خلال توفير رمز التدريب في حاوية مخصّصة لقد استخدمت نموذج TensorFlow في هذا المثال، ولكن يمكنك تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل باستخدام حاويات مخصّصة.
- يمكنك نشر نموذج TensorFlow باستخدام حاوية معدّة مسبقًا كجزء من سير العمل نفسه الذي استخدمته في التدريب.
- إنشاء نقطة نهاية نموذج وإنشاء توقّع
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex، اطّلِع على المستندات.
7. تنظيف
إذا أردت مواصلة استخدام دفتر الملاحظات الذي أنشأته في هذا الدرس التطبيقي، ننصحك بإيقافه عندما لا يكون قيد الاستخدام. من واجهة مستخدم Workbench في Cloud Console، اختَر دفتر الملاحظات، ثم انقر على إيقاف.
إذا أردت حذف دفتر الملاحظات بالكامل، انقر على زر "حذف" في أعلى يسار الصفحة.
لحذف نقطة النهاية التي نشرتها، انتقِل إلى قسم نقاط النهاية في وحدة تحكّم Vertex AI، وانقر على نقطة النهاية التي أنشأتها، ثم اختَر إلغاء نشر النموذج من نقطة النهاية:

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