הפקת המרב מניסויים: ניהול ניסויים של למידת מכונה באמצעות Vertex AI

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

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

מה לומדים

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

  • לאמן מודל Keras בהתאמה אישית כדי לחזות את דירוגי השחקנים (למשל, רגרסיה)
  • שימוש ב-Kubeflow Pipelines SDK כדי לפתח צינורות עיבוד נתונים ניתנים להתאמה של למידת מכונה
  • יצירה והפעלה של צינור עיבוד נתונים בן 5 שלבים שמטמיע נתונים מ-Cloud Storage, מדרג את הנתונים, מאמן את המודל, מעריך אותם ושומר את המודל שנוצר בחזרה ב-Cloud Storage
  • משתמשים במטא-נתונים של Vertex ML כדי לשמור ארטיפקטים של מודל כמו מודלים ומדדי מודל
  • להשתמש בניסויים ב-Vertex AI כדי להשוות תוצאות של הפעלות שונות של צינורות עיבוד נתונים

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

2. מבוא ל-Vertex AI

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

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

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

3. סקירה כללית של התרחיש לדוגמה

נשתמש במערך נתונים פופולרי בנושא כדורגל מ-EA Sports סדרת משחקי הווידאו FIFA הוא כולל יותר מ-25,000 משחקי כדורגל ומעל 10,000 שחקנים בעונות 2008-2016. הנתונים עברו עיבוד מראש מראש כדי שיהיה לכם קל יותר להתחיל לעבוד. מערך הנתונים הזה ישמש אתכם במהלך שיעור ה-Lab, שעכשיו נמצא בקטגוריה ציבורית של Cloud Storage. אנחנו נספק פרטים נוספים בהמשך ב-Codelab על האופן שבו אפשר לגשת למערך הנתונים. המטרה הסופית שלנו היא לחזות את הדירוג הכולל של השחקן על סמך פעולות שונות במשחק, כמו חטיפות כדור ובעיטות עונשין.

למה הניסויים ב-Vertex AI מועילים במדעי הנתונים?

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

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

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

tl;dr: הניסויים של Vertex AI עושים את העבודה בשבילכם ועוזרים לכם לעקוב בקלות אחרי הניסויים ולהשוות ביניהם

למה כדאי להשתמש בניסויים של Vertex AI לגיימינג?

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

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

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

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

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

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

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

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

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

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

תפריט Vertex AI

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

Notebook_api

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

Notebooks_UI

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

new_notebook

נותנים שם ל-notebook ולוחצים על הגדרות מתקדמות.

create_notebook

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

idle_timeout

שלב 4: פותחים את ה-notebook

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

open_jupyterlab

שלב 5: אימות (בפעם הראשונה בלבד)

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

אימות

שלב 6: בוחרים את הליבה המתאימה

notebooks מנוהלים מספקים כמה ליבות בממשק משתמש אחד. בוחרים את הליבה של Tensorflow 2 (מקומי).

tensorflow_kernel

5. שלבי הגדרה ראשוניים ב-notebook

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

שלב 1: התקנת החבילות הנוספות

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

!pip3 install --user --force-reinstall 'google-cloud-aiplatform>=1.15' -q --no-warn-conflicts
!pip3 install --user kfp -q --no-warn-conflicts

לאחר מכן עליך להפעיל מחדש את הליבה של ה-notebook כדי להשתמש בחבילות שהורדת מה-notebook.

# Automatically restart kernel after installs
import os

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

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

שלב 2: הגדרת משתנים

אנחנו רוצים להגדיר את PROJECT_ID. אם לא ידוע לך מהו Project_ID, ייתכן שתהיה לך אפשרות לקבל את ה-PROJECT_ID באמצעות gcloud.

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)

אחרת, צריך להגדיר את PROJECT_ID כאן.

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

חשוב גם להגדיר את המשתנה REGION, שישמש לשארית ה-notebook הזה. בהמשך מפורטים האזורים הנתמכים ב-Vertex AI. מומלץ לבחור את האזור הקרוב ביותר אליכם.

  • יבשת אמריקה: us-central1
  • אירופה: europe-west4
  • אסיה והאוקיינוס השקט: asia-east1

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

#set your region 
REGION = "us-central1"  # @param {type: "string"}

בשלב האחרון נגדיר משתנה TIMESTAMP. המשתנים האלה משמשים כדי למנוע התנגשויות שמות בין משתמשים במשאבים שנוצרו. אתם צריכים ליצור TIMESTAMP לכל סשן של מכונה ולהוסיף אותו לשמות המשאבים שיצרתם במדריך הזה.

#set timestamp to avoid collisions between multiple users

from datetime import datetime

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

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

