אב טיפוס לייצור: אימון מודלים מותאמים אישית באמצעות Vertex AI

1. סקירה כללית

בשיעור ה-Lab הזה נשתמש ב-Vertex AI כדי להריץ משימת אימון בהתאמה אישית.

שיעור ה-Lab הזה הוא חלק מסדרת הסרטונים מאב טיפוס לייצור. תלמדו ליצור מודל לסיווג תמונות באמצעות מערך הנתונים Flowers. אפשר לצפות בסרטון המצורף כדי לקבל מידע נוסף:

.

מה תלמדו

תלמדו איך:

  • יצירת notebook מנוהל ב-Vertex AI Workbench
  • הגדרה והפעלה של משימת אימון בהתאמה אישית דרך ממשק המשתמש של Vertex AI
  • הגדרה והפעלה של משימת אימון בהתאמה אישית באמצעות Vertex AI Python SDK

העלות הכוללת של הפעלת שיעור ה-Lab הזה ב-Google Cloud היא כ-$1.

2. מבוא ל-Vertex AI

במעבדה הזו נעשה שימוש במוצרי ה-AI החדשים ביותר שזמינים ב-Google Cloud. Vertex AI משלב את הצעות למידת המכונה ב-Google Cloud ליצירת חוויית פיתוח חלקה. בעבר, ניתן היה לגשת למודלים שעברו אימון באמצעות AutoML ומודלים בהתאמה אישית דרך שירותים נפרדים. המוצר החדש משלב את שניהם ב-API אחד, יחד עם מוצרים חדשים אחרים. אפשר גם להעביר פרויקטים קיימים ל-Vertex AI.

Vertex AI כולל הרבה מוצרים שונים לתמיכה בתהליכי עבודה של למידת מכונה מקצה לקצה. בשיעור ה-Lab הזה נתמקד במוצרים הבאים: Training ו-Workbench

סקירה כללית על מוצרי Vertex

3. הגדרת הסביבה

כדי להריץ את הקודלה הזה, צריך פרויקט ב-Google Cloud Platform שבו החיוב מופעל. כדי ליצור פרויקט, יש לפעול לפי ההוראות האלה.

שלב 1: מפעילים את Compute Engine API

עוברים אל Compute Engine ובוחרים באפשרות Enable (הפעלה) אם היא עדיין לא מופעלת.

שלב 2: מפעילים את ה-Artifact Registry API

עוברים אל Artifact Registry ובוחרים באפשרות Enable (הפעלה) אם היא עדיין לא מסומנת. אפשר להשתמש בו כדי ליצור מאגר למשימת האימון המותאמת אישית.

שלב 3: מפעילים את Vertex AI API

עוברים לקטע Vertex AI במסוף Cloud ולוחצים על Enable Vertex AI API.

מרכז הבקרה של Vertex AI

שלב 4: יצירת מכונה של Vertex AI Workbench

בקטע Vertex AI במסוף Cloud, לוחצים על Workbench:

התפריט של Vertex AI

מפעילים את Notebooks API, אם עדיין לא פועלים.

Notebook_api

אחרי ההפעלה, לוחצים על מנהלי מחברות:

Notebooks_UI

לאחר מכן בוחרים באפשרות מחברות חדשה.

new_notebook

נותנים שם למחברת, ובקטע Permission בוחרים באפשרות Service account.

create_notebook

בוחרים באפשרות הגדרות מתקדמות.

בקטע אבטחה, בוחרים באפשרות 'הפעלת מסוף' אם היא עדיין לא מופעלת.

enable_terminal

אפשר להשאיר את כל שאר ההגדרות המתקדמות כפי שהן.

לאחר מכן, לוחצים על יצירה. הקצאה של המכונה תימשך כמה דקות.

אחרי שיוצרים את המכונה, בוחרים באפשרות Open JUPYTERLAB.

open_jupyterlab

4. יצירת קונטיינרים של קוד אפליקציה לאימון

כדי לשלוח את משימת האימון הזו ל-Vertex AI, תצטרכו להעביר את קוד האפליקציה של האימון לקונטיינר Docker ולדחוף את הקונטיינר הזה ל-Google Artifact Registry. בעזרת הגישה הזו, אפשר לאמן מודל שנוצר בכל מסגרת.

כדי להתחיל, פותחים חלון Terminal במכונה של המחברת בתפריט Launcher:

פתיחת מסוף ב-notebook

שלב 1: יצירת קטגוריה של Cloud Storage

במשימת האימון הזו תייצאו את מודל TensorFlow המאומן לקטגוריה של Cloud Storage. בנוסף, תצטרכו לאחסן את הנתונים לצורך אימון בקטגוריה של Cloud Storage.

ב-Terminal, מריצים את הפקודה הבאה כדי להגדיר משתנה סביבה לפרויקט. חשוב להחליף את your-cloud-project במזהה הפרויקט:

PROJECT_ID='your-cloud-project'

לאחר מכן, מריצים את הפקודה הבאה ב-Terminal כדי ליצור קטגוריה חדשה בפרויקט.

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

