Come distribuire una pipeline per eseguire l'assegnazione dei punteggi batch con la pre-elaborazione

SI APPLICA A:Estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)

Questo articolo illustra come distribuire una pipeline di inferenza (o punteggio) in un endpoint batch. La pipeline esegue il punteggio su un modello registrato, riutilizzando al tempo stesso un componente di pre-elaborazione da quando è stato eseguito il training del modello. Il riutilizzo dello stesso componente di pre-elaborazione garantisce che la stessa pre-elaborazione venga applicata durante l'assegnazione dei punteggi.

Si apprenderà come:

  • Creare una pipeline che riutilizza i componenti esistenti dall'area di lavoro
  • Distribuire la pipeline in un endpoint
  • Usare le stime generate dalla pipeline

Informazioni su questo esempio

Questo esempio illustra come riutilizzare il codice di pre-elaborazione e i parametri appresi durante la pre-elaborazione prima di usare il modello per l'inferenza. Riutilizzando il codice di pre-elaborazione e i parametri appresi, è possibile assicurarsi che durante l'inferenza vengano applicate anche le stesse trasformazioni(ad esempio la normalizzazione e la codifica delle funzionalità) applicate ai dati di input durante il training. Il modello usato per l'inferenza eseguirà stime sui dati tabulari del set di dati UCI Heart Disease.

Una visualizzazione della pipeline è la seguente:

Screenshot della pipeline di inferenza che comprende un componente di assegnazione dei punteggi insieme agli output e prepara il componente da una pipeline di training.

L'esempio contenuto in questo articolo si basa sugli esempi di codice contenuti nel repository azureml-examples. Per eseguire i comandi in locale senza dover copiare o incollare il file YAML e altri file, innanzitutto clonare il repository quindi cambiare le directory nella cartella:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

I file per questo esempio si trovano in:

cd endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing

Seguire la procedura nei notebook di Jupyter

È possibile seguire la versione di Python SDK di questo esempio aprendo il notebook sdk-deploy-and-test.ipynb nel repository clonato.

Prerequisiti

Prima di seguire la procedura descritta in questo articolo, assicurarsi di disporre dei prerequisiti seguenti:

  • Una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare. Provare la versione gratuita o a pagamento di Azure Machine Learning.

  • Un'area di lavoro di Azure Machine Learning. Se non è disponibile, usare la procedura descritta nell'articolo Gestire le aree di lavoro di Azure Machine Learning per crearne una.

  • Assicurarsi di disporre delle autorizzazioni seguenti nell'area di lavoro:

    • Creare o gestire endpoint e distribuzioni batch: usare un ruolo Proprietario, Collaboratore o Personalizzato che consenta Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Creare distribuzioni arm nel gruppo di risorse dell'area di lavoro: usare un ruolo Proprietario, Collaboratore o Personalizzato che consenta Microsoft.Resources/deployments/write nel gruppo di risorse in cui viene distribuita l'area di lavoro.

  • Per usare Azure Machine Learning, è necessario installare il software seguente:

    L'Interfaccia della riga di comando di Azure e l'mlestensione per Azure Machine Learning.

    az extension add -n ml
    

    Nota

    Le distribuzioni dei componenti della pipeline per gli endpoint batch sono state introdotte nella versione 2.7 dell'estensione ml per l'interfaccia della riga di comando di Azure. Usare az extension update --name ml per ottenere l'ultima versione.

Connettersi all'area di lavoro

L'area di lavoro è la risorsa di primo livello per Azure Machine Learning, che fornisce una posizione centralizzata da cui gestire tutti gli artefatti creati quando si usa Azure Machine Learning. In questa sezione ci si connetterà all'area di lavoro in cui verranno eseguite le attività di distribuzione.

Passare i valori per l'ID sottoscrizione, l'area di lavoro, la posizione e il gruppo di risorse nel codice seguente:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Creare la pipeline di inferenza

In questa sezione verranno creati tutti gli asset necessari per la pipeline di inferenza. Si inizierà creando un ambiente che include le librerie necessarie per i componenti della pipeline. Verrà quindi creato un cluster di calcolo in cui verrà eseguita la distribuzione batch. Successivamente, verranno registrati i componenti, i modelli e le trasformazioni necessari per compilare la pipeline di inferenza. Infine, verrà compilata e testata la pipeline.

Creare l'ambiente

I componenti di questo esempio useranno un ambiente con le XGBoost librerie e scikit-learn . Il environment/conda.yml file contiene la configurazione dell'ambiente:

environment/conda.yml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - azureml-mlflow
  - datasets
  - jobtools
  - cloudpickle==1.6.0
  - dask==2023.2.0
  - scikit-learn==1.1.2
  - xgboost==1.3.3
name: mlflow-env

