Używanie metadanych Vertex ML z potokami

1. Omówienie

W tym laboratorium dowiesz się, jak analizować metadane z uruchomień Vertex Pipelines za pomocą metadanych Vertex ML.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Użyj pakietu Kubeflow Pipelines SDK, aby utworzyć potok ML, który tworzy zbiór danych w Vertex AI, a następnie trenuje i wdraża na nim niestandardowy model Scikit-learn.
  • pisać niestandardowe komponenty potoku, które generują artefakty i metadane;
  • Porównywanie przebiegów Vertex Pipelines w konsoli Cloud i programowo
  • Śledzenie pochodzenia artefaktów wygenerowanych przez potok
  • Wykonywanie zapytań dotyczących metadanych uruchomienia potoku

Łączny koszt wykonania tego ćwiczenia w Google Cloud wynosi około 2 USD.

2. Wprowadzenie do Vertex AI

Ten moduł wykorzystuje najnowszą ofertę usług AI dostępną w Google Cloud. Vertex AI integruje rozwiązania ML w Google Cloud, zapewniają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.

Oprócz usług trenowania i wdrażania modeli Vertex AI obejmuje też wiele produktów MLOps, takich jak Vertex Pipelines, ML Metadata, Model Monitoring, Feature Store i inne. Wszystkie oferty usług Vertex AI możesz zobaczyć na schemacie poniżej.

Omówienie usługi Vertex

Ten moduł dotyczy Vertex Pipelinesmetadanych Vertex ML.

Jeśli chcesz podzielić się opinią na temat Vertex AI, odwiedź stronę pomocy.

Dlaczego potoki ML są przydatne?

Zanim przejdziemy do szczegółów, wyjaśnijmy, dlaczego warto używać potoku. Wyobraź sobie, że tworzysz przepływ pracy systemu uczącego się, który obejmuje przetwarzanie danych, trenowanie modelu, dostrajanie hiperparametrów, ocenę i wdrażanie modelu. Każdy z tych kroków może mieć różne zależności, które mogą stać się niepraktyczne, jeśli będziesz traktować cały proces jako monolit. Gdy zaczniesz wdrażać proces uczenia maszynowego na większą skalę, możesz udostępnić przepływ pracy związanej z uczeniem maszynowym innym członkom zespołu, aby mogli go uruchomić i wnosić poprawki do kodu. Bez niezawodnego, powtarzalnego procesu może to być trudne. W przypadku rurociągów każdy krok w procesie uczenia maszynowego jest oddzielnym kontenerem. Dzięki temu możesz opracowywać kroki niezależnie od siebie i śledzić dane wejściowe i wyjściowe z każdego kroku w powtarzalny sposób. Możesz też planować lub aktywować uruchomienia potoku na podstawie innych zdarzeń w środowisku Cloud, takich jak uruchamianie uruchomienia potoku po udostępnieniu nowych danych do trenowania.

Podsumowanie: potoki pomagają automatyzować i odtwarzać przepływ pracy związany z systemami uczącymi się.

3. Konfigurowanie środowiska w chmurze

Aby uruchomić to ćwiczenie, musisz mieć projekt Google Cloud Platform z włączonym rozliczeniem. Aby utworzyć projekt, postępuj zgodnie z tymi instrukcjami.

Uruchamianie Cloud Shell

W tym module będziesz pracować w sesji Cloud Shell, czyli w interpreterze poleceń hostowanym przez maszynę wirtualną działającą w chmurze Google. Możesz też uruchomić tę sekcję lokalnie na swoim komputerze, ale korzystanie z Cloud Shell daje wszystkim dostęp do powtarzalnego środowiska w spójnym środowisku. Po ukończeniu modułu możesz powtórzyć tę sekcję na swoim komputerze.

Autoryzowanie Cloud Shell

Aktywowanie Cloud Shell

W prawym górnym rogu konsoli Cloud Console kliknij przycisk poniżej, aby aktywować Cloud Shell:

Aktywowanie Cloud Shell

Jeśli nigdy wcześniej nie korzystałeś(-aś) z Cloud Shell, zobaczysz ekran pośredni (poniżej zgięcia), który wyjaśnia, czym jest to środowisko. W takim przypadku kliknij Dalej (nie zobaczysz go już więcej). Oto jak wygląda ekran jednorazowy:

Konfiguracja Cloud Shell

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

Inicjowanie Cloud Shell

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia programistyczne. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie poprawia wydajność sieci i uwierzytelnianie. Większość, jeśli nie wszystkie, czynności w tym CodeLab możesz wykonać w przeglądarce lub na Chromebooku.

Po połączeniu z Cloud Shell powinieneś zobaczyć, że jesteś już uwierzytelniony i że projekt jest już ustawiony na identyfikator Twojego projektu.

Aby potwierdzić uwierzytelnianie, uruchom w Cloud Shell to polecenie:

gcloud auth list

Dane wyjściowe polecenia

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Aby sprawdzić, czy polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:

gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz ustawić je za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

Cloud Shell ma kilka zmiennych środowiskowych, w tym GOOGLE_CLOUD_PROJECT, która zawiera nazwę naszego bieżącego projektu Cloud. Będziemy go używać w różnych miejscach w tym module. Możesz go sprawdzić, uruchamiając polecenie:

echo $GOOGLE_CLOUD_PROJECT

Włącz interfejsy API

W kolejnych krokach dowiesz się, gdzie i po co są potrzebne te usługi. Na razie uruchom to polecenie, aby przyznać swojemu projektowi dostęp do usług Compute Engine, Container Registry i Vertex AI:

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

Powinien wyświetlić się komunikat o udanym przeprowadzeniu operacji podobny do tego:

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

Tworzenie zasobnika Cloud Storage

Aby uruchomić zadanie trenowania w Vertex AI, potrzebujemy zasobnika Cloud Storage do przechowywania zapisanych komponentów modelu. Zasobnik musi być regionalny. Tutaj używamy regionu us-central, ale możesz użyć innego (wystarczy go zastąpić w tym laboratorium). Jeśli masz już taki folder, możesz pominąć ten krok.

Aby utworzyć zasobnik, uruchom te polecenia w terminalu Cloud Shell:

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

Następnie przyznamy temu kontu usługi obliczeniowej dostęp do tego zasobnika. Dzięki temu usługa Vertex Pipelines będzie mieć wymagane uprawnienia do zapisywania plików w tym zasobniku. Aby dodać to uprawnienie, uruchom to polecenie:

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

Utwórz instancję Vertex AI Workbench

W konsoli Cloud w sekcji Vertex AI kliknij Workbench:

Menu Vertex AI

W sekcji notatników zarządzanych przez użytkownika kliknij Nowy notatnik:

Tworzenie nowego notatnika

Następnie wybierz typ instancji TensorFlow Enterprise 2.3 (z LTS) bez procesorów graficznych:

Instancja TFE

Użyj domyślnych opcji i kliknij Utwórz.

Otwieranie notatnika

Po utworzeniu instancji kliknij Otwórz JupyterLab:

Otwórz notatnik

4. Konfiguracja Vertex Pipelines

Istnieje kilka dodatkowych bibliotek, które musimy zainstalować, aby używać Vertex Pipelines:

  • Kubeflow Pipelines: pakiet SDK, którego użyjemy do tworzenia potoku. Vertex Pipelines obsługuje uruchomione potoki utworzone za pomocą zarówno Kubeflow Pipelines, jak i TFX.
  • Vertex AI SDK: ten pakiet SDK optymalizuje działanie wywołań interfejsu Vertex AI API. Użyjemy go do uruchomienia potoku w Vertex AI.

Tworzenie notatnika w Pythonie i instalowanie bibliotek

Najpierw w menu Menu z aplikacjami w instancji notatnika utwórz notatnik, wybierając Python 3:

Utwórz notatnik w Pythonie3

Aby zainstalować obie usługi, których użyjemy w tym laboratorium, najpierw ustaw flagę użytkownika w komórce notebooka:

USER_FLAG = "--user"

Następnie w notatniku wykonaj te czynności:

!pip3 install {USER_FLAG} google-cloud-aiplatform==1.7.0
!pip3 install {USER_FLAG} kfp==1.8.9

Po zainstalowaniu tych pakietów musisz ponownie uruchomić jądro:

import os

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

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

Następnie sprawdź, czy wersja pakietu SDK KFP jest prawidłowo zainstalowana. Powinien on wynosić >1,8:

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

Następnie sprawdź, czy wersja pakietu SDK Vertex AI jest większa niż 1.6.2:

!pip list | grep aiplatform

Ustaw identyfikator projektu i zasobnik

W tym laboratorium będziesz używać identyfikatora projektu Cloud i utworzonego wcześniej zasobnika. Następnie utworzymy dla nich zmienne.

Jeśli nie znasz identyfikatora projektu, możesz go uzyskać, wykonując te czynności:

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 je tutaj:

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

Następnie utwórz zmienną przechowującą nazwę zasobnika. Jeśli utworzysz go w tym module, wykonaj te czynności. W przeciwnym razie musisz ustawić je ręcznie:

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

Importuj biblioteki

Dodaj ten kod, aby zaimportować biblioteki, których będziemy używać w tym ćwiczeniu z programowania:

import matplotlib.pyplot as plt
import pandas as pd

from kfp.v2 import compiler, dsl
from kfp.v2.dsl import pipeline, component, Artifact, Dataset, Input, Metrics, Model, Output, InputPath, OutputPath

from google.cloud import aiplatform

# We'll use this namespace for metadata querying
from google.cloud import aiplatform_v1

Definiowanie stałych

Ostatnią rzeczą, którą musimy zrobić przed utworzeniem potoku, jest zdefiniowanie stałych zmiennych. PIPELINE_ROOT to ścieżka do Cloud Storage, na której będą zapisywane artefakty utworzone przez nasz potok. Tutaj używamy regionu us-central1, ale jeśli podczas tworzenia zasobnika został użyty inny region, zaktualizuj zmienną REGION w poniższym kodzie:

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

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

Po uruchomieniu powyższego kodu powinien zostać wydrukowany katalog główny potoku. To jest lokalizacja w Cloud Storage, w której będą zapisywane artefakty z Twojego potoku. Numer ten ma format gs://YOUR-BUCKET-NAME/pipeline_root/.

5. Tworzenie potoku 3-etapowego z komponentami niestandardowymi

W tym laboratorium skupiamy się na metadanych z wyników działania potoku. Aby to zrobić, musimy uruchomić potok w usłudze Vertex Pipelines, od której zaczniemy. Zdefiniujemy tutaj 3-etapowy potok z tymi komponentami niestandardowymi:

  • get_dataframe: pobiera dane z tabeli BigQuery i przekształca je w platformę DataFrame biblioteki Pandas
  • train_sklearn_model: użyj DataFrame w Pandas, aby trenować i eksportować model Scikit Learn wraz z niektórymi danymi
  • deploy_model: wdrażanie wyeksportowanego modelu Scikit Learn w punkcie końcowym w Vertex AI

W tym potoku użyjemy zbioru danych „Dry beans” z platformy UCI Machine Learning, który pochodzi z artykułu KOKLU, M. i OZKAN, I.A., (2020), „Multiclass Classification of Dry Beans Using Computer Vision and Machine Learning Techniques” [Wieloklasowa klasyfikacja fasoli przy użyciu technik rozpoznawania obrazów i uczenia maszynowego], „In Computers and Electronics in Agriculture”, 174, 105507. DOI.

Jest to zbiór danych tabelarycznych, którego użyjemy w naszej ścieżce do trenowania, oceny i wdrażania modelu Scikit-learn, który na podstawie cech klasyfikuje ziarna do jednej z 7 grup. Zacznijmy kodować.

Tworzenie komponentów na podstawie funkcji Pythona

Za pomocą pakietu SDK KFP możemy tworzyć komponenty oparte na funkcjach w Pythonie. Użyjemy go w przypadku 3 komponentów w tym potoku.

Pobieranie danych z BigQuery i konwertowanie ich na format CSV

Najpierw utworzymy komponent get_dataframe:

@component(
    packages_to_install=["google-cloud-bigquery", "pandas", "pyarrow", "db-dtypes"],
    base_image="python:3.9",
    output_component_file="create_dataset.yaml"
)
def get_dataframe(
    bq_table: str,
    output_data_path: OutputPath("Dataset")
):
    from google.cloud import bigquery
    import pandas as pd
    import os

    project_number = os.environ["CLOUD_ML_PROJECT_ID"]
    bqclient = bigquery.Client(project=project_number)
    table = bigquery.TableReference.from_string(
        bq_table
    )
    rows = bqclient.list_rows(
        table
    )
    dataframe = rows.to_dataframe(
        create_bqstorage_client=True,
    )
    dataframe = dataframe.sample(frac=1, random_state=2)
    dataframe.to_csv(output_data_path)

Przyjrzyjmy się bliżej temu, co dzieje się w tym komponencie:

  • Dekorator @component kompiluje tę funkcję do komponentu podczas wykonywania potoku. Używasz go za każdym razem, gdy piszesz niestandardowy komponent.
  • Parametr base_image określa obraz kontenera, którego będzie używać ten komponent.
  • Ten komponent będzie używać kilku bibliotek Pythona, które określamy za pomocą parametru packages_to_install.
  • Parametr output_component_file jest opcjonalny i określa plik YAML, do którego ma zostać zapisany skompilowany komponent. Po uruchomieniu komórki plik powinien zostać zapisany w notatniku. Jeśli chcesz udostępnić ten komponent innej osobie, możesz wysłać wygenerowany plik yaml i poprosić o jego załadowanie:
# This is optional, it shows how to load a component from a yaml file
# dataset_component = kfp.components.load_component_from_file('./create_dataset.yaml')
  • Następnie komponent używa biblioteki klienta BigQuery w języku Python, aby pobrać dane z BigQuery do ramki DataFrame Pandas, a potem tworzy artefakt wyjściowy tych danych w pliku CSV. Zostanie ono przekazane jako dane wejściowe do następnego komponentu.

Utwórz komponent do trenowania modelu Scikit-learn

W tym komponencie użyjemy wygenerowanego wcześniej pliku CSV do wytrenowania modelu drzewa decyzyjnego w Scikit-learn. Ten komponent eksportuje uzyskany model Scikit wraz z elementem Metrics, który zawiera dokładność modelu, framework i rozmiar zbioru danych użytego do jego wytrenowania:

@component(
    packages_to_install=["sklearn", "pandas", "joblib", "db-dtypes"],
    base_image="python:3.9",
    output_component_file="beans_model_component.yaml",
)
def sklearn_train(
    dataset: Input[Dataset],
    metrics: Output[Metrics],
    model: Output[Model]
):
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import roc_curve
    from sklearn.model_selection import train_test_split
    from joblib import dump

    import pandas as pd
    df = pd.read_csv(dataset.path)
    labels = df.pop("Class").tolist()
    data = df.values.tolist()
    x_train, x_test, y_train, y_test = train_test_split(data, labels)

    skmodel = DecisionTreeClassifier()
    skmodel.fit(x_train,y_train)
    score = skmodel.score(x_test,y_test)
    print('accuracy is:',score)

    metrics.log_metric("accuracy",(score * 100.0))
    metrics.log_metric("framework", "Scikit Learn")
    metrics.log_metric("dataset_size", len(df))
    dump(skmodel, model.path + ".joblib")

Zdefiniuj komponent, aby przesłać i wdrożyć model w Vertex AI

Na koniec nasz ostatni komponent pobierze wytrenowany model z poprzedniego kroku, prześle go do Vertex AI i wdroży w punkcie końcowym:

@component(
    packages_to_install=["google-cloud-aiplatform"],
    base_image="python:3.9",
    output_component_file="beans_deploy_component.yaml",
)
def deploy_model(
    model: Input[Model],
    project: str,
    region: str,
    vertex_endpoint: Output[Artifact],
    vertex_model: Output[Model]
):
    from google.cloud import aiplatform

    aiplatform.init(project=project, location=region)

    deployed_model = aiplatform.Model.upload(
        display_name="beans-model-pipeline",
        artifact_uri = model.uri.replace("model", ""),
        serving_container_image_uri="us-docker.pkg.dev/vertex-ai/prediction/sklearn-cpu.0-24:latest"
    )
    endpoint = deployed_model.deploy(machine_type="n1-standard-4")

    # Save data to the output params
    vertex_endpoint.uri = endpoint.resource_name
    vertex_model.uri = deployed_model.resource_name

