Wykorzystaj w pełni eksperymenty: zarządzaj eksperymentami z systemami uczącymi się przy użyciu Vertex AI

1. Omówienie

W tym module użyjesz Vertex AI do tworzenia potoku, który trenuje niestandardowy model Keras w TensorFlow. Następnie użyjemy nowej funkcji dostępnej w eksperymentach Vertex AI, aby śledzić i porównywać uruchomienia modelu i określić, która kombinacja hiperparametrów zapewnia najlepszą wydajność.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Wytrenuj niestandardowy model Keras do prognozowania ocen graczy (np. regresji)
  • Tworzenie skalowalnych potoków ML za pomocą pakietu Kubeflow Pipelines SDK
  • utworzyć i uruchamiać 5-etapowy potok, który pobiera dane z Cloud Storage, skaluje je, trenuje model, ocenia go i zapisują uzyskany model z powrotem w Cloud Storage.
  • Korzystanie z metadanych Vertex ML do zapisywania artefaktów modelu, takich jak modele i dane dotyczące modelu
  • Korzystaj z eksperymentów Vertex AI, aby porównywać wyniki różnych uruchomień potoku

Łączny koszt przeprowadzenia tego laboratorium w Google Cloud wynosi około 1 USD.

2. Wprowadzenie do Vertex AI

Ten moduł wykorzystuje najnowszą ofertę usług AI dostępną w Google Cloud. Vertex AI integruje ofertę systemów uczących się z całego Google Cloud, tworząc bezproblemowe środowisko programistyczne. Wcześniej modele wytrenowane za pomocą AutoML i modele niestandardowe były dostępne za pomocą oddzielnych usług. Nowa oferta łączy oba te interfejsy API z innymi nowymi usługami. Możesz też przenieść istniejące projekty do Vertex AI.

Vertex AI zawiera wiele różnych usług, które obsługują kompleksowe przepływy pracy związane z systemami uczącymi się. W tym laboratorium skupimy się na podanych niżej usługach: Experiments, Pipelines, ML Metadata i Workbench.

Omówienie usługi Vertex

3. Omówienie zastosowania

Użyjemy zbioru danych o popularnej piłce nożnej pochodzącego z serii gier wideo FIFA firmy EA Sports. Zawiera on ponad 25 tys. meczy piłki nożnej i ponad 10 tys. graczy z sezonów 2008–2016. Dane zostały wstępnie przetworzone, aby ułatwić Ci rozpoczęcie pracy. W trakcie ćwiczeń będziesz korzystać z tego zbioru danych, który jest teraz dostępny w publicznym zasobniku Cloud Storage. Więcej informacji o dostępie do zbioru danych znajdziesz w później części tego ćwiczenia. Naszym celem jest przewidywanie ogólnej oceny gracza na podstawie różnych działań w grze, takich jak przechwyty i kary.

Dlaczego Vertex AI Experiments jest przydatny w przypadku nauk o danych?

Badanie danych ma charakter eksperymentalny – w końcu nazywa się je naukowcami. Dobrzy naukowcy zajmujący się danymi kierują się hipotezami, testując różne hipotezy metodą prób i błędów w nadziei, że kolejne iteracje przyniosą większą wydajność modelu.

Chociaż zespoły ds. analizy danych stosują eksperymenty, często mają problemy z utrzymywaniem kontroli nad swoją pracą i „tajną recepturą”, która została odkryta dzięki eksperymentom. Dzieje się tak z kilku powodów:

  • Śledzenie zadań związanych z treningiem może być uciążliwe, przez co łatwo utracić z oczu to, co działa, a co nie.
  • Problem ten komplikuje się, gdy patrzysz na zespół ds. badania danych, ponieważ nie wszyscy członkowie mogą śledzić eksperymenty lub nawet udostępniać wyniki innym.
  • Pozyskiwanie danych jest czasochłonne, a większość zespołów korzysta z metod ręcznych (np.arkuszy kalkulacyjnych lub dokumentów), które powodują, że informacje do analizy są niespójne i niekompletne.

