1. סקירה כללית
בשיעור ה-Lab הזה תשתמשו ב-Vertex AI כדי להריץ משימת אימון בהתאמה אישית.
שיעור ה-Lab הזה הוא חלק מסדרת הסרטונים Prototype to Production. תבנו מודל לסיווג תמונות באמצעות מערך נתוני הפרחים. אפשר לצפות בסרטון הבא כדי לקבל מידע נוסף:
.
מה לומדים
במאמר הזה נסביר איך:
- יצירת notebook מנוהל ב-Vertex AI Workbench
- הגדרה והפעלה של משימת אימון מותאמת אישית מממשק המשתמש של Vertex AI
- הגדרת משימת אימון מותאמת אישית והפעלתה באמצעות Vertex AI Python SDK
העלות הכוללת להרצת ה-Lab הזה ב-Google Cloud היא בערך 1$.
2. מבוא ל-Vertex AI
בשיעור ה-Lab הזה נעשה שימוש במוצר ה-AI החדש ביותר שזמין ב-Google Cloud. Vertex AI משלב את מוצרי ה-ML ב-Google Cloud לחוויית פיתוח חלקה. בעבר, היה אפשר לגשת למודלים שאומנו באמצעות AutoML ולמודלים בהתאמה אישית דרך שירותים נפרדים. המוצר החדש משלב את שניהם ב-API אחד, יחד עם מוצרים חדשים אחרים. אפשר גם להעביר פרויקטים קיימים אל Vertex AI.
Vertex AI כולל מוצרים רבים ושונים לתמיכה בתהליכי עבודה של למידת מכונה מקצה לקצה. בשיעור ה-Lab הזה נתמקד במוצרים שמודגשים בהמשך: Training ו-Workbench

3. הגדרת הסביבה
כדי להפעיל את ה-codelab הזה, צריך פרויקט ב-Google Cloud Platform שמופעל בו חיוב. כדי ליצור פרויקט, פועלים לפי ההוראות האלה.
שלב 1: הפעלת Compute Engine API
עוברים אל Compute Engine ובוחרים באפשרות הפעלה אם הוא עדיין לא מופעל.
שלב 2: הפעלת Artifact Registry API
עוברים אל Artifact Registry ובוחרים באפשרות Enable (הפעלה) אם היא עדיין לא מסומנת. תשתמשו בזה כדי ליצור קונטיינר למשימת האימון המותאמת אישית.
שלב 3: הפעלת Vertex AI API
עוברים אל הקטע Vertex AI במסוף Cloud ולוחצים על הפעלת Vertex AI API.

שלב 4: יצירת מכונה של Vertex AI Workbench
בקטע Vertex AI במסוף Cloud, לוחצים על Workbench:

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

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

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

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

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

אפשר להשאיר את כל ההגדרות המתקדמות האחרות כמו שהן.
אחרי כן, לוחצים על יצירה. ייקח כמה דקות עד שהמופע יוקצה.
אחרי שיוצרים את המופע, בוחרים באפשרות OPEN JUPYTERLAB (פתיחת JupyterLab).

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

