Vertex AI: از بسته بندی خودکار برای تنظیم دقیق برت با صورت در آغوش گرفته در آموزش هوش مصنوعی Vertex استفاده کنید.

۱. مرور کلی

در این آزمایش، یاد خواهید گرفت که چگونه یک کار آموزشی سفارشی را در Vertex AI Training با ویژگی autopackaging اجرا کنید. کارهای آموزشی سفارشی در Vertex AI از کانتینرها استفاده می‌کنند. اگر نمی‌خواهید تصویر خودتان را بسازید، می‌توانید از auotpackaging استفاده کنید که یک تصویر Docker سفارشی بر اساس کد شما می‌سازد، تصویر را به Container Registry ارسال می‌کند و یک CustomJob بر اساس تصویر شروع می‌کند.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

هزینه کل اجرای این آزمایشگاه در گوگل کلود حدود ۲ دلار است.

۲. بررسی اجمالی موارد استفاده

با استفاده از کتابخانه‌های Hugging Face ، می‌توانید یک مدل Bert را روی مجموعه داده‌های IMDB تنظیم کنید. این مدل پیش‌بینی می‌کند که آیا نقد یک فیلم مثبت است یا منفی. مجموعه داده‌ها از کتابخانه مجموعه داده‌های Hugging Face و مدل Bert از کتابخانه تبدیل‌کننده‌های Hugging Face دانلود می‌شوند.

۳. مقدمه‌ای بر هوش مصنوعی ورتکس

این آزمایشگاه از جدیدترین محصول هوش مصنوعی موجود در Google Cloud استفاده می‌کند. Vertex AI، محصولات یادگیری ماشین را در Google Cloud ادغام می‌کند تا یک تجربه توسعه یکپارچه را فراهم کند. پیش از این، مدل‌های آموزش‌دیده با AutoML و مدل‌های سفارشی از طریق سرویس‌های جداگانه قابل دسترسی بودند. این محصول جدید، هر دو را در یک API واحد، به همراه سایر محصولات جدید، ترکیب می‌کند. همچنین می‌توانید پروژه‌های موجود را به Vertex AI منتقل کنید. در صورت داشتن هرگونه بازخورد، لطفاً به صفحه پشتیبانی مراجعه کنید.

Vertex AI شامل محصولات مختلفی برای پشتیبانی از گردش‌های کاری یادگیری ماشینی سرتاسری است. این آزمایشگاه بر آموزش و میز کار تمرکز خواهد داشت.

بررسی اجمالی محصولات ورتکس

۴. محیط خود را آماده کنید

برای اجرای این codelab به یک پروژه Google Cloud Platform با قابلیت پرداخت صورتحساب نیاز دارید. برای ایجاد یک پروژه، دستورالعمل‌های اینجا را دنبال کنید.

مرحله ۱: فعال کردن رابط برنامه‌نویسی کاربردی موتور محاسبات

به Compute Engine بروید و اگر از قبل فعال نیست، آن را فعال کنید .

مرحله 2: فعال کردن API هوش مصنوعی Vertex

به بخش Vertex AI در کنسول ابری خود بروید و روی Enable Vertex AI API کلیک کنید.

داشبورد هوش مصنوعی ورتکس

مرحله 3: فعال کردن API رجیستری کانتینر

به رجیستری کانتینر بروید و اگر فعال نیست، آن را فعال کنید. از این برای ایجاد یک کانتینر برای کار آموزشی سفارشی خود استفاده خواهید کرد.

مرحله ۴: ایجاد یک نمونه از Vertex AI Workbench

از بخش Vertex AI در کنسول ابری خود، روی Workbench کلیک کنید:

منوی هوش مصنوعی ورتکس

از آنجا، روی دفترچه‌های مدیریت‌شده کلیک کنید:

رابط کاربری نوت‌بوک‌ها

سپس دفترچه یادداشت جدید را انتخاب کنید.

نوت بوک_جدید

برای نوت‌بوک خود یک نام انتخاب کنید و سپس روی تنظیمات پیشرفته (Advanced Settings) کلیک کنید.

ایجاد_نوت_بوک

در قسمت تنظیمات پیشرفته، خاموش شدن در حالت بیکاری را فعال کنید و تعداد دقیقه‌ها را روی ۶۰ تنظیم کنید. این یعنی نوت‌بوک شما در صورت عدم استفاده به طور خودکار خاموش می‌شود تا هزینه‌های غیرضروری متحمل نشوید.

idle_timeout

