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

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

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

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

.

מה לומדים

נסביר לכם איך:

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

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

2. מבוא ל-Vertex AI

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

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

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

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

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

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

עוברים אל 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

נותנים שם ל-notebook, ובקטע הרשאה בוחרים באפשרות חשבון שירות.

create_notebook

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

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

enable_terminal

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

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

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

open_jupyterlab

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

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

כדי להתחיל, פותחים חלון Terminal במכונה של ה-notebook מתפריט מרכז האפליקציות:

פתיחת הטרמינל ב-notebook

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

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

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

PROJECT_ID='your-cloud-project'

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

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: יוצרים קובץ Docker

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

ב-Terminal, יוצרים קובץ Docker ריק בספריית הפרחים:

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 מציינת את תמונת הבסיס, שהיא תמונת ההורה שעליה תיווצר התמונה שתיצרו. בתור תמונת הבסיס, נשתמש בתמונת Docker של TensorFlow Enterprise 2.8 GPU ל-Deep Learning Container. בקונטיינרים של למידה עמוקה (Deep Learning) ב-Google Cloud מותקנים מראש הרבה מסגרות נפוצות של למידת מכונה ומדעי נתונים.

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

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

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

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

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

שלב 4: יוצרים את המאגר

בטרמינל של ה-notebook ב-Workbench, מריצים את הפקודה הבאה כדי להגדיר משתנה env לפרויקט ומקפידים להחליף את 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

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

docker build ./ -t $IMAGE_URI

לסיום, מעבירים אותו בדחיפה ל-Artifact Registry:

docker push $IMAGE_URI

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

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

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

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

תפריט הרכבת

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

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

create_training

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

בשלב Container settings (הגדרות מאגר תגים), בוחרים באפשרות CustomContainer (מאגר מותאם אישית):

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

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

מדלגים על השלב של היפר-פרמטרים בלחיצה שוב על המשך.

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

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

worker_pool_0

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

לוחצים על התחלת ההדרכה כדי להתחיל את משימת האימון. בקטע 'אימון' במסוף, בכרטיסייה 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.

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

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

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

עצירת המופע

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

מחיקת האחסון