תצטרכו לציין קטגוריית Staging של Cloud Storage ולהשתמש בה. קטגוריית ה-Staging היא המקום שבו כל הנתונים שמשויכים למשאבים של מערך הנתונים והמודל נשמרים בכל הסשנים.

מגדירים את שם הקטגוריה של Cloud Storage למטה. שמות הקטגוריות חייבים להיות ייחודיים באופן גלובלי בכל הפרויקטים ב-Google Cloud, כולל פרויקטים מחוץ לארגון.

#set cloud storage bucket 
BUCKET_NAME = "[insert bucket name here]"  # @param {type:"string"}
BUCKET_URI = f"gs://{BUCKET_NAME}"

אם הקטגוריה שלכם עדיין לא קיימת, תוכלו להריץ את התא הבא כדי ליצור את הקטגוריה של Cloud Storage.

! gsutil mb -l $REGION -p $PROJECT_ID $BUCKET_URI

עכשיו אפשר לאמת את הגישה לקטגוריה של Cloud Storage על ידי הרצת התא הבא.

#verify access 
! gsutil ls -al $BUCKET_URI

שלב 4: מעתיקים את מערך הנתונים של המשחקים שלנו

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

# copy the data over to your cloud storage bucket
DATASET_URI = "gs://cloud-samples-data/vertex-ai/structured_data/player_data" 

!gsutil cp -r $DATASET_URI $BUCKET_URI

שלב 5: מייבאים ספריות ומגדירים קבועים נוספים

בשלב הבא נרצה לייבא את הספריות שלנו עבור Vertex AI, KFP וכו'.

import logging
import os
import time

logger = logging.getLogger("logger")
logging.basicConfig(level=logging.INFO)

import kfp.v2.compiler as compiler
# Pipeline Experiments
import kfp.v2.dsl as dsl
# Vertex AI
from google.cloud import aiplatform as vertex_ai
from kfp.v2.dsl import Artifact, Input, Metrics, Model, Output, component
from typing import NamedTuple

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

#import libraries and define constants
# Experiments

TASK = "regression"
MODEL_TYPE = "tensorflow"
EXPERIMENT_NAME = f"{PROJECT_ID}-{TASK}-{MODEL_TYPE}-{TIMESTAMP}"

# Pipeline
PIPELINE_URI = f"{BUCKET_URI}/pipelines"
TRAIN_URI = f"{BUCKET_URI}/player_data/data.csv"
LABEL_URI = f"{BUCKET_URI}/player_data/labels.csv"
MODEL_URI = f"{BUCKET_URI}/model"
DISPLAY_NAME = "experiments-demo-gaming-data"
BQ_DATASET = "player_data"
BQ_LOCATION = "US"  
VIEW_NAME = 'dataset_test'
PIPELINE_JSON_PKG_PATH = "experiments_demo_gaming_data.json"
PIPELINE_ROOT = f"gs://{BUCKET_URI}/pipeline_root"

6. קדימה, נבנה את צינור עיבוד הנתונים

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

שלב 1: מפעילים את Vertex AI SDK

מפעילים את Vertex AI SDK ומגדירים את PROJECT_ID והBUCKET_URI.

#initialize vertex AI SDK 
vertex_ai.init(project=PROJECT_ID, staging_bucket=BUCKET_URI)

שלב 2: הגדרה של משימת האימון שלנו כרכיב בצינור עיבוד נתונים

כדי להתחיל להריץ את הניסויים שלנו, נצטרך לציין את משימת האימון שלנו על ידי הגדרתה כרכיב בצינור עיבוד נתונים. צינור עיבוד הנתונים שלנו יטפל בנתוני אימון ובהיפר-פרמטרים (למשל, DROPOUT_RATE, LEARNING_RATE, EPOCHS) כקלט וכמדדים של מודל הפלט (למשל, MAE ו-RMSE) וגם ארטיפקט של המודל.

