Condividi tramite


Esercitazione 3: Abilitare la materializzazione ricorrente ed eseguire l'inferenza batch

Questa serie di esercitazioni illustra come le funzionalità integrano perfettamente tutte le fasi del ciclo di vita di apprendimento automatico: prototipazione, training e operazionalizzazione.

La prima esercitazione ha illustrato come creare una specifica del set di funzionalità con trasformazioni personalizzate. Ha quindi illustrato come usare tale set di funzionalità per generare dati di training, abilitare la materializzazione ed eseguire un backfill. La seconda esercitazione ha illustrato come abilitare la materializzazione ed eseguire un backfill. Ha anche illustrato anche come sperimentare con le funzionalità, come metodo per migliorare le prestazioni del modello.

In questa esercitazione viene illustrato come:

  • Abilitare la materializzazione ricorrente per il set di funzionalità transactions.
  • Eseguire una pipeline di inferenza batch nel modello registrato.

Prerequisiti

Prima di procedere con questa esercitazione, assicurarsi di completare la prima e la seconda esercitazione della serie.

Impostazione

  1. Configurare il notebook Spark di Azure Machine Learning.

    Per eseguire questa esercitazione, è possibile creare un nuovo notebook ed eseguire le istruzioni, procedura dettagliata. È anche possibile aprire ed eseguire il notebook esistente denominato 3. Abilitare la materializzazione ricorrente ed eseguire l'inferenza batch. È possibile trovare il notebook e tutti i notebook di questa serie nella directory featurestore_sample/notebook. È possibile scegliere tra sdk_only e sdk_and_cli. Mantenere aperta questa esercitazione e farvi riferimento per i collegamenti alla documentazione e altre spiegazioni.

    1. Nell'elenco a discesa Ambiente di calcolo nella barra di spostamento superiore, selezionare Ambiente di calcolo Spark serverless in Azure Machine Learning Serverless Spark.

    2. Configurare la sessione:

      1. Selezionare Configurare sessione nella barra di stato superiore.
      2. Selezionare la scheda pacchetti Python.
      3. Selezionare Carica file Conda.
      4. Selezionare il file azureml-examples/sdk/python/featurestore-sample/project/env/online.yml dal computer locale.
      5. Facoltativamente, aumentare il timeout della sessione (tempo di inattività) per evitare frequenti riesecuzioni dei prerequisiti.
  2. Avviare la sessione 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. Configurare la directory radice per gli esempi.

    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. Configurare l'interfaccia della riga di comando.

    Non applicabile.


  1. Inizializzare il client CRUD dell'area di lavoro del progetto (creare, leggere, aggiornare ed eliminare).

    Il notebook dell'esercitazione viene eseguito da questa area di lavoro corrente.

    ### 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. Inizializzare le variabili dell'archivio delle funzionalità.

    Per riflettere ciò che è stato creato nella prima esercitazione, assicurarsi di aggiornare il featurestore_name valore.

    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. Inizializzare il client SDK dell'archivio delle funzionalità.

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

Abilitare la materializzazione ricorrente nel set di funzionalità transazioni

Nella seconda esercitazione è stata abilitata la materializzazione ed è stato eseguito il back-fill nel set di funzionalità di transactions. Il back-fill è un'operazione su richiesta, una tantum, che calcola e inserisce i valori delle caratteristiche nell'archivio di materializzazione.

Per gestire l'inferenza del modello nell'ambiente di produzione, è possibile configurare i processi di materializzazione ricorrenti per mantenere aggiornato l'archivio di materializzazione. Questi processi vengono eseguiti in base alle pianificazioni definite dall'utente. La pianificazione del lavoro ricorrente funziona in questo modo:

  • I valori di intervallo e frequenza definiscono una finestra. Ad esempio, i valori seguenti definiscono una finestra di tre ore:

    • interval = 3
    • frequency = Hour
  • La prima finestra inizia dal valore start_time definito in RecurrenceTriggere così via.

  • Il primo processo ricorrente viene inviato all'inizio della finestra successiva dopo l'ora di aggiornamento.

  • I processi ricorrenti successivi vengono inviati in ogni finestra dopo il primo processo.

Come illustrato nelle esercitazioni precedenti, dopo la materializzazione dei dati (back-fill o materializzazione ricorrente), il recupero delle funzionalità usa i dati materializzati per impostazione predefinita.

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

(Facoltativo) Salvare il file YAML per l'asset del set di funzionalità

Usare le impostazioni aggiornate per salvare il file YAML.

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

Eseguire la pipeline di inferenza batch

L'inferenza batch prevede questi passaggi:

  1. Si usa lo stesso componente di recupero delle funzionalità predefinito per il recupero delle funzionalità usato nella pipeline di training (illustrato nella terza esercitazione). Per il training della pipeline, è stata fornita una specifica di recupero delle funzionalità come input del componente. Per l'inferenza batch, passare il modello registrato come input. Il componente cerca la specifica di recupero delle funzionalità nell’artefatto del modello.

    Inoltre, per il training, i dati di osservazione avevano la variabile di destinazione. Tuttavia, i dati di osservazione dell'inferenza batch non hanno la variabile di destinazione. Il passaggio di recupero delle funzionalità unisce i dati di osservazione con le funzionalità e restituisce i dati per l'inferenza batch.

  2. La pipeline usa i dati di input di inferenza batch del passaggio precedente, esegue l'inferenza nel modello e aggiunge il valore stimato come output.

    Nota

    In questo esempio si usa un processo per l'inferenza batch. È anche possibile usare endpoint batch in 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)

Esaminare i dati di output per l'inferenza batch

Nella visualizzazione pipeline:

  1. Selezionare inference_step nella scheda outputs.

  2. Copiare il valore del campo Data. Il risultato sarà simile a: azureml_995abbc2-3171-461e-8214-c3c5d17ede83_output_data_data_with_prediction:1.

  3. Incollare il valore del campo Data nella cella seguente, separando i valori di nome e versione. L'ultimo carattere è la versione, preceduta da due punti (:).

  4. Si noti la colonna predict_is_fraud generata dalla pipeline di inferenza batch.

    Nell'output della pipeline di inferenza batch (/project/fraud_mode/pipelines/batch_inference_pipeline.yaml) il sistema ha creato un asset di dati non registrato con un GUID come valore del nome e 1 come valore della versione. Questo problema si è verificato perché non sono stati specificati name valori o version per outputs di inference_step. In questa cella si ricava e si visualizza il percorso dei dati dell'asset.

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

Eseguire la pulizia

La quinta esercitazione della serie descrive come eliminare le risorse.

Passaggi successivi