הרצת אימון מודלים מותאמים אישית ב-Vertex Pipelines

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

בשיעור ה-Lab הזה תלמדו איך להריץ משימה מותאמת אישית לאימון מודל באמצעות Kubeflow Pipelines SDK ב-Vertex Pipelines.

מה תלמדו

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

  • שימוש ב-Kubeflow Pipelines SDK כדי לפתח צינורות עיבוד נתונים ניתנים להרחבה של למידת מכונה
  • יצירת משימת אימון מותאמת אישית של מודל Scikit-learn בקונטיינר, שמשתמשת במערכי נתונים מנוהלים של Vertex AI ותופעל ב-Vertex AI Training בתוך צינור עיבוד נתונים
  • הרצת משימת חיזוי באצווה בתוך Vertex Pipelines
  • להשתמש ברכיבים מוכנים מראש לאינטראקציה עם שירותי Vertex AI, שמסופקים דרך הספרייה google_cloud_pipeline_components

העלות הכוללת להרצת הסדנה הזו ב-Google Cloud היא כ-‎$5.

2. מבוא ל-Vertex AI

במעבדה הזו נעשה שימוש ב-Vertex AI, הפלטפורמה המנוהלת שלנו ל-ML מקצה לקצה ב-Google Cloud. Vertex AI משלב את חבילות השירות של Google ללמידת מכונה ב-Google Cloud לחוויית פיתוח חלקה. בנוסף לשירותי אימון מודלים ופריסה שלהם, Vertex AI כולל גם מגוון מוצרים של MLOps, כולל Vertex Pipelines (המרכז של סדנת ה-Lab הזו), Model Monitoring,‏ Feature Store ועוד. כל מוצרי Vertex AI מפורטים בתרשים הבא.

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

יש לך משוב? אפשר להיכנס לדף התמיכה.

למה צינורות עיבוד נתונים של למידת מכונה שימושיים?

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

The tl;dr: צינורות עיבוד נתונים עוזרים לפשט ולשחזר את תהליכי העבודה שלכם ללמידת מכונה.

3. הגדרה של סביבת הענן

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

שלב 1: הפעלת Cloud Shell

בשיעור ה-Lab הזה תלמדו איך לעבוד בסשן של Cloud Shell, שהוא מתורגם פקודות שמתארח במכונה וירטואלית שפועלת בענן של Google. אפשר להריץ את הקטע הזה בקלות גם באופן מקומי במחשב שלכם, אבל השימוש ב-Cloud Shell מאפשר לכל אחד לגשת לחוויה שניתן לשחזור בסביבה עקבית. בסיום הסדנה, תוכלו לנסות שוב את הקטע הזה במחשב שלכם.

מתן הרשאה ל-Cloud Shell

הפעלת Cloud Shell

בצד שמאל למעלה ב-Cloud Console, לוחצים על הלחצן שלמטה כדי Activate Cloud Shell (הפעלה של Cloud Shell):

הפעלת Cloud Shell

אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (מתחת לקצה המסך) עם תיאור של Cloud Shell. במקרה כזה, לוחצים על Continue (והמסך הזה לא יוצג לכם שוב). כך נראה המסך החד-פעמי:

הגדרת Cloud Shell

ההקצאה וההתחברות ל-Cloud Shell נמשכת כמה דקות.

Cloud Shell init

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים לפיתוח. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, משפרת מאוד את הביצועים והאימות של הרשת. אפשר לבצע חלק גדול מהעבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או Chromebook.

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

מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהאימות בוצע:

gcloud auth list

אתם אמורים לראות משהו כזה בפלט הפקודה:

הפלט של Cloud Shell

מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה ב-gcloud יודעת על הפרויקט שלכם:

gcloud config list project

פלט הפקודה

[core]
project = <PROJECT_ID>

אם לא, אפשר להגדיר אותו באמצעות הפקודה הבאה:

gcloud config set project <PROJECT_ID>

פלט הפקודה