@component(
    packages_to_install=[
        "numpy==1.21.0",
        "pandas==1.3.5", 
        "scikit-learn==1.0.2",
        "tensorflow==2.9.0",
    ]
)
def custom_trainer(
    train_uri: str,
    label_uri: str,
    dropout_rate: float,
    learning_rate: float,
    epochs: int,
    model_uri: str,
    metrics: Output[Metrics], 
    model_metadata: Output[Model], 
    

):

    # import libraries
    import logging
    import uuid
    from pathlib import Path as path

    import pandas as pd
    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.layers import Dropout
    from tensorflow.keras.metrics import Metric 
    from sklearn.metrics import accuracy_score
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.metrics import mean_absolute_error
    import numpy as np
    from math import sqrt
    import os
    import tempfile

    # set variables and use gcsfuse to update prefixes
    gs_prefix = "gs://"
    gcsfuse_prefix = "/gcs/"
    train_path = train_uri.replace(gs_prefix, gcsfuse_prefix)
    label_path = label_uri.replace(gs_prefix, gcsfuse_prefix)
    model_path = model_uri.replace(gs_prefix, gcsfuse_prefix)

    def get_logger():

        logger = logging.getLogger(__name__)
        logger.setLevel(logging.INFO)
        handler = logging.StreamHandler()
        handler.setFormatter(
            logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
        )
        logger.addHandler(handler)
        return logger

    def get_data(
        train_path: str, 
        label_path: str
    ) -> (pd.DataFrame): 
        
        
        #load data into pandas dataframe
        data_0 = pd.read_csv(train_path)
        labels_0 = pd.read_csv(label_path)
        
        #drop unnecessary leading columns
        
        data = data_0.drop('Unnamed: 0', axis=1)
        labels = labels_0.drop('Unnamed: 0', axis=1)
        
        #save as numpy array for reshaping of data 
        
        labels = labels.values
        data = data.values
    
        # Split the data
        labels = labels.reshape((labels.size,))
        train_data, test_data, train_labels, test_labels = train_test_split(data, labels, test_size=0.2, shuffle=True, random_state=7)
    
        #Convert data back to pandas dataframe for scaling
        
        train_data = pd.DataFrame(train_data)
        test_data = pd.DataFrame(test_data)
        train_labels = pd.DataFrame(train_labels)
        test_labels = pd.DataFrame(test_labels)
        
        #Scale and normalize the training dataset
        
        scaler = StandardScaler()
        scaler.fit(train_data)
        train_data = pd.DataFrame(scaler.transform(train_data), index=train_data.index, columns=train_data.columns)
        test_data = pd.DataFrame(scaler.transform(test_data), index=test_data.index, columns=test_data.columns)
        
        return train_data,train_labels, test_data, test_labels 
    
        """ Train your Keras model passing in the training data and values for learning rate, dropout rate,and the number of epochs """

    def train_model(
        learning_rate: float, 
        dropout_rate: float,
        epochs: float,
        train_data: pd.DataFrame,
        train_labels: pd.DataFrame):
 
        # Train tensorflow model
        param = {"learning_rate": learning_rate, "dropout_rate": dropout_rate, "epochs": epochs}
        model = Sequential()
        model.add(Dense(500, input_dim=train_data.shape[1], activation= "relu"))
        model.add(Dropout(param['dropout_rate']))
        model.add(Dense(100, activation= "relu"))
        model.add(Dense(50, activation= "relu"))
        model.add(Dense(1))
            
        model.compile(
        tf.keras.optimizers.Adam(learning_rate= param['learning_rate']),
        loss='mse',
        metrics=[tf.keras.metrics.RootMeanSquaredError(),tf.keras.metrics.MeanAbsoluteError()])
        
        model.fit(train_data, train_labels, epochs= param['epochs'])
        
        return model

    # Get Predictions
    def get_predictions(model, test_data):

        dtest = pd.DataFrame(test_data)
        pred = model.predict(dtest)
        return pred

    # Evaluate predictions with MAE
    def evaluate_model_mae(pred, test_labels):
        
        mae = mean_absolute_error(test_labels, pred)
        return mae
    
    # Evaluate predictions with RMSE
    def evaluate_model_rmse(pred, test_labels):

        rmse = np.sqrt(np.mean((test_labels - pred)**2))
        return rmse    
 
    
    #Save your trained model in GCS     
    def save_model(model, model_path):

        model_id = str(uuid.uuid1())
        model_path = f"{model_path}/{model_id}"        
        path(model_path).parent.mkdir(parents=True, exist_ok=True)
        model.save(model_path + '/model_tensorflow')

        
    # Main ----------------------------------------------
    
    train_data, train_labels, test_data, test_labels = get_data(train_path, label_path)
    model = train_model(learning_rate, dropout_rate, epochs, train_data,train_labels )
    pred = get_predictions(model, test_data)
    mae = evaluate_model_mae(pred, test_labels)
    rmse = evaluate_model_rmse(pred, test_labels)
    save_model(model, model_path)

    # Metadata ------------------------------------------

    #convert numpy array to pandas series
    mae = pd.Series(mae)
    rmse = pd.Series(rmse)

    #log metrics and model artifacts with ML Metadata. Save metrics as a list. 
    metrics.log_metric("mae", mae.to_list()) 
    metrics.log_metric("rmse", rmse.to_list()) 
    model_metadata.uri = model_uri

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

עכשיו נגדיר את תהליך העבודה באמצעות Domain Specific Language (DSL) שזמין ב-KFP ונרכיב את צינור עיבוד הנתונים שלנו לקובץ JSON.

# define our workflow