می‌توانید تمام تنظیمات پیشرفته دیگر را همانطور که هست، رها کنید.

در مرحله بعد، روی ایجاد کلیک کنید.

پس از ایجاد نمونه، گزینه Open JupyterLab را انتخاب کنید.

open_jupyterlab

اولین باری که از یک نمونه جدید استفاده می‌کنید، از شما خواسته می‌شود که احراز هویت کنید.

احراز هویت کردن

۵. کد آموزشی را بنویسید

برای شروع، از منوی Launcher، یک پنجره ترمینال در نوت‌بوک خود باز کنید:

ترمینال لانچر

یک دایرکتوری جدید به نام autopkg-codelab ایجاد کنید و با دستور cd وارد آن شوید.

mkdir autopkg-codelab
cd autopkg-codelab

از ترمینال خود، دستور زیر را اجرا کنید تا یک دایرکتوری برای کد آموزشی و یک فایل پایتون که کد را در آن اضافه خواهید کرد، ایجاد شود:

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 تعیین می‌کنیم.

۶. کد آموزشی را به صورت محلی کانتینرایز و اجرا کنید

شما می‌توانید از دستور gcloud ai custom-jobs local-run برای ساخت یک تصویر کانتینر Docker بر اساس کد آموزشی خود استفاده کنید و تصویر را به عنوان یک کانتینر روی دستگاه محلی خود اجرا کنید. اجرای یک کانتینر به صورت محلی، کد آموزشی شما را به روشی مشابه نحوه اجرا در Vertex AI Training اجرا می‌کند و می‌تواند به شما در اشکال‌زدایی مشکلات کدتان قبل از انجام آموزش سفارشی در Vertex AI کمک کند.

در کار آموزشی‌مان، مدل آموزش‌دیده‌مان را به یک مخزن ذخیره‌سازی ابری (Cloud Storage Bucket) اکسپورت خواهیم کرد. از طریق ترمینال خود، دستور زیر را اجرا کنید تا یک متغیر 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 اجرا می‌کنیم، از یک GPU استفاده خواهیم کرد. اما از آنجایی که نمونه Workbench خود را با GPU مشخص نکرده‌ایم، از یک تصویر مبتنی بر CPU برای آزمایش محلی استفاده خواهیم کرد. در این مثال، از یک کانتینر از پیش ساخته شده Vertex AI Training استفاده می‌کنیم.

برای تنظیم URI یک تصویر داکر به عنوان پایه کانتینر، دستور زیر را اجرا کنید.

BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest

سپس برای تصویر داکر حاصل که توسط دستور 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

فایل requirements را باز کنید و موارد زیر را در آن قرار دهید

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

شما باید ببینید که ایمیج داکر در حال ساخته شدن است. وابستگی‌هایی که به فایل requirements.txt اضافه کرده‌ایم، توسط pip نصب خواهند شد. اولین باری که این دستور را اجرا می‌کنید، ممکن است چند دقیقه طول بکشد تا این فرآیند تکمیل شود. پس از ساخته شدن ایمیج، فایل task.py شروع به اجرا می‌کند و آموزش مدل را مشاهده خواهید کرد. باید چیزی شبیه به این را ببینید:

آموزش_محلی

از آنجا که ما از یک پردازنده گرافیکی (GPU) به صورت محلی استفاده نمی‌کنیم، آموزش مدل زمان زیادی طول خواهد کشید. می‌توانید به جای انتظار برای اتمام کار، Ctrl+c را فشار داده و آموزش محلی را لغو کنید.

توجه داشته باشید که اگر می‌خواهید آزمایش‌های بیشتری انجام دهید، می‌توانید ایمیج ساخته شده در بالا را مستقیماً و بدون بسته‌بندی مجدد اجرا کنید.

gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1

۷. یک شغل سفارشی ایجاد کنید

اکنون که حالت محلی را آزمایش کرده‌ایم، از ویژگی بسته‌بندی خودکار برای راه‌اندازی کار آموزشی سفارشی خود در Vertex AI Training استفاده خواهیم کرد. این ویژگی با یک دستور واحد:

  • یک تصویر داکر سفارشی بر اساس کد خود بسازید.
  • تصویر را به رجیستری کانتینر منتقل کنید.
  • یک CustomJob را بر اساس تصویر شروع کنید.

به ترمینال برگردید و یک سطح بالاتر از دایرکتوری autopkg-codelab خود، دستور cd را اجرا کنید.