W tym przykładzie używamy pakietu SDK Vertex AI, aby przesłać model za pomocą gotowego kontenera do prognozowania. Następnie wdraża model w punkcie końcowym i zwraca identyfikatory URI do zasobów modelu oraz punktu końcowego. W dalszej części tego ćwiczenia dowiesz się, co oznacza zwracanie tych danych jako artefaktów.

Definiowanie i kompilowanie potoku

Po zdefiniowaniu tych 3 komponentów utworzymy definicję potoku. Opisuje to przepływ artefaktów danych wejściowych i wyjściowych między krokami:

@pipeline(
    # Default pipeline root. You can override it when submitting the pipeline.
    pipeline_root=PIPELINE_ROOT,
    # A name for the pipeline.
    name="mlmd-pipeline",
)
def pipeline(
    bq_table: str = "",
    output_data_path: str = "data.csv",
    project: str = PROJECT_ID,
    region: str = REGION
):
    dataset_task = get_dataframe(bq_table)

    model_task = sklearn_train(
        dataset_task.output
    )

    deploy_task = deploy_model(
        model=model_task.outputs["model"],
        project=project,
        region=region
    )

W ten sposób wygenerujesz plik JSON, którego użyjesz do uruchomienia potoku:

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

Uruchom 2 uruchomienia potoku

Następnie uruchomimy 2 uruchomienia naszego potoku. Najpierw określmy sygnaturę czasową, której będziemy używać w przypadku identyfikatorów zadań w ścieżce:

from datetime import datetime

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

Pamiętaj, że nasz potok wymaga jednego parametru podczas uruchamiania: bq_table, którego chcemy użyć do danych treningowych. Ten przebieg potoku będzie używać mniejszej wersji zbioru danych o fasoli:

run1 = aiplatform.PipelineJob(
    display_name="mlmd-pipeline",
    template_path="mlmd_pipeline.json",
    job_id="mlmd-pipeline-small-{0}".format(TIMESTAMP),
    parameter_values={"bq_table": "sara-vertex-demos.beans_demo.small_dataset"},
    enable_caching=True,
)

Następnie utwórz kolejną wersję potoku, używając większej wersji tego samego zbioru danych.

run2 = aiplatform.PipelineJob(
    display_name="mlmd-pipeline",
    template_path="mlmd_pipeline.json",
    job_id="mlmd-pipeline-large-{0}".format(TIMESTAMP),
    parameter_values={"bq_table": "sara-vertex-demos.beans_demo.large_dataset"},
    enable_caching=True,
)

Na koniec uruchom wykonanie potoku w przypadku obu uruchomień. Najlepiej zrobić to w 2 oddzielnych komórkach notebooka, aby można było zobaczyć wynik po każdym uruchomieniu.

run1.submit()

Następnie uruchom drugą próbę:

run2.submit()

Po wykonaniu tej komórki zobaczysz link do wyświetlenia poszczególnych przepływów danych w konsoli Vertex AI. Kliknij ten link, aby wyświetlić więcej informacji o potoku:

Adres URL uruchomienia potoku

Gdy się zakończy (na uruchomienie tego potoku zajmuje około 10–15 minut), zobaczysz coś takiego:

Ukończono potok sklearn

Masz już 2 zakończone uruchomienia potoku, możesz więc przyjrzeć się bliżej artefaktom potoku, wskaźnikom i historii danych.

6. Informacje o artefaktach i pochodzeniu w ścieżce

Na wykresie ścieżki zobaczysz małe pola po każdym kroku. Są to elementy lub dane wyjściowe wygenerowane na podstawie kroku potoku. Istnieje wiele rodzajów artefaktów. W tym potoku mamy artefakty zbioru danych, wskaźników, modelu i punktu końcowego. Kliknij suwak Rozwiń artefakty u góry interfejsu, aby zobaczyć więcej informacji o każdym z nich:

Rozwijanie artefaktów

