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

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

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

מה לומדים

במאמר הזה נסביר איך:

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

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

2. מבוא ל-Vertex AI

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

‫Vertex AI כולל מוצרים רבים ושונים לתמיכה בתהליכי עבודה של למידת מכונה מקצה לקצה. בשיעור ה-Lab הזה נתמקד במוצרים שמודגשים בהמשך: Experiments,‏ Pipelines,‏ ML Metadata ו-Workbench.

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

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

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

למה כדאי להשתמש ב-Vertex AI Experiments למדעי הנתונים?

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

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

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

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

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

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

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

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

שלב 1: הפעלת Compute Engine API

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

שלב 2: הפעלת Vertex AI API

עוברים אל הקטע Vertex AI במסוף Cloud ולוחצים על הפעלת Vertex AI API.

לוח הבקרה של Vertex AI

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

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

תפריט Vertex AI

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

Notebook_api

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

Notebooks_UI

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

new_notebook

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

create_notebook

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

idle_timeout

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

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

open_jupyterlab

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

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

אימות

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

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

tensorflow_kernel

5. שלבי ההגדרה הראשונית ב-Notebook

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

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

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

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

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

# 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

אל תשתמשו בקטגוריה של Cloud Storage שפועלת במספר אזורים לאימון באמצעות 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

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

מגדירים את השם של הקטגוריה ב-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 Experiment. אפשר להשתמש בקוד הבא כדי לראות את הפרמטרים שמשויכים להרצות ואת המצב הנוכחי שלהן.

# 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 Experiments אפשר לראות שהריצה הכי מוצלחת שלנו בשני המדדים הייתה הריצה האחרונה עם dropout_rate של 0.001, learning_rate אם 0.001, והמספר הכולל של epochs היה 20. על סמך הניסוי הזה, הפרמטרים האלה של המודל ישמשו בסופו של דבר בסביבת הייצור, כי הם מניבים את הביצועים הכי טובים של המודל.

סיימתם את שיעור ה-Lab.

‫🎉 איזה כיף! 🎉

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

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

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

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

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

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

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

עצירת מכונה

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

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

מחיקת האחסון