@dsl.pipeline(name="gaming-custom-training-pipeline")
def pipeline(
    train_uri: str,
    label_uri: str,
    dropout_rate: float,
    learning_rate: float,
    epochs: int,
    model_uri: str,
):

    custom_trainer(
        train_uri,label_uri, dropout_rate,learning_rate,epochs, model_uri
    )
#compile our pipeline
compiler.Compiler().compile(pipeline_func=pipeline, package_path="gaming_pipeline.json")

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

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

runs = [
    {"dropout_rate": 0.001, "learning_rate": 0.001,"epochs": 20},
    {"dropout_rate": 0.002, "learning_rate": 0.002,"epochs": 25},
    {"dropout_rate": 0.003, "learning_rate": 0.003,"epochs": 30},
    {"dropout_rate": 0.004, "learning_rate": 0.004,"epochs": 35},
    {"dropout_rate": 0.005, "learning_rate": 0.005,"epochs": 40},
]

לאחר הגדרת ההיפר-פרמטרים, אנחנו יכולים להשתמש ב-for loop כדי ליצור פיד בהצלחה בהפעלות השונות של צינור עיבוד הנתונים:

for i, run in enumerate(runs):

    job = vertex_ai.PipelineJob(
        display_name=f"{EXPERIMENT_NAME}-pipeline-run-{i}",
        template_path="gaming_pipeline.json",
        pipeline_root=PIPELINE_URI,
        parameter_values={
            "train_uri": TRAIN_URI,
            "label_uri": LABEL_URI,
            "model_uri": MODEL_URI,
            **run,
        },
    )
    job.submit(experiment=EXPERIMENT_NAME)

שלב 5: משתמשים ב-Vertex AI SDK כדי לצפות בניסויים

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

# see state/status of all the pipeline runs

vertex_ai.get_experiment_df(EXPERIMENT_NAME)

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

#check on current status
while True:
    pipeline_experiments_df = vertex_ai.get_experiment_df(EXPERIMENT_NAME)
    if all(
        pipeline_state != "COMPLETE" for pipeline_state in pipeline_experiments_df.state
    ):
        print("Pipeline runs are still running...")
        if any(
            pipeline_state == "FAILED"
            for pipeline_state in pipeline_experiments_df.state
        ):
            print("At least one Pipeline run failed")
            break
    else:
        print("Pipeline experiment runs have completed")
        break
    time.sleep(60)

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

# Call the pipeline runs based on the experiment run name
pipeline_experiments_df = vertex_ai.get_experiment_df(EXPERIMENT_NAME)
job = vertex_ai.PipelineJob.get(pipeline_experiments_df.run_name[0])
print(job.resource_name)
print(job._dashboard_uri())

לבסוף, אפשר לרענן את מצב ההפעלות במרווחי זמן קבועים (למשל כל 60 שניות) כדי לראות את המצבים משתנים מ-RUNNING ל-FAILED או ל-COMPLETE.

# wait 60 seconds and view state again
import time
time.sleep(60)
vertex_ai.get_experiment_df(EXPERIMENT_NAME)

7. זיהוי ההפעלה עם הביצועים הטובים ביותר

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

Final-Results-Snapshot

גם MAE וגם RMSE הם מדדים של השגיאה הממוצעת בחיזוי המודל, ולכן ברוב המקרים רצוי להקצות ערך נמוך יותר עבור שני המדדים. על סמך הפלט מהניסויים של Vertex AI אנחנו יכולים לראות שהריצה המוצלחת ביותר בשני המדדים הייתה ההפעלה הסופית עם dropout_rate מתוך 0.001, אם learning_rate אם 0.001 והמספר הכולל של epochs הוא 20. על סמך הניסוי הזה, הפרמטרים האלה של המודל ישמשו בסופו של דבר בסביבת הייצור, כדי להניב את ביצועי המודל הטובים ביותר.

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

🎉 כל הכבוד! 🎉

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

  • לאמן מודל Keras בהתאמה אישית כדי לחזות את דירוגי השחקנים (למשל, רגרסיה)
  • שימוש ב-Kubeflow Pipelines SDK כדי לפתח צינורות עיבוד נתונים ניתנים להתאמה של למידת מכונה
  • יצירה והפעלה של צינור עיבוד נתונים בן 5 שלבים שמטמיע נתונים מ-GCS, מדרג את הנתונים, מאמן את המודל, מעריך אותו ושומר את המודל שנוצר בחזרה ב-GCS
  • משתמשים במטא-נתונים של Vertex ML כדי לשמור ארטיפקטים של מודל כמו מודלים ומדדי מודל
  • להשתמש בניסויים ב-Vertex AI כדי להשוות תוצאות של הפעלות שונות של צינורות עיבוד נתונים

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

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

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

שלב 1: מפסיקים או מוחקים את המכונה של Notebooks

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

עצירת המופע

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

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

מחיקת האחסון