Kliknięcie artefaktu spowoduje wyświetlenie dodatkowych informacji na jego temat, w tym jego identyfikatora URI. Jeśli na przykład klikniesz artefakt vertex_endpoint, zobaczysz identyfikator URI, pod którym w konsoli Vertex AI znajdziesz wdrożony punkt końcowy:

Szczegóły artefaktu punktu końcowego

Element Metrics umożliwia przekazywanie danych niestandardowych powiązanych z konkretnym krokiem potoku. W komponencie sklearn_train naszego potoku danych zapisaliśmy dane o dokładności modelu, frameworku i rozmiarze zbioru danych. Kliknij artefakt danych, aby wyświetlić te szczegóły:

Dane modelu

Każdy artefakt ma rodowód, który opisuje inne powiązane z nim artefakty. Ponownie kliknij artefakt vertex_endpoint w pipeline, a potem kliknij przycisk Wyświetl pochodzenie:

Pokaż historię danych

Otworzy się nowa karta, na której zobaczysz wszystkie artefakty powiązane z wybranym artefaktem. Twój wykres pokrewieństwa będzie wyglądał mniej więcej tak:

Wykres z historią danych punktu końcowego

Spowoduje to wyświetlenie modelu, wskaźników i zbioru danych powiązanego z tym punktem końcowym. Dlaczego to jest przydatne? Być może masz model wdrożony w wielu punktach końcowych lub potrzebujesz informacji o konkretnym zbiorze danych używanym do trenowania modelu wdrożonego w punkcie końcowym, który oglądasz. Wykres historii danych pomaga zrozumieć każdy artefakt w kontekście reszty systemu ML. Dostęp do informacji o pochodzeniu możesz też uzyskać programowo, co zobaczysz w późniejszej części tego ćwiczenia.

7. Porównywanie uruchomień potoku

Jest duża szansa, że ten sam potok będzie uruchamiany wiele razy, z różnymi parametrami wejściowymi lub nowymi danymi albo przez osoby z Twojego zespołu. Aby móc śledzić przebiegi, warto mieć możliwość ich porównywania na podstawie różnych danych. W tej sekcji omówimy 2 sposoby porównywania uruchomień.

Porównywanie uruchomień w interfejsie Pipelines

W konsoli Cloud przejdź do panelu potoków. Znajdziesz tu przegląd wszystkich uruchomionych procesów. Sprawdź ostatnie 2 wyniki, a potem u góry kliknij przycisk Porównaj:

Porównaj uruchomienia

Otworzy się strona, na której możemy porównać parametry wejściowe i dane dotyczące każdego wybranego przebiegu. W przypadku tych 2 wykonań zwróć uwagę na różne tabele BigQuery, rozmiary zbiorów danych i wartości dokładności:

Dane porównawcze

Za pomocą tej funkcji interfejsu możesz porównywać więcej niż 2 uruchomienia, a nawet uruchomienia z różnych ścieżek.

Porównanie uruchomień z pakietem SDK Vertex AI

W przypadku wielu wykonań potoków może Ci się przydać możliwość zautomatyzowanego dostarczania tych danych do porównania, co pozwoli Ci dokładniej analizować szczegóły wskaźników i tworzyć wizualizacje.

Aby uzyskać dostęp do metadanych przebiegu, możesz użyć metody aiplatform.get_pipeline_df(). W tym przypadku pobieramy metadane z 2 ostatnich uruchomień tego samego potoku i wczytujemy je do struktury DataFrame biblioteki Pandas. Parametr pipeline odnosi się tutaj do nazwy naszego potoku w definicji potoku:

df = aiplatform.get_pipeline_df(pipeline="mlmd-pipeline")
df

Po wydrukowaniu DataFrame zobaczysz coś takiego:

DataFrame z danymi o potoku

Tutaj przeprowadziliśmy przetwarzanie tylko 2 razy, ale możesz sobie wyobrazić, ile wskaźników uzyskasz przy większej liczbie uruchomień. Następnie utworzymy niestandardową wizualizację za pomocą matplotlib, aby zobaczyć zależność między dokładnością modelu a ilością danych użytych do trenowania.

Uruchom to polecenie w nowej komórce notatnika:

plt.plot(df["metric.dataset_size"], df["metric.accuracy"],label="Accuracy")
plt.title("Accuracy and dataset size")
plt.legend(loc=4)
plt.show()

