Vertex AI: تدريب نموذج مخصّص وعرضه

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".

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

3- إعداد البيئة

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

الخطوة 1: تفعيل واجهة برمجة التطبيقات Compute Engine API

انتقِل إلى Compute Engine واختَر تفعيل إذا لم يسبق لك تفعيله. ستحتاج إلى هذا لإنشاء مثيل دفتر ملاحظات.

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

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

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

الخطوة 3: تفعيل واجهة برمجة التطبيقات Container Registry API

انتقِل إلى مستودع الحِزم واختَر تفعيل إذا لم يكن مفعّلاً. ستستخدم هذا لإنشاء حاوية لوظيفة التدريب المخصصة.

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

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

قائمة Vertex AI

من هناك، ضمن أجهزة الكمبيوتر الدفترية التي يديرها المستخدم، انقر على جهاز كمبيوتر دفتري جديد:

إنشاء ورقة ملاحظات جديدة

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

مثيل TFE

استخدِم الخيارات التلقائية، ثم انقر على إنشاء.

إنّ النموذج الذي سنُدرِّبه ونعرضه في هذا الدرس التطبيقي يستند إلى هذا الدليل التعليمي من مستندات TensorFlow. يستخدِم البرنامج التعليمي مجموعة بيانات Auto MPG من Kaggle لتوقّع كفاءة استهلاك الوقود في المركبة.

4. رمز التدريب على الحاوية

سنرسل وظيفة التدريب هذه إلى Vertex عن طريق وضع رمز التدريب في حاوية Docker ودفع هذه الحاوية إلى Google Container Registry. وباستخدام هذا النهج، يمكننا تدريب نموذج تم إنشاؤه باستخدام أي إطار عمل.

للبدء، من قائمة "مشغّل التطبيقات"، افتح نافذة المحطة الطرفية في مثيل ورقة الملاحظات:

فتح وحدة طرفية في دفتر ملاحظات

أنشئ دليلاً جديدًا باسم mpg وأضِفه إليه:

mkdir mpg
cd mpg

الخطوة 1: إنشاء ملف Dockerfile

خطوتنا الأولى في احتواء التعليمة البرمجية هي إنشاء ملف Dockerfile. سنضمّن في Dockerfile جميع الأوامر اللازمة لتشغيل صورتنا. سيقوم بتثبيت جميع المكتبات التي نستخدمها وإعداد نقطة الدخول لشفرة التدريب. من Terminal، أنشئ ملف 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"]

يستخدم ملف Dockerfile هذا صورة Docker الخاصة بحاويات تعلُّم الآلة TensorFlow Enterprise 2.3. تأتي حاويات تعلُّم الآلة العميقة على Google Cloud مع العديد من إطارات عمل تعلُّم الآلة وعلم البيانات الشائعة المثبَّتة مسبقًا. وتشمل البرامج التي نستخدمها TF Enterprise 2.3 وPandas وScikit-learn وغيرها. بعد تنزيل هذه الصورة، يُعدّ Dockerfile نقطة الدخول لرمز التدريب. لم ننشئ هذه الملفات بعد، وفي الخطوة التالية، سنضيف الرمز للتدريب وتصدير نموذجنا.

الخطوة 2: إنشاء حزمة على Cloud Storage

في وظيفة التدريب، سنصدِّر نموذج TensorFlow الذي تم تدريبه إلى حزمة في Cloud Storage. ستستخدم Vertex هذا الإجراء لقراءة مواد عرض النموذج التي تم تصديرها ونشر النموذج. من "المحطة الطرفية"، شغِّل ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال your-cloud-project بمعرّف مشروعك:

PROJECT_ID='your-cloud-project'

بعد ذلك، شغِّل ما يلي في Terminal لإنشاء حزمة جديدة في مشروعك. إنّ العلامة -l (الموقع الجغرافي) مهمة لأنّها يجب أن تكون في المنطقة نفسها التي يتم فيها نشر نقطة نهاية نموذج لاحقًا في البرنامج التعليمي:

BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME

الخطوة 3: إضافة رمز تدريب النموذج

من Terminal، نفِّذ ما يلي لإنشاء دليل لرمز التدريب وملف 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: إنشاء الحاوية واختبارها محليًا