שלב 1: יצירת קטגוריה של Cloud Storage
במשימת האימון הזו תייצאו את מודל TensorFlow שאומן לקטגוריה של Cloud Storage. בנוסף, תאחסנו את הנתונים לאימון בקטגוריה של Cloud Storage.
בטרמינל, מריצים את הפקודה הבאה כדי להגדיר משתנה סביבה לפרויקט. חשוב להחליף את 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 Training יכולות לגשת לנתונים ב-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, צריך לכלול את כל הפקודות שנדרשות להרצת האימג'. הסקריפט יתקין את כל הספריות הנדרשות ויגדיר את נקודת הכניסה לקוד האימון.
בטרמינל, יוצרים קובץ Dockerfile ריק בספריית הבסיס של הספרייה flowers:
touch Dockerfile
עכשיו אמורים להיות לכם הקבצים הבאים בספרייה flowers/:
+ Dockerfile
+ trainer/
+ task.py
פותחים את Dockerfile ומעתיקים לתוכו את הקוד הבא:
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 עם GPU של TensorFlow Enterprise 2.8 של Deep Learning Container. הקונטיינרים של Deep Learning ב-Google Cloud מגיעים עם הרבה frameworks נפוצים של ML ומדעי נתונים שהותקנו מראש.
הפקודה WORKDIR מציינת את הספרייה באימג' שבה יופעלו ההוראות הבאות.
הפקודה COPY מעתיקה את קוד ההדרכה לקובץ אימג' של Docker. שימו לב שבמקרה הזה יש לנו רק קובץ Python אחד בספריית האימון, אבל בדוגמה יותר מציאותית סביר להניח שיהיו קבצים נוספים. אולי אחד בשם data.py, שמטפל בעיבוד מקדים של הנתונים, ואחד בשם model.py, שכולל רק את קוד המודל וכו'. לקבלת מידע על קוד אימון מורכב יותר, אפשר לעיין במסמכי Python בנושא אריזת פרויקטים של Python.
אם רוצים להוסיף עוד ספריות, אפשר להשתמש בפקודה RUN כדי להתקין pip (לדוגמה: RUN pip install -r requirements.txt). אבל בדוגמה הזו לא צריך להוסיף עוד ספריות.
לבסוף, הפקודה ENTRYPOINT מגדירה את נקודת הכניסה להפעלת המאמן. זה מה שיפעל כשנתחיל את משימת האימון. במקרה שלנו, זהו קובץ task.py.
כאן אפשר לקרוא מידע נוסף על כתיבת קובצי Dockerfile ל-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
לאחר מכן, בונים את הקונטיינר על ידי הרצת הפקודה הבאה מהרמה הבסיסית (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: הגדרת משימת אימון
לוחצים על יצירה כדי להזין את הפרמטרים של משימת האימון.

- בקטע מערך נתונים, בוחרים באפשרות אין מערך נתונים מנוהל.
- לאחר מכן בוחרים באפשרות Custom training (advanced) (אימון בהתאמה אישית (מתקדם)) בתור שיטת האימון ולוחצים על Continue (המשך).
- בוחרים באפשרות Train new model (אימון מודל חדש) ומזינים את
flowers-model(או כל שם אחר שרוצים לתת למודל) בשדה Model name (שם המודל). - לוחצים על המשך.
בשלב Container settings (הגדרות מאגר התגים), בוחרים באפשרות Custom container (מאגר תגים בהתאמה אישית):

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

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

🎉 איזה כיף! 🎉
למדתם איך להשתמש ב-Vertex AI כדי:
- הפעלת משימת אימון מותאמת אישית לאימון קוד שסופק בקונטיינר מותאם אישית. בדוגמה הזו השתמשתם במודל TensorFlow, אבל אתם יכולים לאמן מודל שנבנה עם כל מסגרת באמצעות קונטיינרים מובנים או קונטיינרים בהתאמה אישית.
מידע נוסף על חלקים שונים ב-Vertex זמין בתיעוד.
6. [אופציונלי] שימוש ב-Vertex AI Python SDK
בקטע הקודם הראינו איך להפעיל את עבודת האימון דרך ממשק המשתמש. בקטע הזה מוצגת דרך חלופית לשליחת משימת האימון באמצעות Vertex AI Python SDK.
חוזרים למופע של מחברת Jupyter ויוצרים מחברת TensorFlow 2 מ-Launcher:

מייבאים את 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. הסרת המשאבים
ב-notebooks מנוהלים של Vertex AI Workbench יש תכונה של השבתה במצב בלי פעילות, ולכן לא צריך לדאוג להשבתת המופע. אם רוצים להשבית את המופע באופן ידני, לוחצים על הלחצן Stop (הפסקה) בקטע Vertex AI Workbench במסוף. כדי למחוק את ה-Notebook לגמרי, לוחצים על לחצן המחיקה.

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