W skrócie: Vertex AI Experiments wykonuje za Ciebie pracę, ułatwiając śledzenie i porównywanie eksperymentów

Dlaczego warto korzystać z Vertex AI Experiments w przypadku gier?

Gry od dawna są polem do eksperymentowania z systemami uczącymi się. Gry generują miliardy zdarzeń w czasie rzeczywistym dziennie, a dodatkowo wykorzystują wszystkie te dane, korzystając z systemów uczących się i eksperymentów z systemami uczącymi się, aby poprawić wrażenia z gry, zatrzymać graczy i ocenić różnych graczy na platformie. Dlatego uznaliśmy, że zbiór danych o grach będzie pasował do naszych ogólnych eksperymentów.

4. Konfigurowanie środowiska

Aby uruchomić to ćwiczenia z programowania, musisz mieć projekt Google Cloud Platform z włączonymi płatnościami. Aby utworzyć projekt, postępuj zgodnie z tymi instrukcjami.

Krok 1. Włącz Compute Engine API

Przejdź do Compute Engine i wybierz Włącz, jeśli usługa nie jest jeszcze włączona.

Krok 2. Włącz interfejs Vertex AI API

Przejdź do sekcji Vertex AI w konsoli Cloud i kliknij Włącz interfejs Vertex AI API.

Panel Vertex AI

Krok 3. Utwórz instancję Vertex AI Workbench

W konsoli Cloud w sekcji Vertex AI kliknij Workbench:

Menu Vertex AI

Włącz interfejs Notebooks API, jeśli nie jest jeszcze włączony.

Notebook_api

Po włączeniu tej opcji kliknij ZARZĄDZANE NOTATKI:

Notebooks_UI

Następnie wybierz NOWY NOTATNIK.

new_notebook

Nadaj zeszytowi nazwę, a potem kliknij Ustawienia zaawansowane.

create_notebook

W sekcji Ustawienia zaawansowane włącz funkcję wyłączania bezczynności i ustaw liczbę minut na 60. Oznacza to, że notebook automatycznie się wyłączy, gdy nie będzie używany, dzięki czemu nie poniesiesz niepotrzebnych kosztów.

idle_timeout

Krok 4. Otwórz notatnik

Po utworzeniu instancji kliknij Otwórz JupyterLab.

open_jupyterlab

Krok 5. Uwierzytelnienie (tylko przy pierwszym logowaniu)

Gdy po raz pierwszy użyjesz nowego wystąpienia, zostaniesz poproszony o uwierzytelnienie. Aby to zrobić, wykonaj czynności wyświetlane w interfejsie.

uwierzytelnij

Krok 6. Wybierz odpowiednie jądro

Zarządzane notatniki mają wiele jąder w jednym interfejsie użytkownika. Wybierz jądro Tensorflow 2 (lokalne).

tensorflow_kernel

5. Pierwsze kroki konfiguracji w notatniku

Zanim utworzysz przepływ danych, musisz wykonać kilka dodatkowych czynności, aby skonfigurować środowisko w notatniku. Te kroki obejmują: instalowanie dodatkowych pakietów, ustawianie zmiennych, tworzenie zasobnika Cloud Storage, kopiowanie zbioru danych o grach z publicznego zasobnika Cloud Storage oraz importowanie bibliotek i definiowanie dodatkowych stałych.

Krok 1. Zainstaluj dodatkowe pakiety

Musimy zainstalować dodatkowe zależności pakietu, które nie są obecnie zainstalowane w środowisku notebooka. Przykład obejmuje pakiet KFP SDK.

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

Następnie uruchom ponownie jądro notatnika, aby móc używać pobranych pakietów w notatniku.

# 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)

Krok 2: ustaw zmienne

Chcemy określić PROJECT_ID. Jeśli nie znasz wartości Project_ID, możesz ją uzyskać za pomocą gcloud.PROJECT_ID

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)

W przeciwnym razie ustaw tutaj PROJECT_ID.

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