Updated property [core/project].

ל-Cloud Shell יש כמה משתני סביבה, כולל GOOGLE_CLOUD_PROJECT שמכיל את השם של הפרויקט הנוכחי ב-Cloud. נשתמש בו במקומות שונים במהלך שיעור ה-Lab. אפשר לראות אותו על ידי הפעלת הפקודה:

echo $GOOGLE_CLOUD_PROJECT

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

בשלבים הבאים נסביר איפה נדרשים השירותים האלה (ולמה), אבל בינתיים מריצים את הפקודה הבאה כדי לתת לפרויקט גישה לשירותים Compute Engine,‏ Container Registry ו-Vertex AI:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

אמורה ליצור מסר מוצלח שדומה להודעה הזו:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

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

כדי להריץ משימה של אימון ב-Vertex AI, נצטרך קטגוריית אחסון לאחסון נכסי המודלים השמורים שלנו. הקטגוריה צריכה להיות אזורית. אנחנו משתמשים כאן ב-us-central, אבל אתם יכולים להשתמש באזור אחר (פשוט מחליפים אותו בכל שיעור ה-Lab). אם כבר יש לכם קטגוריה, אתם יכולים לדלג על השלב הזה.

כדי ליצור קטגוריה, מריצים את הפקודות הבאות בטרמינל של Cloud Shell:

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

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

gcloud projects describe $GOOGLE_CLOUD_PROJECT > project-info.txt
PROJECT_NUM=$(cat project-info.txt | sed -nre 's:.*projectNumber\: (.*):\1:p')
SVC_ACCOUNT="${PROJECT_NUM//\'/}-compute@developer.gserviceaccount.com"
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member serviceAccount:$SVC_ACCOUNT --role roles/storage.objectAdmin

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

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

התפריט של Vertex AI

לאחר מכן, בקטע Notebooks בניהול המשתמשים, לוחצים על New Notebook:

יצירת notebook חדש

לאחר מכן בוחרים בסוג המכונה TensorFlow Enterprise 2.3 (with LTS) without GPUs:

מכונה של TFE

משתמשים באפשרויות ברירת המחדל ולוחצים על Create.

שלב 5: פותחים את ה-Notebook

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

פתיחת Notebook

4. הגדרת Vertex Pipelines

יש כמה ספריות נוספות שנצטרך להתקין כדי להשתמש ב-Vertex Pipelines:

  • Kubeflow Pipelines: זהו ה-SDK שבו נשתמש כדי ליצור את צינור עיבוד הנתונים. ב-Vertex Pipelines יש תמיכה בצינורות עיבוד נתונים שפועלים ב-Kubeflow Pipelines וגם ב-TFX.
  • רכיבי צינור עיבוד נתונים של Google Cloud: הספרייה הזו מספקת רכיבים מוכנים מראש שמאפשרים לבצע אינטראקציה בקלות עם שירותי Vertex AI מהשלבים בצינור עיבוד הנתונים.

שלב 1: יצירת notebook ב-Python והתקנת ספריות

קודם כול, בתפריט Launcher במכונה של Notebook (אפשר לגשת אליו בלחיצה על סמל הפלוס + בפינה הימנית העליונה של Notebook), יוצרים פנקס הערות על ידי בחירה באפשרות Python 3:

יצירת notebook ב-Python3

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

כדי להתקין את שני השירותים שבהם נשתמש בשיעור ה-Lab הזה, קודם צריך להגדיר את דגל המשתמש בתא ב-notebook:

USER_FLAG = "--user"

לאחר מכן מריצים את הפקודה הבאה מה-notebook:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0 --upgrade
!pip3 install {USER_FLAG} kfp==1.8.9 google-cloud-pipeline-components==0.2.0

אחרי התקנת החבילות האלה, צריך להפעיל מחדש את הליבה:

import os

if not os.getenv("IS_TESTING"):
    # Automatically restart kernel after installs
    import IPython

    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)

