Udostępnij za pośrednictwem


Samouczek 3. Włączanie cyklicznej materializacji i wnioskowanie wsadowe

W tej serii samouczków pokazano, jak funkcje bezproblemowo integrują wszystkie fazy cyklu życia uczenia maszynowego: tworzenie prototypów, trenowanie i operacjonalizacja.

W pierwszym samouczku pokazano, jak utworzyć specyfikację zestawu funkcji z przekształceniami niestandardowymi. Następnie pokazano, jak używać tego zestawu funkcji do generowania danych treningowych, włączania materializacji i wykonywania wypełniania. W drugim samouczku pokazano, jak włączyć materializację i wykonać wypełnienie. Pokazano również, jak eksperymentować z funkcjami, jako sposób na poprawę wydajności modelu.

W tym samouczku wyjaśniono:

  • Włącz rekursyjną materializację dla transactions zestawu funkcji.
  • Uruchom potok wnioskowania wsadowego w zarejestrowanym modelu.

Wymagania wstępne

Przed kontynuowaniem pracy z tym samouczkiem pamiętaj, aby ukończyć pierwsze i drugie samouczki z serii.

Konfiguruj

  1. Konfigurowanie notesu platformy Spark usługi Azure Machine Learning.

    Aby uruchomić ten samouczek, możesz utworzyć nowy notes i wykonać instrukcje krok po kroku. Możesz również otworzyć i uruchomić istniejący notes o nazwie 3. Włącz rekursywną materializację i uruchom wnioskowanie wsadowe. Ten notes i wszystkie notesy z tej serii można znaleźć w katalogu featurestore_sample/notebooks . Możesz wybrać sdk_only lub sdk_and_cli. Pozostaw ten samouczek otwarty i zapoznaj się z nim, aby uzyskać linki do dokumentacji i więcej wyjaśnień.

    1. Na liście rozwijanej Obliczenia na górnym pasku nawigacyjnym wybierz pozycję Bezserwerowe obliczenia spark w obszarze Bezserwerowa platforma Spark w usłudze Azure Machine Learning.

    2. Skonfiguruj sesję:

      1. Wybierz pozycję Konfiguruj sesję na górnym pasku stanu.
      2. Wybierz kartę Pakiety języka Python.
      3. Wybierz pozycję Przekaż plik conda.
      4. azureml-examples/sdk/python/featurestore-sample/project/env/online.yml Wybierz plik z komputera lokalnego.
      5. Opcjonalnie zwiększ limit czasu sesji (czas bezczynności), aby uniknąć częstych ponownych uruchomień wymagań wstępnych.
  2. Uruchom sesję platformy Spark.

    # run this cell to start the spark session (any code block will start the session ). This can take around 10 mins.
    print("start spark session")
  3. Skonfiguruj katalog główny dla przykładów.

    import os
    
    # please update the dir to ./Users/<your_user_alias> (or any custom directory you uploaded the samples to).
    # You can find the name from the directory structure in the left nav
    root_dir = "./Users/<your_user_alias>/featurestore_sample"
    
    if os.path.isdir(root_dir):
        print("The folder exists.")
    else:
        print("The folder does not exist. Please create or fix the path")
  4. Konfigurowanie interfejsu wiersza polecenia.

    Nie dotyczy.


  1. Zainicjuj obszar roboczy projektu CRUD (tworzenie, odczytywanie, aktualizowanie i usuwanie) klienta.

    Notes samouczka jest uruchamiany z bieżącego obszaru roboczego.

    ### Initialize the MLClient of this project workspace
    import os
    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    project_ws_sub_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    project_ws_rg = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    project_ws_name = os.environ["AZUREML_ARM_WORKSPACE_NAME"]
    
    # connect to the project workspace
    ws_client = MLClient(
        AzureMLOnBehalfOfCredential(), project_ws_sub_id, project_ws_rg, project_ws_name
    )
  2. Zainicjuj zmienne magazynu funkcji.

    Aby odzwierciedlić to, co zostało utworzone w pierwszym samouczku, pamiętaj o zaktualizowaniu featurestore_name wartości.

    from azure.ai.ml import MLClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    # feature store
    featurestore_name = (
        "<FEATURESTORE_NAME>"  # use the same name from part #1 of the tutorial
    )
    featurestore_subscription_id = os.environ["AZUREML_ARM_SUBSCRIPTION"]
    featurestore_resource_group_name = os.environ["AZUREML_ARM_RESOURCEGROUP"]
    
    # feature store ml client
    fs_client = MLClient(
        AzureMLOnBehalfOfCredential(),
        featurestore_subscription_id,
        featurestore_resource_group_name,
        featurestore_name,
    )
  3. Inicjowanie klienta zestawu SDK magazynu funkcji.

    # feature store client
    from azureml.featurestore import FeatureStoreClient
    from azure.ai.ml.identity import AzureMLOnBehalfOfCredential
    
    featurestore = FeatureStoreClient(
        credential=AzureMLOnBehalfOfCredential(),
        subscription_id=featurestore_subscription_id,
        resource_group_name=featurestore_resource_group_name,
        name=featurestore_name,
    )

Włącz rekursyjną materializację w zestawie funkcji transakcji

W drugim samouczku włączono materializację i wykonano wypełnianie transactions w zestawie funkcji. Wypełnianie na żądanie to jednorazowa operacja, która oblicza i umieszcza wartości cech w magazynie materializacji.

