Vertex AI: استخدِم ميزة التعبئة التلقائية لتحسين أداء Bard من خلال ميزة Hugging Face في Vertex AI Training

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 العديد من المنتجات المختلفة لدعم سير العمل الشامل لتعلُّم الآلة. سيركّز هذا التمرين المعملي على قسمَي "التدريب" و"منصة العمل".

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

4. إعداد البيئة

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

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

انتقِل إلى Compute Engine واختَر تفعيل إذا لم يسبق لك تفعيله.

الخطوة 2: تفعيل Vertex AI API

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

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

الخطوة 3: تفعيل Container Registry API

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

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

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

قائمة Vertex AI

في هناك، انقر على المفكرات المُدارة:

Notebooks_UI

ثم اختَر مفكرة جديدة.

new_notebook

أدخِل اسمًا لدفتر الملاحظات، ثم انقر على الإعدادات المتقدمة.

create_notebook

ضمن "الإعدادات المتقدمة"، فعِّل إيقاف التشغيل في وضع عدم النشاط واضبط عدد الدقائق على 60. وهذا يعني أنه سيتم إغلاق دفتر الملاحظات تلقائيًا عندما لا يتم استخدامه، وبذلك لن تتحمل أي تكاليف غير ضرورية.

idle_timeout

ويمكنك ترك جميع الإعدادات المتقدّمة الأخرى كما هي.

بعد ذلك، انقر على إنشاء.

بعد إنشاء المثيل، اختَر فتح JupyterLab.

open_jupyterlab

عند استخدام مثيل جديد لأول مرة، سيُطلب منك المصادقة.

مصادقة

5- كتابة رمز التدريب

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

launcher_terminal

أنشِئ دليلاً جديدًا باسم 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 وسيظهر تدريب النموذج. ينبغي أن تظهر لك على النحو التالي:

local_training

سيستغرق تدريب النموذج وقتًا طويلاً بسبب عدم استخدامنا وحدة معالجة رسومات محليًا. يمكنك الضغط على 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 للمرة الأولى، قد يستغرق إنشاء الصورة وإرسالها بضع دقائق.

training_started

ارجع إلى قسم Vertex AI Training في Cloud Console، ومن المفترض أن تظهر المهمة قيد التنفيذ ضِمن وظائف مخصَّصة.

training_job

سيستغرق إكمال المهمة حوالي 20 دقيقة.

بعد اكتمال العملية، من المفترض أن تظهر عناصر النموذج المحفوظة التالية في دليل model_output في الحزمة.

model_output

🎉 تهانينا. 🎉

لقد تعلمت كيفية استخدام Vertex AI لإجراء ما يلي:

  • تضمين رمز التدريب في حاويات وتشغيله محليًا
  • إرسال المهام التدريبية إلى Vertex AI Training باستخدام حزمة تلقائية

لمزيد من المعلومات حول الأجزاء المختلفة من Vertex AI، يمكنك الاطّلاع على المستندات.

8. تنظيف

لأنّنا ضبطنا ورقة الملاحظات على انتهاء مهلة الحاسب بعد 60 دقيقة من عدم النشاط، لا داعي للقلق بشأن إيقاف تشغيل المثيل. إذا أردت إيقاف المثيل يدويًا، انقر على زر "إيقاف" في قسم Vertex AI Workbench على وحدة التحكّم. إذا كنت ترغب في حذف الدفتر بالكامل، فانقر فوق الزر "Delete" (حذف).

حذف

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

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