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
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.
שלב 4: יצירת מכונה של Vertex AI Workbench
בקטע Vertex AI במסוף Cloud, לוחצים על Workbench:
מפעילים את Notebooks API, אם עדיין לא פועלים.
אחרי ההפעלה, לוחצים על מנהלי מחברות:
לאחר מכן בוחרים באפשרות מחברות חדשה.
נותנים שם למחברת, ובקטע Permission בוחרים באפשרות Service account.
בוחרים באפשרות הגדרות מתקדמות.
בקטע אבטחה, בוחרים באפשרות 'הפעלת מסוף' אם היא עדיין לא מופעלת.
אפשר להשאיר את כל שאר ההגדרות המתקדמות כפי שהן.
לאחר מכן, לוחצים על יצירה. הקצאה של המכונה תימשך כמה דקות.
אחרי שיוצרים את המכונה, בוחרים באפשרות Open JUPYTERLAB.
4. יצירת קונטיינרים של קוד אפליקציה לאימון
כדי לשלוח את משימת האימון הזו ל-Vertex AI, תצטרכו להעביר את קוד האפליקציה של האימון לקונטיינר Docker ולדחוף את הקונטיינר הזה ל-Google Artifact Registry. בעזרת הגישה הזו, אפשר לאמן מודל שנוצר בכל מסגרת.
כדי להתחיל, פותחים חלון Terminal במכונה של המחברת בתפריט Launcher:
שלב 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: מגדירים את משימה האימון
לוחצים על יצירה כדי להזין את הפרמטרים למשימת האימון.
- בקטע מערך נתונים, בוחרים באפשרות ללא מערך נתונים מנוהל.
- לאחר מכן בוחרים באפשרות אימון מותאם אישית (מתקדם) כשיטת האימון ולוחצים על המשך.
- בוחרים באפשרות אימון מודל חדש ומזינים
flowers-model
(או כל שם אחר שרוצים לתת למודל) בשדה שם המודל. - לוחצים על המשך.
בשלב 'הגדרות מאגר התגים', בוחרים באפשרות מאגר תגים בהתאמה אישית:
בתיבה הראשונה (תמונה של קונטיינר), מזינים את הערך של המשתנה IMAGE_URI
מהקטע הקודם. הערך צריך להיות: us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest
, עם מזהה הפרויקט שלכם. משאירים את שאר השדות ריקים ולוחצים על המשך.
כדי לדלג על השלב Hyperparameters, לוחצים שוב על Continue.
שלב 2: מגדירים את אשכול המחשוב
מגדירים את 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 דרך מרכז האפליקציות:
מייבאים את 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 (אחסון), בוחרים את הקטגוריה ולוחצים על סמל המחיקה: