1. نظرة عامة
في هذا الدرس التطبيقي، ستتعرّف على كيفية تنفيذ مهمة تدريب مخصّصة في ميزة "التدريب الآلي" من Vertex AI باستخدام ميزة الحزمة التلقائية. تستخدم مهام التدريب المخصّصة على Vertex AI حاويات. إذا كنت لا تريد إنشاء صورتك الخاصة، يمكنك استخدام auotpackaging التي ستنشئ صورة Docker مخصّصة استنادًا إلى الرمز الخاص بك، وترسل الصورة إلى Container Registry، وتبدأ علامة CustomJob
استنادًا إلى الصورة.
المعلومات التي تطّلع عليها
ستتعرّف على كيفية:
- استخدِم الوضع المحلي لاختبار الرمز.
- يمكنك ضبط وإطلاق مهمة تدريب مخصّصة باستخدام ميزة التجميع التلقائي.
تبلغ التكلفة الإجمالية لتنفيذ هذا البرنامج التدريبي على Google Cloud حوالي 2 دولار أمريكي.
2. نظرة عامة على حالة الاستخدام
باستخدام مكتبات من Hugging Face، يمكنك تحسين نموذج Bert في مجموعة بيانات IMDB. سيتوقّع النموذج ما إذا كانت مراجعة الفيلم إيجابية أو سلبية. سيتم تنزيل مجموعة البيانات من مكتبة مجموعات بيانات Hugging Face، ونموذج Bert من مكتبة Hugging Face الخاصة بأدوات التحويل.
3- مقدمة عن Vertex AI
يستخدم هذا المختبر أحدث منتجات الذكاء الاصطناعي المتاحة على Google Cloud. تدمج Vertex AI عروض تعلُّم الآلة في Google Cloud في تجربة تطوير سلسة. في السابق، كان بالإمكان الوصول إلى النماذج المدربة باستخدام AutoML والنماذج المخصّصة من خلال خدمات منفصلة. ويجمع العرض الجديد بين الاثنين في واجهة برمجة تطبيقات واحدة، إلى جانب منتجات جديدة أخرى. يمكنك أيضًا نقل المشاريع الحالية إلى Vertex AI. إذا كانت لديك أي ملاحظات، يُرجى الانتقال إلى صفحة الدعم.
تتضمّن Vertex AI العديد من المنتجات المختلفة لدعم سير عمل تعلُّم الآلة من البداية إلى النهاية. سيركّز هذا التمرين المعملي على قسمَي "التدريب" و"منصة العمل".
4. إعداد البيئة
ستحتاج إلى مشروع على Google Cloud Platform تم تفعيل ميزة الفوترة فيه لتشغيل هذا الدليل التعليمي. لإنشاء مشروع، اتّبِع التعليمات الواردة هنا.
الخطوة 1: تفعيل واجهة برمجة التطبيقات Compute Engine API
انتقِل إلى Compute Engine واختَر تفعيل إذا لم يسبق لك تفعيله.
الخطوة 2: تفعيل واجهة برمجة التطبيقات Vertex AI API
انتقِل إلى قسم Vertex AI في Cloud Console وانقر على تفعيل واجهة برمجة التطبيقات Vertex AI API.
الخطوة 3: تفعيل واجهة برمجة التطبيقات Container Registry API
انتقِل إلى مستودع الحاويات واختَر تفعيل إذا لم يكن مفعّلاً. ستستخدم هذا الإجراء لإنشاء حاوية لمهمة التدريب المخصّصة.
الخطوة 4: إنشاء مثيل Vertex AI Workbench
من قسم Vertex AI في Cloud Console، انقر على Workbench:
من هناك، انقر على دفاتر الملاحظات المُدارة:
بعد ذلك، اختَر دفتر ملاحظات جديد.
أدخِل اسمًا لدفتر الملاحظات، ثم انقر على الإعدادات المتقدّمة.
ضمن "الإعدادات المتقدّمة"، فعِّل ميزة "إيقاف الجهاز في حال عدم النشاط" واضبط عدد الدقائق على 60. وهذا يعني أنه سيتم إيقاف تشغيل دفتر الملاحظات تلقائيًا عندما لا يتم استخدامه، وبذلك لن تتحمل أي تكاليف غير ضرورية.
يمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.
بعد ذلك، انقر على إنشاء.
بعد إنشاء المثيل، اختَر فتح JupyterLab.
في المرة الأولى التي تستخدم فيها مثيلًا جديدًا، سيُطلب منك المصادقة.
5- كتابة رمز التدريب
للبدء، من قائمة "مشغّل التطبيقات"، افتح نافذة المحطة الطرفية في مثيل ورقة الملاحظات:
أنشئ دليلاً جديدًا باسم autopkg-codelab
وانتقِل إليه باستخدام الأمر cd.
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
هو النموذج الذي نريد تحسينه. في هذه الحالة، نستخدم Bert.- ستحمِّل طريقة
TFAutoModelForSequenceClassification
بنية نموذج اللغة المحدّدة + الأوزان في TensorFlow وستضيف قسمًا للتصنيف في الأعلى مع أوزان تمّت إعدادها عشوائيًا. وفي هذه الحالة، لدينا مشكلة تصنيف ثنائي (إيجابي أو سالب) ولذلك نحددnum_labels=2
لهذا المصنِّف.
6- تجميع رمز التدريب وتشغيله على الجهاز
يمكنك استخدام الأمر gcloud ai custom-jobs local-run
لإنشاء صورة حاوية Docker استنادًا إلى رمز التدريب وتشغيل الصورة كملء حاوية على جهازك. يؤدي تشغيل حاوية محليًا إلى تنفيذ رمز التدريب بطريقة مشابهة لطريقة تنفيذه في أداة "تدريب Vertex AI"، ويمكن أن يساعدك ذلك في تصحيح الأخطاء في الرمز قبل إجراء تدريب مخصّص على Vertex AI.
في المهمة التدريبية، سنصدِّر النموذج المُدرَّب إلى حزمة Cloud Storage. من Terminal، نفِّذ ما يلي لتحديد متغيّر env لمشروعك، مع الحرص على استبدال your-cloud-project
بمعرّف مشروعك:
PROJECT_ID='your-cloud-project'
بعد ذلك، أنشئ حزمة. إذا كان لديك حزمة حالية، يمكنك استخدامها بدلاً من ذلك.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
عند تشغيل وظيفة التدريب المخصّصة في "تدريب Vertex AI"، سنستخدم وحدة معالجة الرسومات. ولكن بما أننا لم نحدد مثيل Workbench مع وحدات معالجة الرسومات، فسنستخدم صورة تستند إلى وحدة المعالجة المركزية للاختبار المحلي. في هذا المثال، نستخدم حاوية مُنشأة مسبقًا في ميزة "تدريب الذكاء الاصطناعي من Vertex".
نفِّذ ما يلي لضبط معرّف الموارد المنتظمة لصورة Docker لاستخدامها كأساس للحاوية.
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
بعد ذلك، اضبط اسمًا لصورة Docker الناتجة التي تم إنشاؤها باستخدام الأمر run المحلي.
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
يستخدم رمز التدريب مجموعات بيانات Hugging Face ومكتبات Transformers. لا يتم تضمين هذه المكتبات في الصورة التي اخترناها كصورة أساسية، لذا سنحتاج إلى تقديمها كمتطلبات. لإجراء ذلك، سننشئ ملف 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". باستخدام أمر واحد، ستؤدي هذه الميزة إلى:
- أنشئ صورة Docker مخصّصة استنادًا إلى الرمز البرمجي.
- ادفع الصورة إلى "مستودع الحاويات".
- ابدأ
CustomJob
استنادًا إلى الصورة.
ارجِع إلى الوحدة الطرفية وأضِف مستوى أعلى إلى دليل autopkg-codelab
.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
حدِّد صورة TensorFlow GPU المُنشأة مسبقًا في 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
. بعد ذلك، ستثبِّت ميزة الحزمة التلقائية مكتبات "مجموعات البيانات" و"المحوِّلات" باستخدام pip كما هو محدّد في ملف 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
: عدد وحدات معالجة الرسومات لكل جهاز افتراضي في مجموعة العمال لاستخدامها، والقيمة التلقائية هي 1.executor-image-uri
: معرّف الموارد المنتظم (URI) لصورة الحاوية التي ستُشغِّل الحزمة المقدَّمة تم تعيين ذلك على صورتنا الأساسية.local-package-path
: المسار المحلي لمجلد يحتوي على رمز تدريب-
python-module
: اسم وحدة Python المطلوب تشغيلها ضمن الحزمة المقدَّمة.
تمامًا كما حدث عند تنفيذ الأمر على الجهاز، سترى صورة Docker يتم إنشاؤها ثم بدء مهمة التدريب. ولكن بدلاً من رؤية ناتج مهمة التدريب، ستظهر لك الرسالة التالية التي تؤكّد أنّه تم إطلاق مهمة التدريب. يُرجى العلم أنّه في المرة الأولى التي تُشغِّل فيها الأمر custom-jobs create
، قد يستغرق إنشاء الصورة ودفعها بضع دقائق.
ارجع إلى قسم "تدريب Vertex AI" في وحدة تحكّم السحابة الإلكترونية، ومن المفترض أن تظهر لك مهمتك قيد التشغيل ضمن المهام المخصّصة.
سيستغرق إكمال المهمة 20 دقيقة تقريبًا.
بعد اكتمال العملية، من المفترض أن تظهر لك عناصر النموذج المحفوظة التالية في دليل model_output
في حِزمك.
🎉 تهانينا. 🎉
لقد تعلّمت كيفية استخدام Vertex AI لتنفيذ ما يلي:
- تجميع رمز التدريب وتشغيله على الجهاز
- إرسال مهام التدريب إلى ميزة "تدريب الذكاء الاصطناعي من Google Vertex" باستخدام الحزمة التلقائية
لمزيد من المعلومات عن الأجزاء المختلفة من Vertex AI، اطّلِع على المستندات.
8. تنظيف
بما أنّنا ضبطنا دفتر البيانات على إيقافه بعد 60 دقيقة من عدم النشاط، لا داعي للقلق بشأن إيقافه. إذا أردت إيقاف المثيل يدويًا، انقر على زر "إيقاف" في قسم Vertex AI Workbench من وحدة التحكّم. إذا أردت حذف دفتر الملاحظات بالكامل، انقر على الزر "حذف".
لحذف "حزمة التخزين"، باستخدام قائمة التنقّل في Cloud Console، انتقِل إلى "مساحة التخزين" واختَر الحزمة وانقر على "حذف":