לבסוף, בודקים שהתקנתם את החבילות בצורה נכונה. גרסת ה-SDK של KFP צריכה להיות 1.8 ומעלה:

!python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"
!python3 -c "import google_cloud_pipeline_components; print('google_cloud_pipeline_components version: {}'.format(google_cloud_pipeline_components.__version__))"

שלב 2: מגדירים את מזהה הפרויקט ואת הקטגוריה

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

אם אתם לא יודעים מהו מזהה הפרויקט, יכול להיות שתוכלו לקבל אותו על ידי הפעלת הפקודה הבאה:

import os
PROJECT_ID = ""

# Get your Google Cloud project ID from gcloud
if not os.getenv("IS_TESTING"):
    shell_output=!gcloud config list --format 'value(core.project)' 2>/dev/null
    PROJECT_ID = shell_output[0]
    print("Project ID: ", PROJECT_ID)

אחרת, מגדירים אותו כאן:

if PROJECT_ID == "" or PROJECT_ID is None:
    PROJECT_ID = "your-project-id"  # @param {type:"string"}

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

BUCKET_NAME="gs://" + PROJECT_ID + "-bucket"

שלב 3: ייבוא ספריות

מוסיפים את הקוד הבא כדי לייבא את הספריות שבהן נשתמש במהלך הקודלאב:

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline

from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

שלב 4: מגדירים קבועים

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

PATH=%env PATH
%env PATH={PATH}:/home/jupyter/.local/bin
REGION="us-central1"

PIPELINE_ROOT = f"{BUCKET_NAME}/pipeline_root/"
PIPELINE_ROOT

אחרי הרצת הקוד שלמעלה, ספריית השורש של צינור עיבוד הנתונים אמורה להדפיס. זהו המיקום ב-Cloud Storage שאליו ייכתבו הארטיפקטים מצינור עיבוד הנתונים. הוא יהיה בפורמט gs://YOUR-BUCKET-NAME/pipeline_root/

5. הגדרת משימה של אימון מודל בהתאמה אישית

לפני שמגדירים את צינור עיבוד הנתונים, צריך לכתוב את הקוד של המשימה לאימון המודל בהתאמה אישית. כדי לאמן את המודל, נשתמש במערך הנתונים של למידת מכונה יבש ב-UCI, מהסוגים הבאים: KOKLU, M ו-OZKAN, I.A., (2020), "Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques",‏ Computers and Electronics in Agriculture, 174, 105507. DOI

בשלב הראשון בצינור עיבוד הנתונים ניצור מערך נתונים מנוהל ב-Vertex AI באמצעות טבלת BigQuery שמכילה גרסה של נתוני ה-beans האלה. מערך הנתונים יועבר כקלט למשימה האימון שלנו. בקוד האימון שלנו תהיה גישה למשתנה סביבה כדי לגשת למערך הנתונים המנוהל הזה.

כך נגדיר את משימה האימון בהתאמה אישית:

  • כתיבת מודל DecisionTreeClassifier של Scikit-learn לסיווג סוגי שעועית בנתונים שלנו
  • אריזה של קוד האימון בקונטיינר של Docker והעברה שלו ל-Container Registry

לאחר מכן נוכל להפעיל משימה של Vertex AI Training ישירות מצינור עיבוד הנתונים שלנו. קדימה, מתחילים!

שלב 1: הגדרת קוד האימון שלנו בקונטיינר ב-Docker

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

פתיחת הטרמינל

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

mkdir traincontainer
cd traincontainer
touch Dockerfile

mkdir trainer
touch trainer/train.py

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

+ Dockerfile
+ trainer/
    + train.py

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

FROM gcr.io/deeplearning-platform-release/sklearn-cpu.0-23
WORKDIR /

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

RUN pip install sklearn google-cloud-bigquery joblib pandas google-cloud-storage

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

כדי לשמור קבצים בזמן העריכה שלהם במכונה של המחברות, אפשר להשתמש ב-ctrl+s.