שלב 2: מעתיקים את הנתונים לקטגוריה ב-Cloud Storage

אנחנו צריכים להעביר את מערך הנתונים של הפרחים ל-Cloud Storage. למטרות הדגמה, קודם מורידים את מערך הנתונים למכונה הזו של Workbench, ואז מעתיקים אותו לקטגוריה.

הורדת הנתונים והסרת הנתונים.

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

לאחר מכן מעתיקים אותו לקטגוריה שיצרתם. מוסיפים את האפשרות -r כי אנחנו רוצים להעתיק את כל הספרייה, ואת האפשרות -m כדי לבצע העתקה עם עיבוד מרובה, כדי לזרז את התהליך.

gsutil -m cp -r flower_photos $BUCKET

שלב 3: כותבים קוד אימון

יוצרים ספרייה חדשה בשם flowers ונכנסים אליה באמצעות cd:

mkdir flowers
cd flowers

מריצים את הפקודות הבאות כדי ליצור ספרייה לקוד האימון וקובץ Python שבו תוסיפו את הקוד.

mkdir trainer
touch trainer/task.py

עכשיו אמורים להיות בספרייה flowers/ הפריטים הבאים:

+ trainer/
    + task.py

במסמכי העזרה מוסבר בהרחבה איך לבנות את הקוד של אפליקציית האימון.

לאחר מכן, פותחים את הקובץ task.py שיצרתם ומעתיקים את הקוד שבהמשך.

צריך להחליף את {your-gcs-bucket} בשם של הקטגוריה של Cloud Storage שיצרת עכשיו.

באמצעות הכלי Cloud Storage FUSE, משימות אימון באימון Vertex AI יכולות לגשת לנתונים ב-Cloud Storage כקבצים במערכת הקבצים המקומית. כשמתחילים משימה של אימון בהתאמה אישית, היא רואה ספרייה /gcs שמכילה את כל הקטגוריות של Cloud Storage בתור ספריות משנה. לכן נתיבי הנתונים בקוד האימון מתחילים ב-/gcs.

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''
  
  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

שלב 4: יצירת קובץ Dockerfile

כדי לארוז את הקוד בקונטיינרים, צריך ליצור קובץ Dockerfile. בקובץ Dockerfile תכללו את כל הפקודות הנדרשות להרצת קובץ האימג'. הוא יתקין את כל הספריות הנדרשות ותגדיר את נקודת הכניסה לקוד האימון.

ב-Terminal, יוצרים קובץ Dockerfile ריק ברמה הבסיסית (root) של ספריית flowers:

touch Dockerfile

עכשיו אמורים להיות בספרייה flowers/ הפריטים הבאים:

+ Dockerfile
+ trainer/
    + task.py

פותחים את קובץ ה-Docker ומעתיקים אליו את הפקודה הבאה:

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]

נבדוק את הפקודות בקובץ הזה.

הפקודה FROM מציינת את קובץ האימג' הבסיסי, שהוא קובץ האימג' ההורה שעליו יתבצע ה-build של קובץ האימג' שיצרתם. כתמונת הבסיס, תשתמשו בקובץ אימג' של Docker ב-Deep Learning Container TensorFlow Enterprise 2.8 GPU. הקונטיינרים של Deep Learning ב-Google Cloud מגיעים עם הרבה frameworks נפוצים של מדעי נתונים ולמידת מכונה שהותקנו מראש.

הפקודה WORKDIR מציינת את הספרייה בקובץ האימג' שבה מריצים את ההוראות הבאות.

הפקודה COPY מעתיקה את קוד ה-trainer לתמונת Docker. שימו לב שבדוגמה הזו יש לנו רק קובץ python אחד בספריית המדריכים שלנו, אבל לדוגמה מציאותית יותר, סביר להניח שיהיו לכם קבצים נוספים. אולי אחת בשם data.py שמטפלת בעיבוד מראש של נתונים, ואחת בשם model.py, שכוללת רק את קוד המודל וכו'. לקבלת קוד אימון מורכב יותר, אפשר לעיין במסמכי Python בנושא הכנת פרויקטים של Python.

אם רוצים להוסיף ספריות נוספות, אפשר להשתמש בפקודה RUN כדי לבצע התקנה באמצעות pip (למשל: RUN pip install -r requirements.txt). אבל לא נצטרך שום דבר נוסף בדוגמה שלנו כאן.

לבסוף, הפקודה ENTRYPOINT מגדירה את נקודת הכניסה להפעלת מאמן ה-ML. זה מה שנריץ כשנתחיל את משימת האימון שלנו. במקרה שלנו, הפעלת הקובץ task.py.

כאן מפורט מידע נוסף על כתיבת קובצי Docker ל-Vertex AI Training.

שלב 4: יצירת הקונטיינר

במסוף של המחברות של Workbench, מריצים את הפקודה הבאה כדי להגדיר משתנה סביבה לפרויקט. חשוב להחליף את your-cloud-project במזהה הפרויקט:

PROJECT_ID='your-cloud-project'

יצירת מאגר ב-Artifact Registry

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

מגדירים משתנה עם ה-URI של קובץ האימג' בקונטיינר ב-Google Artifact Registry:

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