+ 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 اجرا کنید. ابتدا، این دستور یک تصویر داکر سفارشی بر اساس کد آموزشی می‌سازد. تصویر پایه، کانتینر از پیش ساخته شده Vertex AI Training است که ما آن را به عنوان BASE_GPU_IMAGE تنظیم کرده‌ایم. سپس ویژگی بسته‌بندی خودکار، مجموعه داده‌ها و کتابخانه‌های ترانسفورماتور را همانطور که در فایل requirements.txt ما مشخص شده است، با pip نصب می‌کند.

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 بیندازیم. این آرگومان، پیکربندی worker pool مورد استفاده توسط کار سفارشی را تعریف می‌کند. شما می‌توانید چندین worker pool را مشخص کنید تا یک کار سفارشی با چندین worker pool برای آموزش توزیع‌شده ایجاد کنید. در این مثال، ما فقط یک worker pool واحد را مشخص می‌کنیم، زیرا کد آموزشی ما برای آموزش توزیع‌شده پیکربندی نشده است.

در اینجا برخی از فیلدهای کلیدی این مشخصات آورده شده است:

  • machine-type (الزامی): نوع دستگاه. برای انواع پشتیبانی شده اینجا کلیک کنید .
  • replica-count : تعداد کپی‌های کارگر برای استفاده در این مخزن کارگر، که به طور پیش‌فرض مقدار آن ۱ است.
  • accelerator-type : نوع پردازنده‌های گرافیکی (GPU). برای انواع پشتیبانی‌شده اینجا کلیک کنید . در این مثال، ما یک پردازنده گرافیکی NVIDIA Tesla V100 را مشخص کرده‌ایم.
  • accelerator-count : تعداد پردازنده‌های گرافیکی (GPU) برای استفاده هر ماشین مجازی در worker pool، که به طور پیش‌فرض مقدار آن ۱ است.
  • executor-image-uri : آدرس تصویر کانتینری که بسته ارائه شده را اجرا خواهد کرد. این مقدار روی تصویر پایه ما تنظیم شده است.
  • local-package-path : مسیر محلی پوشه‌ای که شامل کد آموزشی است.
  • python-module : نام ماژول پایتون که قرار است درون بسته‌ی ارائه شده اجرا شود.

مشابه زمانی که دستور محلی را اجرا کردید، خواهید دید که ایمیج داکر ساخته می‌شود و سپس کار آموزشی شروع می‌شود. با این تفاوت که به جای دیدن خروجی کار آموزشی، پیام زیر را مشاهده خواهید کرد که تأیید می‌کند کار آموزشی شما آغاز شده است. توجه داشته باشید که اولین باری که دستور custom-jobs create اجرا می‌کنید، ممکن است چند دقیقه طول بکشد تا ایمیج ساخته و بارگذاری شود.

آموزش_شروع_شده

به بخش Vertex AI Training در کنسول ابری برگردید و در زیر CUSTOM JOBS باید ببینید که Job شما در حال اجرا است.

آموزش_شغل

تکمیل کار حدود 20 دقیقه طول خواهد کشید.

پس از تکمیل، باید مصنوعات مدل ذخیره شده زیر را در دایرکتوری model_output در سطل خود مشاهده کنید.

خروجی مدل

🎉 تبریک می‌گویم! 🎉

شما یاد گرفتید که چگونه از Vertex AI برای موارد زیر استفاده کنید:

  • کد آموزشی را به صورت محلی کانتینرایز و اجرا کنید
  • ارسال کارهای آموزشی به Vertex AI Training با بسته‌بندی خودکار

برای کسب اطلاعات بیشتر در مورد بخش‌های مختلف Vertex AI، مستندات را بررسی کنید.

۸. پاکسازی

از آنجا که نوت‌بوک را طوری پیکربندی کرده‌ایم که پس از ۶۰ دقیقه بیکاری، زمان انقضا داشته باشد، نیازی نیست نگران خاموش کردن نمونه باشیم. اگر می‌خواهید نمونه را به صورت دستی خاموش کنید، روی دکمه Stop در بخش Vertex AI Workbench کنسول کلیک کنید. اگر می‌خواهید نوت‌بوک را به طور کامل حذف کنید، روی دکمه Delete کلیک کنید.

حذف

برای حذف Storage Bucket، با استفاده از منوی ناوبری در Cloud Console خود، به Storage بروید، Bucket خود را انتخاب کنید و روی Delete کلیک کنید:

حذف فضای ذخیره‌سازی