לאחר מכן, פותחים את הקובץ train.py. זה המקום שבו נוסיף את קוד האימון. מעתיקים את הטקסט הבא אל train.py. הפונקציה הזו מאחזרת את הנתונים ממערך הנתונים המנוהל שלנו, מעבירה אותם ל-Pandas DataFrame, מאומנת מודל של Scikit-learn ומעלה את המודל המאומן ל-Cloud Storage:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve
from sklearn.model_selection import train_test_split
from google.cloud import bigquery
from google.cloud import storage
from joblib import dump

import os
import pandas as pd

bqclient = bigquery.Client()
storage_client = storage.Client()

def download_table(bq_table_uri: str):
    prefix = "bq://"
    if bq_table_uri.startswith(prefix):
        bq_table_uri = bq_table_uri[len(prefix):]

    table = bigquery.TableReference.from_string(bq_table_uri)
    rows = bqclient.list_rows(
        table,
    )
    return rows.to_dataframe(create_bqstorage_client=False)

# These environment variables are from Vertex AI managed datasets
training_data_uri = os.environ["AIP_TRAINING_DATA_URI"]
test_data_uri = os.environ["AIP_TEST_DATA_URI"]

# Download data into Pandas DataFrames, split into train / test
df = download_table(training_data_uri)
test_df = download_table(test_data_uri)
labels = df.pop("Class").tolist()
data = df.values.tolist()
test_labels = test_df.pop("Class").tolist()
test_data = test_df.values.tolist()

# Define and train the Scikit model
skmodel = DecisionTreeClassifier()
skmodel.fit(data, labels)
score = skmodel.score(test_data, test_labels)
print('accuracy is:',score)

# Save the model to a local file
dump(skmodel, "model.joblib")

# Upload the saved model file to GCS
bucket = storage_client.get_bucket("YOUR_GCS_BUCKET")
model_directory = os.environ["AIP_MODEL_DIR"]
storage_path = os.path.join(model_directory, "model.joblib")
blob = storage.blob.Blob.from_string(storage_path, client=storage_client)
blob.upload_from_filename("model.joblib")

אחר כך חוזרים ל-notebook ומריצים את הפקודה הבאה כדי להחליף את YOUR_GCS_BUCKET מהסקריפט שלמעלה בשם של הקטגוריה שלכם ב-Cloud Storage:

BUCKET = BUCKET_NAME[5:] # Trim the 'gs://' before adding to train script
!sed -i -r 's@YOUR_GCS_BUCKET@'"$BUCKET"'@' traincontainer/trainer/train.py

אם אתם מעדיפים, תוכלו לעשות זאת באופן ידני. אם כן, חשוב לא לכלול את gs:// בשם הקטגוריה כשמעדכנים את הסקריפט.

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

שלב 2: דחיפה של הקונטיינר ל-Container Registry

לאחר השלמת קוד ההכשרה, אנחנו מוכנים להעביר אותו ל-Google Container Registry. בהמשך, כשנתקין את רכיב האימון בצינור עיבוד הנתונים, נכוון את Vertex Pipelines לקונטיינר הזה.

חוזרים ל-Terminal, ומהרמה הבסיסית (root) של הספרייה traincontainer/ מגדירים משתנה עם ה-URI של קובץ האימג' בקונטיינר ב-Container Registry.

PROJECT_ID=$(gcloud config get-value project)
IMAGE_URI="gcr.io/$PROJECT_ID/scikit:v1"

לאחר מכן, מריצים את הפקודה הבאה כדי ליצור את מאגר התגים:

docker build ./ -t $IMAGE_URI

בשלב האחרון, מעבירים את הקונטיינר ל-Container Registry:

docker push $IMAGE_URI

נכנסים לקטע Container Registry במסוף Cloud כדי לוודא שהקונטיינר נמצא שם. החיפוש ייראה בערך כך:

Container Registry

6. הגדרה של משימת חיזוי באצווה

