1. نظرة عامة
في هذا التمرين، ستتعرّف على كيفية إجراء مهمة تدريبية مخصّصة على Vertex AI Training باستخدام ميزة "التجميع التلقائي". تستخدم مهام التدريب المخصّصة على Vertex AI الحاويات. إذا كنت لا تريد إنشاء صورتك الخاصة، يمكنك استخدام auotpackaging التي ستنشئ صورة Docker مخصّصة استنادًا إلى الرمز الخاص بك، وترسل الصورة إلى Container Registry، وتبدأ علامة CustomJob
استنادًا إلى الصورة.
المعلومات التي تطّلع عليها
وستتعرّف على كيفية:
- يمكنك استخدام الوضع المحلي لاختبار الرمز.
- يمكنك إعداد مهمة تدريب مخصّصة وإطلاقها باستخدام ميزة التجميع التلقائي.
تبلغ التكلفة الإجمالية لتشغيل هذا التمرين على Google Cloud حوالي $2.
2. نظرة عامة على حالة الاستخدام
باستخدام مكتبات من Hugging Face، يمكنك ضبط نموذج Bard على مجموعة بيانات IMDB. سيتنبأ النموذج بما إذا كانت مراجعة الفيلم إيجابية أو سلبية. سيتم تنزيل مجموعة البيانات من مكتبة مجموعات بيانات Hugging Face ونموذج Bard من مكتبة Hugging Face Transformers.
3- مقدّمة عن Vertex AI
يستخدم هذا البرنامج أحدث منتجات الذكاء الاصطناعي المتوفّرة على Google Cloud. تدمج Vertex AI حلول تعلُّم الآلة في Google Cloud ضمن تجربة تطوير سلسة. في السابق، كان الوصول إلى النماذج المدرَّبة باستخدام AutoML والنماذج المخصّصة ممكنًا من خلال خدمات منفصلة. ويدمج العرض الجديد كلاً من واجهة برمجة تطبيقات واحدة مع منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI. إذا كان لديك أي ملاحظات، يُرجى الاطّلاع على صفحة الدعم.
يتضمّن Vertex AI العديد من المنتجات المختلفة لدعم سير العمل الشامل لتعلُّم الآلة. سيركّز هذا التمرين المعملي على قسمَي "التدريب" و"منصة العمل".
4. إعداد البيئة
ستحتاج إلى مشروع Google Cloud Platform مع تفعيل الفوترة لتشغيل هذا الدرس التطبيقي حول الترميز. لإنشاء مشروع، يُرجى اتّباع التعليمات هنا.
الخطوة 1: تفعيل واجهة برمجة تطبيقات Compute Engine
انتقِل إلى 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:
في هناك، انقر على المفكرات المُدارة:
ثم اختَر مفكرة جديدة.
أدخِل اسمًا لدفتر الملاحظات، ثم انقر على الإعدادات المتقدمة.
ضمن "الإعدادات المتقدمة"، فعِّل إيقاف التشغيل في وضع عدم النشاط واضبط عدد الدقائق على 60. وهذا يعني أنه سيتم إغلاق دفتر الملاحظات تلقائيًا عندما لا يتم استخدامه، وبذلك لن تتحمل أي تكاليف غير ضرورية.
ويمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء.
بعد إنشاء المثيل، اختَر فتح JupyterLab.
عند استخدام مثيل جديد لأول مرة، سيُطلب منك المصادقة.
5- كتابة رمز التدريب
للبدء، من قائمة "مشغّل التطبيقات"، افتح نافذة المحطة الطرفية في مثيل ورقة الملاحظات:
أنشِئ دليلاً جديدًا باسم autopkg-codelab
وأضِفه إلى القرص المضغوط.
mkdir autopkg-codelab
cd autopkg-codelab
من Terminal، شغِّل ما يلي لإنشاء دليل لرمز التدريب وملف Python حيث ستضيف الرمز:
mkdir trainer
touch trainer/task.py
من المفترض أن يكون لديك الآن ما يلي في دليل autopkg-codelab/
:
+ trainer/
+ task.py
بعد ذلك، افتح ملف task.py
الذي أنشأته وانسخ الرمز أدناه.
import argparse
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer
from transformers import TFAutoModelForSequenceClassification
CHECKPOINT = "bert-base-cased"
def get_args():
'''Parses args.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--epochs',
required=False,
default=3,
type=int,
help='number of epochs')
parser.add_argument(
'--job_dir',
required=True,
type=str,
help='bucket to store saved model, include gs://')
args = parser.parse_args()
return args
def create_datasets():
'''Creates a tf.data.Dataset for train and evaluation.'''
raw_datasets = load_dataset('imdb')
tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
tokenized_datasets = raw_datasets.map((lambda examples: tokenize_function(examples, tokenizer)), batched=True)
# To speed up training, we use only a portion of the data.
# Use full_train_dataset and full_eval_dataset if you want to train on all the data.
small_train_dataset = tokenized_datasets['train'].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets['test'].shuffle(seed=42).select(range(1000))
full_train_dataset = tokenized_datasets['train']
full_eval_dataset = tokenized_datasets['test']
tf_train_dataset = small_train_dataset.remove_columns(['text']).with_format("tensorflow")
tf_eval_dataset = small_eval_dataset.remove_columns(['text']).with_format("tensorflow")
train_features = {x: tf_train_dataset[x] for x in tokenizer.model_input_names}
train_tf_dataset = tf.data.Dataset.from_tensor_slices((train_features, tf_train_dataset["label"]))
train_tf_dataset = train_tf_dataset.shuffle(len(tf_train_dataset)).batch(8)
eval_features = {x: tf_eval_dataset[x] for x in tokenizer.model_input_names}
eval_tf_dataset = tf.data.Dataset.from_tensor_slices((eval_features, tf_eval_dataset["label"]))
eval_tf_dataset = eval_tf_dataset.batch(8)
return train_tf_dataset, eval_tf_dataset
def tokenize_function(examples, tokenizer):
'''Tokenizes text examples.'''
return tokenizer(examples['text'], padding='max_length', truncation=True)
def main():
args = get_args()
train_tf_dataset, eval_tf_dataset = create_datasets()
model = TFAutoModelForSequenceClassification.from_pretrained(CHECKPOINT, num_labels=2)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=tf.metrics.SparseCategoricalAccuracy(),
)
model.fit(train_tf_dataset, validation_data=eval_tf_dataset, epochs=args.epochs)
model.save(f'{args.job_dir}/model_output')
if __name__ == "__main__":
main()
بعض الأشياء التي يجب ملاحظتها حول التعليمة البرمجية:
CHECKPOINT
هو النموذج الذي نريد تحسينه. في هذه الحالة، نستخدم برت.- ستؤدي الطريقة
TFAutoModelForSequenceClassification
إلى تحميل بنية النموذج اللغوي والأوزان المحدّدة في TensorFlow وإضافة عنوان تصنيف أعلاه باستخدام ترجيحات تم إعدادها عشوائيًا. وفي هذه الحالة، لدينا مشكلة تصنيف ثنائي (إيجابي أو سالب) ولذلك نحددnum_labels=2
لهذا المصنِّف.
6- تضمين رمز التدريب في حاويات وتشغيله محليًا
يمكنك استخدام الأمر gcloud ai custom-jobs local-run
لإنشاء صورة حاوية في Docker استنادًا إلى رمز التدريب، ثم تشغيل الصورة كحاوية على جهازك المحلي. يؤدي تشغيل حاوية إلى تنفيذ رمز التدريب على الجهاز بطريقة مشابهة لطريقة تشغيلها على Vertex AI Training، ويمكن أن يساعدك ذلك في تصحيح الأخطاء في الرمز البرمجي قبل إجراء تدريب مخصّص على Vertex AI.
في المهمة التدريبية، سنصدِّر النموذج المُدرَّب إلى حزمة Cloud Storage. من "المحطة الطرفية"، شغِّل ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال your-cloud-project
بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
بعد ذلك، قم بإنشاء حزمة. إذا كانت لديك حزمة حالية، يمكنك استخدامها بدلاً من ذلك.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
عندما ننفّذ مهمة التدريب المخصّصة على Vertex AI Training، سنستخدم وحدة معالجة رسومات. ولكن بما أننا لم نحدد مثيل Workbench مع وحدات معالجة الرسومات، فسنستخدم صورة تستند إلى وحدة المعالجة المركزية للاختبار المحلي. في هذا المثال، نستخدم حاوية مُعدّة مسبقًا لتدريب Vertex AI.
نفِّذ ما يلي لضبط عنوان URL لصورة Docker لاستخدامه كأساس للحاوية.
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
ثم قم بتعيين اسم لصورة Docker الناتجة التي تم إنشاؤها بواسطة أمر التشغيل المحلي.
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
وتستخدم تعليماتنا البرمجية التدريبية مجموعات بيانات Hugging Face ومكتبات المحولات. هذه المكتبات غير مضمّنة في الصورة التي اخترناها كصورة أساسية، لذا سنحتاج إلى توفير هذه المكتبات كمتطلبات. لإجراء ذلك، سننشئ ملف requirements.txt
في دليل autopkg-codelab
.
تأكَّد من الانتقال إلى دليل autopkg-codelab
واكتب ما يلي في الوحدة الطرفية.
touch requirements.txt
من المفترض أن يكون لديك الآن ما يلي في دليل autopkg-codelab
:
+ requirements.txt
+ trainer/
+ task.py
افتح ملف المتطلبات والصق ما يلي
datasets==1.18.2
transformers==4.16.2
أخيرًا، نفِّذ الأمر gcloud ai custom-jobs local-run
لبدء التدريب على المثيل المُدار من Workbench.
gcloud ai custom-jobs local-run \
--executor-image-uri=$BASE_CPU_IMAGE \
--python-module=trainer.task \
--output-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME
من المفترض أن ترى صورة Docker التي يتم إنشاؤها. سيتم تثبيت التبعيات التي أضفناها إلى ملف requirements.txt
في pip. قد يستغرق إكمال هذا الأمر بضع دقائق عند تنفيذ هذا الأمر للمرة الأولى. بعد إنشاء الصورة، سيبدأ تشغيل ملف task.py
وسيظهر تدريب النموذج. ينبغي أن تظهر لك على النحو التالي:
سيستغرق تدريب النموذج وقتًا طويلاً بسبب عدم استخدامنا وحدة معالجة رسومات محليًا. يمكنك الضغط على Ctrl+c وإلغاء التدريب المحلي بدلاً من انتظار اكتمال المهمة.
لاحظ أنه إذا كنت تريد إجراء المزيد من الاختبارات، يمكنك أيضًا تشغيل الصورة المنشأة أعلاه مباشرة، من دون إعادة إنشاء حزم.
gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1
7. إنشاء مهمة مخصّصة
بعد أن اختبرنا الوضع المحلي، سنستخدم ميزة التعبئة التلقائية لإطلاق مهمتنا التدريبية المخصّصة في Vertex AI Training. باستخدام أمر واحد، ستقوم هذه الميزة بما يلي:
- يمكنك إنشاء صورة Docker مخصّصة استنادًا إلى الرمز الخاص بك.
- أرسِل الصورة إلى Container Registry.
- ابدأ تشغيل "
CustomJob
" استنادًا إلى الصورة.
ارجِع إلى الوحدة الطرفية وأضِف مستوى أعلى إلى دليل autopkg-codelab
.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
يمكنك تحديد صورة وحدة معالجة الرسومات TensorFlow التي تم إنشاؤها مسبقًا من Vertex AI Training كصورة أساسية لمهمة التدريب المخصَّصة.
BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest
بعد ذلك، نفِّذ الأمر gcloud ai custom-jobs create
. أولاً، سينشئ هذا الأمر صورة Docker مخصصة بناءً على رمز التدريب. الصورة الأساسية هي حاوية Vertex AI Training التي تم إنشاؤها مسبقًا وضبطناها على أنّها "BASE_GPU_IMAGE
". ستعمل ميزة التعبئة التلقائية بعد ذلك على تثبيت مجموعات البيانات ومكتبات المحوّلات كما هو محدّد في ملف requirements.txt
.
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=fine_tune_bert \
--args=--job_dir=$BUCKET_NAME \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,executor-image-uri=$BASE_GPU_IMAGE,local-package-path=autopkg-codelab,python-module=trainer.task
لنلقِ نظرة على الوسيطة worker-pool-spec
. تحدِّد هذه السياسة إعدادات مجموعة العمّال التي تستخدمها المهمة المخصّصة. يمكنك تحديد مواصفات مجموعة كبيرة للعاملين لإنشاء مهمة مخصصة مع مجموعات متعددة للعاملين للتدريب الموزَّع. في هذا المثال، نحدد فقط مجموعة عاملين واحدة، حيث لم يتم ضبط رمز التدريب للتدريب الموزَّع.
في ما يلي بعض الحقول الرئيسية لهذه المواصفات:
machine-type
(مطلوب): نوع الجهاز. يُرجى النقر هنا للاطّلاع على الأنواع المتوافقة.replica-count
: عدد النُسخ المتماثلة للعمّال لاستخدامها في مجموعة العمال هذه، والقيمة التلقائية هي 1.accelerator-type
: نوع وحدات معالجة الرسومات يُرجى النقر هنا للاطّلاع على الأنواع المتوافقة. في هذا المثال، حددنا وحدة معالجة رسومات واحدة من NVIDIA Tesla V100.accelerator-count
: عدد وحدات معالجة الرسومات (GPU) لكل جهاز افتراضي في مجموعة أدوات العمل التي سيتم استخدامها، وتكون القيمة 1 تلقائيًا.executor-image-uri
: معرّف الموارد المنتظم (URI) لصورة الحاوية التي ستُشغِّل الحزمة المقدَّمة تم تعيين ذلك على صورتنا الأساسية.local-package-path
: المسار المحلي لمجلد يحتوي على رمز تدريبpython-module
: اسم وحدة Python المطلوب تشغيله ضمن الحزمة المتوفرة
كما هو الحال عند إدارة الأمر المحلي، سترى صورة Docker يتم إنشاؤها ثم تبدأ مهمة التدريب. وباستثناء ما إذا كنت ترى مخرجات مهمة التدريب، ستظهر لك الرسالة التالية التي تؤكد بدء مهمة التدريب. يُرجى العلم أنّه عند تشغيل الأمر custom-jobs create
للمرة الأولى، قد يستغرق إنشاء الصورة وإرسالها بضع دقائق.
ارجع إلى قسم Vertex AI Training في Cloud Console، ومن المفترض أن تظهر المهمة قيد التنفيذ ضِمن وظائف مخصَّصة.
سيستغرق إكمال المهمة حوالي 20 دقيقة.
بعد اكتمال العملية، من المفترض أن تظهر عناصر النموذج المحفوظة التالية في دليل model_output
في الحزمة.
🎉 تهانينا. 🎉
لقد تعلمت كيفية استخدام Vertex AI لإجراء ما يلي:
- تضمين رمز التدريب في حاويات وتشغيله محليًا
- إرسال المهام التدريبية إلى Vertex AI Training باستخدام حزمة تلقائية
لمزيد من المعلومات حول الأجزاء المختلفة من Vertex AI، يمكنك الاطّلاع على المستندات.
8. تنظيف
لأنّنا ضبطنا ورقة الملاحظات على انتهاء مهلة الحاسب بعد 60 دقيقة من عدم النشاط، لا داعي للقلق بشأن إيقاف تشغيل المثيل. إذا أردت إيقاف المثيل يدويًا، انقر على زر "إيقاف" في قسم Vertex AI Workbench على وحدة التحكّم. إذا كنت ترغب في حذف الدفتر بالكامل، فانقر فوق الزر "Delete" (حذف).
لحذف "حزمة التخزين"، باستخدام قائمة التنقّل في Cloud Console، انتقِل إلى "مساحة التخزين" واختَر الحزمة وانقر على "حذف":