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

1. نظرة عامة

في هذا الدرس التطبيقي، ستتعلّم كيفية تنفيذ مهمة تدريب مخصّصة على Vertex AI Training باستخدام ميزة "التجميع التلقائي". تستخدم مهام التدريب المخصّصة على Vertex AI الحاويات. إذا كنت لا تريد إنشاء صورتك الخاصة، يمكنك استخدام عملية التجميع التلقائي التي ستنشئ صورة 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 العديد من المنتجات المختلفة لدعم مهام سير العمل الشاملة لتعلُّم الآلة. سيركّز هذا الدرس التطبيقي على "التدريب" و"مساحة العمل".

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

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

يجب أن يكون لديك مشروع على 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

انتقِل إلى 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 وانتقِل إليه باستخدام الأمر 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. من "وحدة التحكّم"، نفِّذ ما يلي لتحديد متغيّر بيئة لمشروعك، مع الحرص على استبدال 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 Training.

نفِّذ الأمر التالي لضبط معرّف الموارد المنتظم (URI) لصورة 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 datasets و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 وستتمكّن من رؤية عملية تدريب النموذج. ينبغي أن تظهر لك على النحو التالي:

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. ستعمل ميزة التعبئة التلقائية بعد ذلك على تثبيت مكتبتَي مجموعات البيانات والمحوّلات باستخدام 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: عدد وحدات معالجة الرسومات (GPU) التي سيتم استخدامها لكل جهاز افتراضي في مجموعة الأجهزة العاملة، والقيمة التلقائية هي 1.
  • executor-image-uri: معرّف الموارد المنتظم لصورة الحاوية التي سيتم تشغيل الحزمة المقدَّمة فيها يتم ضبط هذه السمة على الصورة الأساسية.
  • local-package-path: المسار المحلي لمجلد يحتوي على رمز تدريب.
  • python-module: اسم وحدة Python التي سيتم تشغيلها داخل الحزمة المقدَّمة.

كما هو الحال عند تنفيذ الأمر المحلي، سيتم إنشاء صورة Docker ثم بدء مهمة التدريب، ولكن بدلاً من رؤية ناتج مهمة التدريب، ستظهر لك الرسالة التالية التي تؤكّد بدء مهمة التدريب. يُرجى العِلم أنّه في المرة الأولى التي تنفّذ فيها الأمر custom-jobs create، قد يستغرق إنشاء الصورة ونقلها بضع دقائق.

training_started

ارجع إلى قسم "التدريب" في Vertex AI في وحدة تحكّم السحابة الإلكترونية، وضِمن المَهمّات المخصّصة، من المفترض أن ترى مهمّتك قيد التنفيذ.

training_job

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

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

model_output

🎉 تهانينا! 🎉

تعرّفت على كيفية استخدام Vertex AI من أجل:

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

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

8. تنظيف

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

حذف

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

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