من Terminal، حدِّد متغيّرًا باستخدام معرّف الموارد المنتظم لصورة الحاوية في 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

بعد دفع الحاوية إلى "مستودع الحِزم"، أصبحنا الآن جاهزين لبدء مهمة تدريب نموذج مخصّص.

5- تنفيذ وظيفة تدريب على Vertex AI

تمنحك Vertex AI خيارَين لتدريب النماذج:

  • AutoML: يمكنك تدريب نماذج عالية الجودة بأقل جهد وبدون الحاجة إلى خبرة في تعلُّم الآلة.
  • التدريب المخصّص: يمكنك تشغيل تطبيقات التدريب المخصّص في السحابة الإلكترونية باستخدام إحدى حاويات Google Cloud المُنشأة مسبقًا أو استخدام حاويتك الخاصة.

في هذا البرنامج التدريبي، سنستخدم تدريبًا مخصّصًا من خلال حاويتنا المخصّصة على Google Container Registry. للبدء، انتقِل إلى قسم النماذج في قسم Vertex ضمن وحدة تحكّم Cloud:

قائمة Vertex

الخطوة 1: بدء مهمة التدريب

انقر على إنشاء لإدخال المَعلمات لمهمة التدريب والنموذج المنشور:

  • ضمن مجموعة البيانات، اختَر ما مِن مجموعة بيانات مُدارة.
  • بعد ذلك، اختَر التدريب المخصّص (متقدّم) كطريقة تدريب وانقر على متابعة.
  • انقر على متابعة.

في الخطوة التالية، أدخِل mpg (أو أي اسم تريد تسمية النموذج به) في حقل اسم النموذج. بعد ذلك، اختَر الحاوية المخصّصة:

خيار الحاوية المخصّصة

في مربع النص صورة الحاوية (Container image)، انقر على تصفّح واعثر على صورة Docker التي حمّلتها للتوّ إلى Container Registry. اترك بقية الحقول فارغة وانقر على متابعة.

لن نستخدم ميزة ضبط مَعلمات الخوارزميات في هذا الدليل التعليمي، لذا اترك مربّع تفعيل ميزة ضبط مَعلمات الخوارزميات غير محدَّد وانقر على متابعة.

في وحدة الحوسبة والأسعار، اترك المنطقة المحدّدة كما هي واختَر n1-standard-4 كنوع الجهاز:

نوع الجهاز

اترك حقول مسرِّعة فارغة وانقر على متابعة. نظرًا لأن النموذج في هذا العرض التوضيحي يتم تدريبه بسرعة، فإننا نستخدم نوع جهاز أصغر.

ضمن خطوة حاوية التوقّعات، اختَر حاوية مُنشأة مسبقًا ثمّ اختَر TensorFlow 2.6.

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

إعدادات التوقّع

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

وظائف التدريب

6- نشر نقطة نهاية نموذج

عند إعداد وظيفة التدريب، حدّدنا المكان الذي يجب أن تبحث فيه أداة Vertex AI عن مواد عرض النموذج التي تم تصديرها. كجزء من مسار التدريب، ستنشئ Vertex موردًا للنموذج استنادًا إلى مسار مادة العرض هذا. مورد النموذج نفسه ليس نموذجًا منشورًا، ولكن بعد توفُّر نموذج، ستكون جاهزًا لنشره في نقطة نهاية. لمعرفة المزيد من المعلومات عن النماذج ونقاط النهاية في Vertex AI، اطّلِع على المستندات.

في هذه الخطوة، سننشئ نقطة نهاية للنموذج الذي تم تدريبه. ويمكننا استخدامها للحصول على توقّعات بشأن النموذج عبر Vertex AI API.

الخطوة 1: نشر نقطة النهاية

عند اكتمال مهمة التدريب، من المفترض أن يظهر لك نموذج باسم mpg (أو أي اسم آخر تختاره) في قسم الطُرز في وحدة التحكّم:

المهام المكتملة

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

اختَر إنشاء نقطة نهاية جديدة وأدخِل اسمًا لها، مثل الإصدار 1. اترك الخيار عادي محدَّد للوصول، ثم انقر على متابعة.

اترك تقسيم عدد الزيارات على 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 للانتقال إلى "مساحة التخزين"، واختَر الحزمة، ثم انقر على "حذف":

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