Creare l'ambiente nel modo seguente:

  1. Definire l'ambiente:

    environment/xgboost-sklearn-py38.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: xgboost-sklearn-py38
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: conda.yml
    description: An environment for models built with XGBoost and Scikit-learn.
    
  2. Creare l'ambiente:

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

Creare un cluster di elaborazione

Gli endpoint e le distribuzioni batch vengono eseguiti nei cluster di calcolo. Possono essere eseguiti in qualsiasi cluster di calcolo di Azure Machine Learning già esistente nell'area di lavoro. Di conseguenza, più distribuzioni batch possono condividere la stessa infrastruttura di calcolo. In questo esempio si lavorerà in un cluster di calcolo di Azure Machine Learning denominato batch-cluster. Verificare che il calcolo esista nell'area di lavoro o crearlo in caso contrario.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Registrare componenti e modelli

Verranno registrati componenti, modelli e trasformazioni necessari per creare la pipeline di inferenza. È possibile riutilizzare alcuni di questi asset per le routine di training.

Suggerimento

In questa esercitazione verrà riutilizzato il modello e il componente di pre-elaborazione da una pipeline di training precedente. È possibile vedere come sono stati creati seguendo l'esempio Come distribuire una pipeline di training con endpoint batch.

  1. Registrare il modello da usare per la stima:

    az ml model create --name heart-classifier --type mlflow_model --path model
    
  2. Il modello registrato non è stato sottoposto a training direttamente sui dati di input. Al contrario, i dati di input sono stati pre-elaborati (o trasformati) prima del training, usando un componente di preparazione. È anche necessario registrare questo componente. Registrare il componente di preparazione:

    az ml component create -f components/prepare/prepare.yml
    

    Suggerimento

    Dopo aver registrato il componente di preparazione, è ora possibile farvi riferimento dall'area di lavoro. Ad esempio, azureml:uci_heart_prepare@latest otterrà l'ultima versione del componente di preparazione.

  3. Nell'ambito delle trasformazioni dei dati nel componente di preparazione, i dati di input sono stati normalizzati per centrare i predittori e limitarne i valori nell'intervallo di [-1, 1]. I parametri di trasformazione sono stati acquisiti in una trasformazione scikit-learn che è anche possibile registrare per applicarli in un secondo momento quando sono disponibili nuovi dati. Registrare la trasformazione come segue:

    az ml model create --name heart-classifier-transforms --type custom_model --path transformations
    
  4. Si eseguirà l'inferenza per il modello registrato, usando un altro componente denominato score che calcola le stime per un determinato modello. Si farà riferimento al componente direttamente dalla relativa definizione.

    Suggerimento

    La procedura consigliata consiste nel registrare il componente e farvi riferimento dalla pipeline. In questo esempio, tuttavia, si farà riferimento al componente direttamente dalla relativa definizione per vedere quali componenti vengono riutilizzati dalla pipeline di training e quali sono nuovi.

Creare la pipeline

Ora è il momento di associare tutti gli elementi insieme. La pipeline di inferenza che verrà distribuita include due componenti (passaggi):

  • preprocess_job: questo passaggio legge i dati di input e restituisce i dati preparati e le trasformazioni applicate. Il passaggio riceve due input:
    • data: cartella contenente i dati di input da assegnare al punteggio
    • transformations: (facoltativo) Percorso delle trasformazioni che verranno applicate, se disponibili. Se specificato, le trasformazioni vengono lette dal modello indicato nel percorso. Tuttavia, se il percorso non viene specificato, le trasformazioni verranno apprese dai dati di input. Per l'inferenza, tuttavia, non è possibile apprendere i parametri di trasformazione (in questo esempio, i coefficienti di normalizzazione) dai dati di input perché è necessario usare gli stessi valori dei parametri appresi durante il training. Poiché questo input è facoltativo, il componente può essere usato durante il preprocess_job training e l'assegnazione dei punteggi.
  • score_job: questo passaggio eseguirà l'inferenza sui dati trasformati usando il modello di input. Si noti che il componente usa un modello MLflow per eseguire l'inferenza. Infine, i punteggi vengono riscritto nello stesso formato in cui sono stati letti.

La configurazione della pipeline.yml pipeline è definita nel file :

pipeline.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline

name: batch_scoring_uci_heart
display_name: Batch Scoring for UCI heart
description: This pipeline demonstrates how to make batch inference using a model from the Heart Disease Data Set problem, where pre and post processing is required as steps. The pre and post processing steps can be components reusable from the training pipeline.

inputs:
  input_data:
    type: uri_folder
  score_mode:
    type: string
    default: append

outputs: 
  scores:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: azureml:uci_heart_prepare@latest
    inputs:
      data: ${{parent.inputs.input_data}}
      transformations: 
        path: azureml:heart-classifier-transforms@latest
        type: custom_model
    outputs:
      prepared_data:
  
  score_job:
    type: command
    component: components/score/score.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      model:
        path: azureml:heart-classifier@latest
        type: mlflow_model
      score_mode: ${{parent.inputs.score_mode}}
    outputs:
      scores: 
        mode: upload
        path: ${{parent.outputs.scores}}