Musimy też ustawić zmienną REGION, która jest używana w pozostałych częściach tego notatnika. Poniżej znajdują się regiony obsługiwane przez Vertex AI. Zalecamy wybranie regionu, który znajduje się najbliżej Ciebie.

  • Ameryka: us-central1
  • Europa: europe-west4
  • Azja i Pacyfik: asia-east1

Nie używaj zasobnika z wieloma regionami do trenowania w Vertex AI. Nie wszystkie regiony obsługują wszystkie usługi Vertex AI. Dowiedz się więcej o regionach Vertex AI.

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

Na koniec ustawimy zmienną TIMESTAMP. Te zmienne służą do unikania konfliktów nazw między użytkownikami w przypadku utworzonych zasobów. Utwórz TIMESTAMP dla każdej sesji instancji i dodaj ją do nazwy zasobów utworzonych w tym samouczku.

#set timestamp to avoid collisions between multiple users

from datetime import datetime

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

Krok 3. Utwórz zasobnik Cloud Storage

Musisz określić i wykorzystać zasobnik przejściowy Cloud Storage. Zasobnik tymczasowy to miejsce, w którym przechowywane są wszystkie dane powiązane ze zbiorem danych i zasobami modelu w różnych sesjach.

Poniżej ustaw nazwę zasobnika Cloud Storage. Nazwy zasobników muszą być globalnie unikalne we wszystkich projektach Google Cloud, w tym tych spoza Twojej organizacji.

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

Jeśli zasobnik jeszcze nie istnieje, możesz uruchomić tę komórkę, aby go utworzyć.

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

Następnie możesz zweryfikować dostęp do zasobnika Cloud Storage, uruchamiając tę komórkę.

#verify access 
! gsutil ls -al $BUCKET_URI

Krok 4. Skopiuj nasz zbiór danych o grach

Jak już wspomnieliśmy, wykorzystasz popularny zbiór danych o grach, pochodzący z uwielbianej gry wideo FIFA firmy EA Sports. Wykonaliśmy wstępną obróbkę danych, więc wystarczy skopiować zbiory danych z publicznego zasobnika pamięci masowej i przesunąć je do utworzonego przez Ciebie zasobnika.

# 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

Krok 5. Zaimportuj biblioteki i zdefiniuj dodatkowe stałe

Następnie chcemy zaimportować nasze biblioteki dla Vertex AI, KFP itd.

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

Zdefiniowane zostaną też dodatkowe stałe, do których będziemy się odwoływać w pozostałej części notatnika, takie jak ścieżki plików do danych treningowych.

#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. Zbudujmy potok

Teraz zabawa może się zacząć – możemy zacząć korzystać z Vertex AI do tworzenia naszego potoku szkoleń. Zainicjujemy pakiet SDK Vertex AI, skonfigurujemy zadanie treningowe jako komponent potoku, skompilujemy potok, prześlesz uruchomienia potoku i wykorzystamy pakiet SDK Vertex AI do wyświetlania eksperymentów i monitorowania ich stanu.

Krok 1. Zainicjuj pakiet Vertex AI SDK

Zainicjuj pakiet Vertex AI SDK, ustawiając parametry PROJECT_IDBUCKET_URI.

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

Krok 2. Skonfiguruj zadanie treningowe jako element potoku

Aby rozpocząć eksperymenty, musimy określić zadanie treningowe jako element potoku. Nasz potok będzie przyjmować dane do trenowania i parametry (np. DROPOUT_RATE, LEARNING_RATE, EPOCHS) jako dane wejściowe i dane wyjściowe modelu (np. MAERMSE) oraz artefakt modelu.

@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

Krok 3. Tworzenie rurociągu

Teraz skonfigurujemy przepływ pracy za pomocą usługi Domain Specific Language (DSL) dostępnej w KFP i skompilujemy nasz potok do pliku 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")

Krok 4. Prześlij uruchomienia potoku

