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:
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'
ml
estensione 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. Usareaz 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:
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.
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.
Registrare il modello da usare per la stima:
az ml model create --name heart-classifier --type mlflow_model --path model
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.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
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 punteggiotransformations
: (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 ilpreprocess_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:
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
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"
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
Creare l'endpoint:
az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
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.
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
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.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:
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.
È 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)
È 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