בשלב האחרון בצינור עיבוד הנתונים שלנו ירוץ תהליך של חיזוי באצווה. כדי שזה יעבוד, אנחנו צריכים לספק קובץ CSV ב-Cloud Storage שמכיל את הדוגמאות שאנחנו רוצים לקבל עליהן חיזויים. ניצור את קובץ ה-CSV הזה ביומן שלנו ונעתיק אותו ל-Cloud Storage באמצעות כלי שורת הפקודה gsutil.

העתקת דוגמאות לחיזוי באצווה ל-Cloud Storage

הקובץ הבא מכיל 3 דוגמאות מכל כיתה במערך הנתונים של השעועעים. הדוגמה הבאה לא כוללת את העמודה Class כי זה מה שהמודל שלנו ינבא. כדי ליצור את קובץ ה-CSV הזה באופן מקומי ביומן, מריצים את הפקודה הבאה:

%%writefile batch_examples.csv
Area,Perimeter,MajorAxisLength,MinorAxisLength,AspectRation,Eccentricity,ConvexArea,EquivDiameter,Extent,Solidity,roundness,Compactness,ShapeFactor1,ShapeFactor2,ShapeFactor3,ShapeFactor4
23288,558.113,207.567738,143.085693,1.450653336,0.7244336162,23545,172.1952453,0.8045881703,0.9890847314,0.9395021523,0.8295857874,0.008913077034,0.002604069884,0.6882125787,0.9983578734
23689,575.638,205.9678003,146.7475015,1.403552348,0.7016945718,24018,173.6714472,0.7652721693,0.9863019402,0.8983750474,0.8431970773,0.00869465998,0.002711119968,0.7109813112,0.9978994889
23727,559.503,189.7993849,159.3717704,1.190922235,0.5430731512,24021,173.8106863,0.8037601626,0.9877607094,0.952462433,0.9157600082,0.007999299741,0.003470231343,0.8386163926,0.9987269085
31158,641.105,212.0669751,187.1929601,1.132879009,0.4699241567,31474,199.1773023,0.7813134733,0.989959967,0.9526231013,0.9392188582,0.0068061806,0.003267009878,0.8821320637,0.9993488983
32514,649.012,221.4454899,187.1344232,1.183349841,0.5346736437,32843,203.4652564,0.7849831,0.9899826447,0.9700068737,0.9188051492,0.00681077351,0.002994124691,0.8442029022,0.9989873701
33078,659.456,235.5600775,178.9312328,1.316483846,0.6503915309,33333,205.2223615,0.7877214708,0.9923499235,0.9558229607,0.8712102818,0.007121351881,0.002530662194,0.7590073551,0.9992209221
33680,683.09,256.203255,167.9334938,1.525623324,0.7552213942,34019,207.081404,0.80680321,0.9900349805,0.9070392732,0.8082699962,0.007606985006,0.002002710402,0.6533003868,0.9966903078
33954,716.75,277.3684803,156.3563259,1.773951126,0.825970469,34420,207.9220419,0.7994819873,0.9864613597,0.8305492781,0.7496238998,0.008168948587,0.001591181142,0.5619359911,0.996846984
36322,719.437,272.0582306,170.8914975,1.591993952,0.7780978465,36717,215.0502424,0.7718560075,0.9892420405,0.8818487005,0.7904566678,0.007490177594,0.001803782407,0.6248217437,0.9947124371
36675,742.917,285.8908964,166.8819538,1.713132487,0.8119506999,37613,216.0927123,0.7788277766,0.9750618137,0.8350248381,0.7558572692,0.0077952528,0.001569528272,0.5713202115,0.9787472145
37454,772.679,297.6274753,162.1493177,1.835514817,0.8385619338,38113,218.3756257,0.8016695205,0.9827093118,0.7883332637,0.7337213257,0.007946480356,0.001420623993,0.5383469838,0.9881438654
37789,766.378,313.5680678,154.3409867,2.031657789,0.8704771226,38251,219.3500608,0.7805870567,0.9879218844,0.8085170916,0.6995293312,0.008297866252,0.001225659709,0.4893412853,0.9941740339
47883,873.536,327.9986493,186.5201272,1.758516115,0.822571799,48753,246.9140116,0.7584464543,0.9821549443,0.7885506623,0.7527897207,0.006850002074,0.00135695419,0.5666923636,0.9965376533
49777,861.277,300.7570338,211.6168613,1.42123379,0.7105823885,50590,251.7499649,0.8019106536,0.9839296304,0.843243269,0.8370542883,0.00604208839,0.001829706116,0.7006598815,0.9958014989
49882,891.505,357.1890036,179.8346914,1.986207449,0.8640114945,51042,252.0153467,0.7260210171,0.9772736178,0.7886896753,0.7055518063,0.007160679276,0.001094585314,0.4978033513,0.9887407248
53249,919.923,325.3866286,208.9174205,1.557489212,0.7666552108,54195,260.3818974,0.6966846347,0.9825445152,0.7907120655,0.8002231025,0.00611066177,0.001545654241,0.6403570138,0.9973491406
61129,964.969,369.3481688,210.9473449,1.750902193,0.8208567513,61796,278.9836198,0.7501135067,0.9892064211,0.8249553283,0.7553404711,0.006042110436,0.001213219664,0.5705392272,0.9989583843
61918,960.372,353.1381442,224.0962377,1.575832543,0.7728529173,62627,280.7782864,0.7539207091,0.9886790043,0.8436218213,0.7950947556,0.005703319619,0.00140599258,0.6321756704,0.9962029945
141953,1402.05,524.2311633,346.3974998,1.513380332,0.7505863011,143704,425.1354762,0.7147107987,0.9878152313,0.9074598849,0.8109694843,0.003692991084,0.0009853172185,0.6576715044,0.9953071199
145285,1440.991,524.9567463,353.0769977,1.486805285,0.7400216694,146709,430.0960442,0.7860466375,0.9902937107,0.8792413513,0.8192980608,0.003613289371,0.001004269363,0.6712493125,0.9980170255
146153,1476.383,526.1933264,356.528288,1.475881001,0.7354662103,149267,431.3789276,0.7319360978,0.9791380546,0.8425962592,0.8198107159,0.003600290972,0.001003163512,0.6720896099,0.991924286