Najtrudniejsze już za nami: skonfigurowaliśmy komponent i określiliśmy przepływ pracy. Jesteśmy gotowi do przesłania różnych uruchomień potoku, które określiliśmy powyżej. Aby to zrobić, musimy zdefiniować wartości różnych hiperparametrów w ten sposób:

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},
]

Po zdefiniowaniu hiperparametrów możemy użyć for loop, aby podawać dane do różnych przebiegów potoku danych:

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)

Krok 5. Użyj pakietu Vertex AI SDK, aby wyświetlić eksperymenty

Pakiet Vertex AI SDK umożliwia monitorowanie stanu uruchomień potoku. Możesz też użyć go do zwrócenia parametrów i danych uruchomień potoku w eksperymencie Vertex AI. Aby zobaczyć parametry powiązane z Twoimi przebiegami i ich bieżący stan, użyj tego kodu.

# see state/status of all the pipeline runs

vertex_ai.get_experiment_df(EXPERIMENT_NAME)

Aby uzyskać informacje o stanie wykonania ścieżki, możesz użyć kodu poniżej.

#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)

Możesz też wywoływać określone zadania potoku za pomocą interfejsu 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())

Możesz też odświeżać stany przebiegów w określonych odstępach czasu (np. co 60 sekund), aby zobaczyć, jak stany zmieniają się z RUNNING na FAILED lub COMPLETE.

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

7. Wybierz najskuteczniejszy bieg

Świetnie, mamy już wyniki działania potoku. Możesz się zastanawiać, czego możesz się dowiedzieć z wyników. Dane wyjściowe z eksperymentów powinny zawierać 5 wierszy, po jednym na każde uruchomienie potoku. Będzie to wyglądać mniej więcej tak:

Ostateczne wyniki – migawka

Zarówno MAE, jak i RMSE są miernikami średniego błędu prognozy modelu, więc w większości przypadków zalecana jest niższa wartość obu wskaźników. Na podstawie danych wyjściowych z Vertex AI Experiments widzimy, że najbardziej udane uruchomienie w przypadku obu wskaźników to ostatnie uruchomienie z wynikiem dropout_rate o wartości 0,001, learning_rate jeśli to 0,001, a łączna liczba epochs to 20. Na podstawie tego eksperymentu te parametry modelu zostaną ostatecznie wykorzystane w produkcji, ponieważ zapewniają najlepszą skuteczność modelu.

To już koniec tego modułu.

🎉 Gratulacje! 🎉

Poznałeś/poznałaś już te sposoby korzystania z Vertex AI:

  • Wytrenuj niestandardowy model Keras do prognozowania ocen graczy (np. regresji)
  • Tworzenie skalowalnych potoków ML za pomocą pakietu Kubeflow Pipelines SDK
  • Utwórz i uruchom 5-etapowy potok, który pozyskuje dane z GCS, skaluje dane, trenuje model, ocenia go i zapisuje z powrotem model powstały w GCS
  • Korzystanie z metadanych Vertex ML do zapisywania artefaktów modelu, takich jak modele i dane dotyczące modelu
  • Korzystaj z eksperymentów Vertex AI, aby porównywać wyniki różnych uruchomień potoku

Więcej informacji o różnych elementach Vertex znajdziesz w dokumentacji.

8. Czyszczenie

Aby uniknąć opłat, zalecamy usunięcie zasobów utworzonych w ramach tego laboratorium.

Krok 1. Zatrzymaj lub usuń instancję Notebooks

Jeśli chcesz nadal korzystać z notatnika utworzonego w tym laboratorium, zalecamy jego wyłączenie, gdy go nie używasz. W interfejsie Notebooków w konsoli Cloud Console wybierz notebook, a następnie wybierz Zatrzymaj. Jeśli chcesz całkowicie usunąć instancję, kliknij Usuń:

Zatrzymaj instancję

Krok 2. Usuń zasobnik Cloud Storage

Aby usunąć zasobnik Cloud Storage, w menu nawigacyjnym konsoli Cloud przejdź do usługi Storage, wybierz zasobnik i kliknij Usuń:

Usuwanie miejsca na dane