Una visualizzazione della pipeline è la seguente:

Screenshot della pipeline di inferenza che mostra l'assegnazione dei punteggi batch con la pre-elaborazione.

Testare la pipeline

Verrà ora testata la pipeline con alcuni dati di esempio. A tale scopo, verrà creato un processo usando la pipeline e il batch-cluster cluster di calcolo creato in precedenza.

Il file pipeline-job.yml seguente contiene la configurazione per il processo della pipeline:

pipeline-job.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: uci-classifier-score-job
description: |-
  This pipeline demonstrate how to make batch inference using a model from the Heart \
  Disease Data Set problem, where pre and post processing is required as steps. The \
  pre and post processing steps can be components reused from the training pipeline.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
  score_mode: append
outputs: 
  scores:
    mode: upload

Creare il processo di test:

az ml job create -f pipeline-job.yml --set inputs.input_data.path=data/unlabeled

Creare un endpoint batch

  1. Specificare un nome per l'endpoint. Il nome di un endpoint batch deve essere univoco in ogni area poiché viene usato per costruire l'URI di chiamata. Per garantirne l'univocità, aggiungere tutti i caratteri finali al nome specificato nel codice seguente.

    ENDPOINT_NAME="uci-classifier-score"
    
  2. Configurare l'endpoint:

    Il file endpoint.yml contiene la configurazione dell'endpoint.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-score
    description: Batch scoring endpoint of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. Creare l'endpoint:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Eseguire una query sull'URI dell'endpoint:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Distribuire il componente della pipeline

Per distribuire il componente della pipeline, è necessario creare una distribuzione batch. Una distribuzione è un set di risorse necessarie per ospitare l'asset che esegue il lavoro effettivo.

  1. Configurare la distribuzione

    Il file deployment.yml contiene la configurazione della distribuzione. È possibile controllare lo schema YAML dell'endpoint batch completo per ottenere proprietà aggiuntive.

    deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-prepros-xgb
    endpoint_name: uci-classifier-batch
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  2. Creare la distribuzione

    Eseguire il codice seguente per creare una distribuzione batch nell'endpoint batch e impostarla come distribuzione predefinita.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment.yml --set-default
    

    Suggerimento

    Si noti l'uso del --set-default flag per indicare che questa nuova distribuzione è ora l'impostazione predefinita.

  3. La distribuzione è pronta per l'uso.

Testare la distribuzione

Dopo aver creato la distribuzione, questa è pronta per ricevere i processi. Per testarlo, seguire questa procedura:

  1. Per la distribuzione è necessario indicare un input di dati e un input letterale.

    Il inputs.yml file contiene la definizione per l'asset di dati di input:

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: data/unlabeled
      score_mode:
        type: string
        default: append
    outputs:
      scores:
        type: uri_folder
        mode: upload
    

    Suggerimento

    Per altre informazioni su come indicare gli input, vedere Creare processi e dati di input per gli endpoint batch.

  2. È possibile richiamare la distribuzione predefinita nel modo seguente:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. È possibile monitorare lo stato di avanzamento del contenuto e trasmettere i log usando:

    az ml job stream -n $JOB_NAME
    

Accedere all'output del processo

Una volta completato il processo, è possibile accedere al relativo output. Questo processo contiene un solo output denominato scores:

È possibile scaricare i risultati associati usando az ml job download.

az ml job download --name $JOB_NAME --output-name scores

Leggere i dati con punteggio:

import pandas as pd
import glob

output_files = glob.glob("named-outputs/scores/*.csv")
score = pd.concat((pd.read_csv(f) for f in output_files))
score

L'output sarà simile al seguente:

età sex ... thal stima
0.9338 1 ... 2 0
1.3782 1 ... 3 1
1.3782 1 ... 4 0
-1.954 1 ... 3 0

L'output contiene le stime più i dati forniti al componente score, che è stato pre-elaborato. Ad esempio, la colonna age è stata normalizzata e la colonna thal contiene valori di codifica originali. In pratica, è probabile che si voglia restituire solo la stima e quindi concatarla con i valori originali. Questo lavoro è stato lasciato al lettore.

Pulire le risorse

Al termine, eliminare le risorse associate dall'area di lavoro:

Eseguire il codice seguente per eliminare l'endpoint batch e la relativa distribuzione sottostante. --yes viene usato per confermare l'eliminazione.

az ml batch-endpoint delete -n $ENDPOINT_NAME --yes

(Facoltativo) Eliminare le risorse di calcolo, a meno che non si intenda riutilizzare il cluster di calcolo con distribuzioni successive.

az ml compute delete -n batch-cluster

Passaggi successivi