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

1. بررسی اجمالی

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

چیزی که یاد می گیرید

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

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

2. از Case Overview استفاده کنید

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

3. مقدمه ای بر Vertex AI

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

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

نمای کلی محصول Vertex

4. محیط خود را تنظیم کنید

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

مرحله 1: Compute Engine API را فعال کنید

به Compute Engine بروید و اگر قبلاً فعال نشده است Enable را انتخاب کنید.

مرحله ۲: Vertex AI API را فعال کنید

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

داشبورد Vertex AI

مرحله 3: Container Registry API را فعال کنید

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

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

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

منوی Vertex AI

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

Notebooks_UI

سپس NEW NOTEBOOK را انتخاب کنید.

نوت بوک

نوت بوک خود را نامی بگذارید و سپس روی تنظیمات پیشرفته کلیک کنید.

create_notebook

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

idle_timeout

شما می توانید تمام تنظیمات پیشرفته دیگر را به همین صورت رها کنید.

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

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

open_jupyterlab

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

احراز هویت

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

برای شروع، از منوی 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 را برای این طبقه بندی کننده مشخص می کنیم.

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

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

در کار آموزشی خود، مدل آموزش دیده خود را به یک سطل ذخیره سازی ابری صادر می کنیم. از ترمینال خود، موارد زیر را اجرا کنید تا یک متغیر env برای پروژه خود تعریف کنید و مطمئن شوید که your-cloud-project با ID پروژه خود جایگزین کنید:

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 یک تصویر 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

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

محلی_آموزش

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

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

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

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

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

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

آموزش_شغل

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

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

مدل_خروجی

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

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

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

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

8. پاکسازی

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

حذف کنید

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

ذخیره سازی را حذف کنید