לאחר מכן מעתיקים את הקובץ לקטגוריה ב-Cloud Storage:

!gsutil cp batch_examples.csv $BUCKET_NAME

נתייחס לקובץ הזה בשלב הבא, כשנגדיר את צינור עיבוד הנתונים.

7. פיתוח צינור עיבוד נתונים עם רכיבים מוכנים מראש

עכשיו, אחרי שקוד האימון נמצא בענן, אנחנו מוכנים להפעיל אותו מצינור עיבוד הנתונים שלנו. צינור עיבוד הנתונים (pipeline) שתגדירו ישתמש בשלושה רכיבים מוכנים מראש מהספרייה google_cloud_pipeline_components שהתקנתם קודם. הרכיבים המוגדרים מראש האלה מפשטים את הקוד שצריך לכתוב כדי להגדיר את צינור עיבוד הנתונים, ומאפשרים לנו להשתמש בשירותי Vertex AI כמו אימון מודלים וחיזוי באצווה.

כך יפעל צינור עיבוד הנתונים בן שלושת השלבים:

  • יצירת מערך נתונים מנוהל ב-Vertex AI
  • הרצת משימת אימון על Vertx AI באמצעות הקונטיינר בהתאמה אישית שהגדרנו
  • הרצת משימה של חיזוי באצווה במודל הסיווג שעבר אימון ב-Scikit-learn

שלב 1: הגדרת צינור עיבוד הנתונים שלנו

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

@pipeline(name="automl-beans-custom",
                  pipeline_root=PIPELINE_ROOT)