הגדרת Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

לאחר מכן, כדי ליצור את הקונטיינר, מריצים את הפקודה הבאה מהשורש של ספריית flower:

docker build ./ -t $IMAGE_URI

ולבסוף, מעבירים אותו ל-Artifact Registry:

docker push $IMAGE_URI

הקונטיינר הועבר ל-Artifact Registry ועכשיו אפשר להתחיל את משימת האימון.

5. הרצת משימה אימון בהתאמה אישית ב-Vertex AI

בסדנת העבודה הזו נעשה שימוש באימון בהתאמה אישית באמצעות קונטיינר בהתאמה אישית ב-Google Artifact Registry, אבל אפשר גם להריץ משימת אימון באמצעות קונטיינרים מוכנים מראש.

כדי להתחיל, עוברים לקטע Training בקטע Vertex במסוף Cloud:

תפריט הרכבת

שלב 1: מגדירים את משימה האימון

לוחצים על יצירה כדי להזין את הפרמטרים למשימת האימון.

create_training

  • בקטע מערך נתונים, בוחרים באפשרות ללא מערך נתונים מנוהל.
  • לאחר מכן בוחרים באפשרות אימון מותאם אישית (מתקדם) כשיטת האימון ולוחצים על המשך.
  • בוחרים באפשרות אימון מודל חדש ומזינים flowers-model (או כל שם אחר שרוצים לתת למודל) בשדה שם המודל.
  • לוחצים על המשך.

בשלב 'הגדרות מאגר התגים', בוחרים באפשרות מאגר תגים בהתאמה אישית:

אפשרות של מאגר בהתאמה אישית

בתיבה הראשונה (תמונה של קונטיינר), מזינים את הערך של המשתנה IMAGE_URI מהקטע הקודם. הערך צריך להיות: us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest, עם מזהה הפרויקט שלכם. משאירים את שאר השדות ריקים ולוחצים על המשך.

כדי לדלג על השלב Hyperparameters, לוחצים שוב על Continue.

שלב 2: מגדירים את אשכול המחשוב

מגדירים את Worker pool 0 באופן הבא:

worker_pool_0

בינתיים תדלגו על שלב 6 ותגדירו את מאגר החיזוי בשיעור ה-Lab הבא בסדרה.

לוחצים על START TRAINING (התחלת האימון) כדי להתחיל את משימת האימון. בקטע Training במסוף, בכרטיסייה TRAINING PIPELINES, תוכלו לראות את המשימה החדשה שהפעלתם:

משרות הדרכה

🎉 מזל טוב! 🎉

למדתם איך להשתמש ב-Vertex AI כדי:

  • הפעלת משימת אימון בהתאמה אישית לקוד אימון שסופק בקונטיינר בהתאמה אישית. השתמשתם במודל TensorFlow בדוגמה הזו, אבל אפשר לאמן מודל שנוצר עם כל מסגרת באמצעות קונטיינרים מובנים או מותאמים אישית.

מידע נוסף על החלקים השונים של Vertex זמין במסמכי העזרה.

6. [אופציונלי] שימוש ב-Vertex AI Python SDK

בקטע הקודם הוסבר איך להפעיל את משימת האימון דרך ממשק המשתמש. בקטע הזה נסביר על דרך חלופית לשליחת משימת האימון באמצעות Vertex AI Python SDK.

חוזרים למכונה של ה-notebook ויוצרים מסמך notebook של TensorFlow 2 דרך מרכז האפליקציות:

new_notebook

מייבאים את Vertex AI SDK.

from google.cloud import aiplatform

לאחר מכן יוצרים CustomContainerTrainingJob. צריך להחליף את {PROJECT_ID} ב-container_uri בשם הפרויקט, ואת {BUCKET} ב-staging_bucket בקטגוריה שיצרתם מקודם.

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

לאחר מכן, מריצים את המשימה.

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

למטרות הדגמה, הגדרנו שהמשימה הזו תרוץ במכונה גדולה יותר בהשוואה לקטע הקודם. בנוסף, אנחנו מריצים עם GPU. אם לא מציינים את machine-type, accelerator_type או accelerator_count, המשימה תרוץ כברירת מחדל ב-n1-standard-4.

המשימה שלכם להדרכה תופיע בקטע Training (אימון) במסוף, בכרטיסייה CUSTOM JOBS (משימות בהתאמה אישית).

7. הסרת המשאבים

ב-Vertex AI Workbench יש תכונת כיבוי במצב חוסר פעילות למסמכי notebook מנוהלים, כך שאין צורך לדאוג לגבי כיבוי המכונה. כדי לכבות את המכונה באופן ידני, לוחצים על הלחצן Stop בקטע Vertex AI Workbench במסוף. כדי למחוק את המחברות כולה, לוחצים על הלחצן 'מחיקה'.

הפסקת המכונה

כדי למחוק את קטגוריית האחסון, באמצעות תפריט הניווט במסוף Cloud, עוברים אל Storage (אחסון), בוחרים את הקטגוריה ולוחצים על סמל המחיקה:

מחיקת אחסון