Powinien pojawić się ekran podobny do tego:

Wykres metadanych Matplotlib

8. Wysyłanie zapytań o dane dotyczące potoku

Oprócz uzyskiwania DataFrame wszystkich danych dotyczących potoku możesz też programowo wysyłać zapytania do artefaktów utworzonych w systemie ML. Następnie możesz utworzyć panel niestandardowy lub pozwolić innym osobom w organizacji na uzyskanie szczegółowych informacji o konkretnych artefaktach.

Pobieranie wszystkich artefaktów modelu

Aby umożliwić wykonywanie zapytań o artefakty w ten sposób, utworzymy MetadataServiceClient:

API_ENDPOINT = "{}-aiplatform.googleapis.com".format(REGION)
metadata_client = aiplatform_v1.MetadataServiceClient(
  client_options={
      "api_endpoint": API_ENDPOINT
  }
)

Następnie wyślemy do tego punktu końcowego żądanie list_artifacts i przekażemy filtr wskazujący, które artefakty powinny znaleźć się w odpowiedzi. Najpierw pobierz wszystkie elementy w projekcie, które są modelami. Aby to zrobić, uruchom w notatniku ten kod:

MODEL_FILTER="schema_title = \"system.Model\""
artifact_request = aiplatform_v1.ListArtifactsRequest(
    parent="projects/{0}/locations/{1}/metadataStores/default".format(PROJECT_ID, REGION),
    filter=MODEL_FILTER
)
model_artifacts = metadata_client.list_artifacts(artifact_request)

Wynikowa odpowiedź model_artifacts zawiera obiekt iteracyjny dla każdego artefaktu modelu w projekcie wraz z powiązanymi metadanymi każdego modelu.

Filtrowanie obiektów i wyświetlanie ich w DataFrame

Byłoby przydatne, gdybyśmy mogli łatwiej zwizualizować powstałe zapytanie dotyczące artefaktu. Następnie pobierz wszystkie elementy utworzone po 10 sierpnia 2021 r., które mają stan LIVE. Po wykonaniu tego zapytania wyświetlimy wyniki w ramach struktury DataFrame biblioteki Pandas. Najpierw wykonaj żądanie:

LIVE_FILTER = "create_time > \"2021-08-10T00:00:00-00:00\" AND state = LIVE"
artifact_req = {
    "parent": "projects/{0}/locations/{1}/metadataStores/default".format(PROJECT_ID, REGION),
    "filter": LIVE_FILTER
}
live_artifacts = metadata_client.list_artifacts(artifact_req)

Następnie wyświetl wyniki w DataFrame:

data = {'uri': [], 'createTime': [], 'type': []}

for i in live_artifacts:
    data['uri'].append(i.uri)
    data['createTime'].append(i.create_time)
    data['type'].append(i.schema_title)

df = pd.DataFrame.from_dict(data)
df

Zobaczysz menu podobne do tego:

Przefiltrowana tabela danych artefaktu

Oprócz tego, co próbowałeś/próbowałaś tutaj, możesz też filtrować artefakty według innych kryteriów.

Moduł ukończony.

🎉 Gratulacje! 🎉

Wiesz już, jak używać Vertex AI do:

  • Użyj pakietu Kubeflow Pipelines SDK, aby utworzyć potok ML, który tworzy zbiór danych w Vertex AI, a następnie trenuje i wdraża na nim niestandardowy model Scikit-learn.
  • pisać niestandardowe komponenty potoku, które generują artefakty i metadane;
  • Porównywanie przebiegów Vertex Pipelines w konsoli Cloud i programowo
  • Śledzenie pochodzenia artefaktów wygenerowanych przez potok
  • Wykonywanie zapytań dotyczących metadanych uruchomienia potoku

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

9. Czyszczenie

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

Zatrzymanie lub usunięcie instancji aplikacji 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ę

Usuwanie punktów końcowych Vertex AI

Aby usunąć wdrożony punkt końcowy, otwórz sekcję Punkty końcowe w konsoli Vertex AI i kliknij ikonę usuwania:

Usuń punkt końcowy

Usuwanie zasobnika 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