def pipeline(
    bq_source: str = "bq://sara-vertex-demos.beans_demo.large_dataset",
    bucket: str = BUCKET_NAME,
    project: str = PROJECT_ID,
    gcp_region: str = REGION,
    bq_dest: str = "",
    container_uri: str = "",
    batch_destination: str = ""
):
    dataset_create_op = gcc_aip.TabularDatasetCreateOp(
        display_name="tabular-beans-dataset",
        bq_source=bq_source,
        project=project,
        location=gcp_region
    )

    training_op = gcc_aip.CustomContainerTrainingJobRunOp(
        display_name="pipeline-beans-custom-train",
        container_uri=container_uri,
        project=project,
        location=gcp_region,
        dataset=dataset_create_op.outputs["dataset"],
        staging_bucket=bucket,
        training_fraction_split=0.8,
        validation_fraction_split=0.1,
        test_fraction_split=0.1,
        bigquery_destination=bq_dest,
        model_serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest",
        model_display_name="scikit-beans-model-pipeline",
        machine_type="n1-standard-4",
    )
    batch_predict_op = gcc_aip.ModelBatchPredictOp(
        project=project,
        location=gcp_region,
        job_display_name="beans-batch-predict",
        model=training_op.outputs["model"],
        gcs_source_uris=["{0}/batch_examples.csv".format(BUCKET_NAME)],
        instances_format="csv",
        gcs_destination_output_uri_prefix=batch_destination,
        machine_type="n1-standard-4"
    )

שלב 2: הידור והפעלה של צינור עיבוד הנתונים

עכשיו, אחרי שהגדרתם את צינור עיבוד הנתונים, אתם מוכנים לקמפל אותו. הפקודה הבאה תיצור קובץ JSON שמשמש להפעלת צינור עיבוד הנתונים:

compiler.Compiler().compile(
    pipeline_func=pipeline, package_path="custom_train_pipeline.json"
)

בשלב הבא יוצרים משתנה TIMESTAMP. נשתמש בו במזהה המשימה:

from datetime import datetime

TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")

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

pipeline_job = aiplatform.PipelineJob(
    display_name="custom-train-pipeline",
    template_path="custom_train_pipeline.json",
    job_id="custom-train-pipeline-{0}".format(TIMESTAMP),
    parameter_values={
        "project": PROJECT_ID,
        "bucket": BUCKET_NAME,
        "bq_dest": "bq://{0}".format(PROJECT_ID),
        "container_uri": "gcr.io/{0}/scikit:v1".format(PROJECT_ID),
        "batch_destination": "{0}/batchpredresults".format(BUCKET_NAME)
    },
    enable_caching=True,
)

לבסוף, מריצים את המשימה כדי ליצור הרצת צינור עיבוד נתונים חדשה:

pipeline_job.submit()

אחרי הרצת התא הזה, אמורים להופיע יומנים עם קישור להצגת ההרצה של צינור עיבוד הנתונים במסוף:

יומני משימות של צינורות עיבוד נתונים

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

צינור עיבוד נתונים של מבוא הושלם

הרצה של צינור עיבוד הנתונים הזה תימשך 5-10 דקות, אבל אתם יכולים להמשיך לשלב הבא לפני שהוא יסתיים. בהמשך נסביר מה קורה בכל אחד מהשלבים האלה בצינור עיבוד הנתונים.

8. הסבר על הפעלת צינור עיבוד הנתונים

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

שלב 1 בצינור עיבוד הנתונים: יצירת מערך נתונים מנוהל

בשלב הראשון בצינור עיבוד הנתונים שלנו נוצר מערך נתונים מנוהל ב-Vertex AI. אם לוחצים על הקישור הבא למערך הנתונים בקטע Pipelines במסוף:

קישור למערך נתונים מצינור עיבוד נתונים