Aby obsłużyć wnioskowanie modelu w środowisku produkcyjnym, warto skonfigurować zadania rekursywnego materializacji, aby zachować aktualność magazynu materializacji. Te zadania są uruchamiane zgodnie z harmonogramami zdefiniowanymi przez użytkownika. Harmonogram cyklicznych zadań działa w następujący sposób:

  • Wartości interwału i częstotliwości definiują okno. Na przykład następujące wartości definiują trzygodzinne okno:

    • interval = 3
    • frequency = Hour
  • Pierwsze okno rozpoczyna się od wartości zdefiniowanej start_time w RecurrenceTriggerpliku itd.

  • Pierwsze cykliczne zadanie jest przesyłane na początku następnego okna po czasie aktualizacji.

  • Później powtarzane zadania są przesyłane w każdym oknie po pierwszym zadaniu.

Jak wyjaśniono we wcześniejszych samouczkach, po zmaterialieniu danych (wypełnianie lub rekursja materializacja) pobieranie funkcji domyślnie używa zmaterializowanych danych.

from datetime import datetime
from azure.ai.ml.entities import RecurrenceTrigger

transactions_fset_config = fs_client.feature_sets.get(name="transactions", version="1")

# create a schedule that runs the materialization job every 3 hours
transactions_fset_config.materialization_settings.schedule = RecurrenceTrigger(
    interval=3, frequency="Hour", start_time=datetime(2023, 4, 15, 0, 4, 10, 0)
)

fs_poller = fs_client.feature_sets.begin_create_or_update(transactions_fset_config)

print(fs_poller.result())

(Opcjonalnie) Zapisywanie pliku YAML dla zasobu zestawu funkcji

Zaktualizowane ustawienia służą do zapisywania pliku YAML.

## uncomment and run
# transactions_fset_config.dump(root_dir + "/featurestore/featuresets/transactions/featureset_asset_offline_enabled_with_schedule.yaml")

Uruchamianie potoku wnioskowania wsadowego

Wnioskowanie wsadowe zawiera następujące kroki:

  1. Używasz tego samego wbudowanego składnika pobierania funkcji na potrzeby pobierania funkcji używanego w potoku trenowania (omówionego w trzecim samouczku). W przypadku trenowania potoku podano specyfikację pobierania funkcji jako dane wejściowe składnika. W przypadku wnioskowania wsadowego należy przekazać zarejestrowany model jako dane wejściowe. Składnik szuka specyfikacji pobierania funkcji w artefaktie modelu.

    Ponadto w przypadku trenowania dane obserwacji miały zmienną docelową. Jednak dane obserwacji wnioskowania wsadowego nie mają zmiennej docelowej. Krok pobierania funkcji łączy dane obserwacji z funkcjami i generuje dane dla wnioskowania wsadowego.

  2. Potok używa danych wejściowych wnioskowania wsadowego z poprzedniego kroku, uruchamia wnioskowanie w modelu i dołącza przewidywaną wartość jako dane wyjściowe.

    Uwaga

    W tym przykładzie użyto zadania do wnioskowania wsadowego. Możesz również użyć punktów końcowych wsadowych w usłudze Azure Machine Learning.

    from azure.ai.ml import load_job  # will be used later
    
    # set the batch inference  pipeline path
    batch_inference_pipeline_path = (
        root_dir + "/project/fraud_model/pipelines/batch_inference_pipeline.yaml"
    )
    batch_inference_pipeline_definition = load_job(source=batch_inference_pipeline_path)
    
    # run the training pipeline
    batch_inference_pipeline_job = ws_client.jobs.create_or_update(
        batch_inference_pipeline_definition
    )
    
    # stream the run logs
    ws_client.jobs.stream(batch_inference_pipeline_job.name)

Sprawdzanie danych wyjściowych pod kątem wnioskowania wsadowego

W widoku potoku:

  1. Wybierz inference_step na karcie outputs .

  2. Data Skopiuj wartość pola. Wygląda to mniej więcej tak: azureml_995abbc2-3171-461e-8214-c3c5d17ede83_output_data_data_with_prediction:1.

  3. Data Wklej wartość pola w poniższej komórce z oddzielnymi wartościami nazwy i wersji. Ostatnim znakiem jest wersja poprzedzona dwukropkiem (:).

  4. Zwróć uwagę na kolumnę predict_is_fraud wygenerowaną przez potok wnioskowania wsadowego.

    W potoku wnioskowania wsadowego (/project/fraud_mode/pipelines/batch_inference_pipeline.yaml) system utworzył nieśledzony zasób danych z identyfikatorem GUID jako wartością nazwy i 1 wartością wersji. Stało się tak, ponieważ nie zostały podane name wartości lub version dla outputs elementu inference_step. W tej komórce utworzysz źródło danych, a następnie wyświetlisz ścieżkę danych z zasobu.

    inf_data_output = ws_client.data.get(
        name="azureml_1c106662-aa5e-4354-b5f9-57c1b0fdb3a7_output_data_data_with_prediction",
        version="1",
    )
    inf_output_df = spark.read.parquet(inf_data_output.path + "data/*.parquet")
    display(inf_output_df.head(5))

Czyszczenie

Piąty samouczek z serii opisuje sposób usuwania zasobów.

Następne kroki