מערך הנתונים יופיע ב-Vertex AI, ויכלול קישור למקור הנתונים ב-BigQuery ומידע על העמודות השונות במערך הנתונים. אחרי שמעלים מערך נתונים מנוהל ל-Vertex AI, אפשר להשתמש בו לאימון של מודלים של AutoML או של מודלים מותאמים אישית.

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

שלב 2 בצינור עיבוד הנתונים: אימון מודל ב-Vertex AI Training

בזמן שמשימת האימון המותאמת אישית פועלת, אתם יכולים ללחוץ כדי לצפות ביומנים ישירות במסוף Vertex Pipelines:

יומני אימון בהתאמה אישית

אפשר לראות פרטים על משימה האימון בהתאמה אישית גם במרכז הבקרה של Vertex AI Training. בסיום משימה האימון, ייווצר משאב מודל ב-Vertex AI. לאחר מכן נוכל לפרוס את המודל הזה לנקודת קצה (endpoint) כדי לבצע חיזויים אונליין, או ליצור משימה של חיזוי באצווה. נבצע את הפעולה הזו בשלב הבא בצינור עיבוד הנתונים.

שלב 3: הרצת משימת חיזוי באצווה במודל שלנו

בסיום, צינור עיבוד הנתונים שלנו יקבל תחזיות לגבי הדוגמאות שהעברנו באמצעות קובץ CSV. בסיום המשימה של חיזוי האצווה, מערכת Vertex AI תכתוב קובץ CSV במיקום שציינתם ב-Cloud Storage. כשהשלב הזה של צינור עיבוד הנתונים יתחיל לפעול, תוכלו לעבור לקטע Batch Predictions במסוף Vertex AI כדי לראות את המשימה שנוצרה.

כשתהליך העבודה יושלם, לוחצים עליו כדי לראות את כתובת ה-URL של תחזיות האצווה ב-Cloud Storage:

משימה של חיזוי באצווה

לוחצים על הקישור הזה כדי לעבור לספריית Cloud Storage שבה נמצאות תוצאות החיזוי, ואז לוחצים כדי להוריד אחד מהקבצים מסוג prediction.results. בקובץ אמורות להופיע שורות שנראות כך:

{"instance": [33954.0, 716.75, 277.3684803, 156.3563259, 1.773951126, 0.825970469, 34420.0, 207.9220419, 0.7994819873, 0.9864613597, 0.8305492781, 0.7496238998, 0.008168948587, 0.001591181142, 0.5619359911, 0.996846984], "prediction": "HOROZ"}

הוא כולל את ערכי המאפיינים של מופע מסוים, יחד עם הסיווג שהמודל שלנו ניבא. בדוגמה הזו, המודל שלנו חושב שמדובר בשעועית 'HOROZ'.

זהו, סיימתם את שיעור ה-Lab!

🎉 כל הכבוד! 🎉

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

  • שימוש ב-Kubeflow Pipelines SDK כדי לפתח צינורות עיבוד נתונים מקצה לקצה עם רכיבים מותאמים אישית
  • הרצת צינורות עיבוד נתונים ב-Vertex Pipelines והפעלת צינורות עיבוד נתונים עם ה-SDK
  • הצגה וניתוח של תרשים Vertex Pipelines במסוף
  • שימוש ברכיבים מוכנים מראש של צינורות עיבוד נתונים כדי להוסיף שירותי Vertex AI לצינור עיבוד הנתונים
  • תזמון משימות חוזרות בצינור עיבוד נתונים

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

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

כדי שלא תחויבו, מומלץ למחוק את המשאבים שנוצרו במהלך הסדנה.

שלב 1: עצירת המכונה של Notebooks או מחיקת המכונה

אם אתם רוצים להמשיך להשתמש במחברת שיצרתם במעבדה הזו, מומלץ לכבות אותה כשהיא לא בשימוש. בממשק המשתמש של Notebooks במסוף Cloud, בוחרים את ה-notebook ואז לוחצים על Stop. כדי למחוק את המכונה לגמרי, בוחרים באפשרות מחיקה:

עצירת המופע

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

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

מחיקת אחסון