Come distribuire una pipeline per eseguire l'assegnazione dei punteggi in batch con 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 assegnazione dei punteggi) in un endpoint batch. La pipeline esegue l’assegnazione dei punteggi 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 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 accertarsi 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 dal 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 YAML e altri file, usare i comandi seguenti per clonare il repository e passare alla cartella per il linguaggio di codifica:
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 Jupyter Notebook
È possibile seguire la versione di Python SDK di questo esempio aprendo il notebook sdk-deploy-and-test.ipynb nel repository clonato.
Prerequisiti
Una sottoscrizione di Azure. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
Un'area di lavoro di Azure Machine Learning. Per creare un'area di lavoro, vedere Gestire le aree di lavoro di Azure Machine Learning.
Le autorizzazioni seguenti nell'area di lavoro di Azure Machine Learning:
- Per la creazione o la gestione di endpoint e distribuzioni batch: usare un ruolo proprietario, collaboratore o personalizzato a cui sono state assegnate le
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
autorizzazioni. - Per la creazione di distribuzioni di Azure Resource Manager nel gruppo di risorse dell'area di lavoro: usare un ruolo proprietario, collaboratore o personalizzato a cui è stata assegnata l'autorizzazione
Microsoft.Resources/deployments/write
nel gruppo di risorse in cui viene distribuita l'area di lavoro.
- Per la creazione o la gestione di endpoint e distribuzioni batch: usare un ruolo proprietario, collaboratore o personalizzato a cui sono state assegnate le
Interfaccia della riga di comando di Azure Machine Learning o Azure Machine Learning SDK per Python:
Eseguire il comando seguente per installare l'interfaccia della riga di comando di Azure e l'
ml
estensione per Azure Machine Learning:az extension add -n ml
Le distribuzioni dei componenti della pipeline per gli endpoint batch vengono introdotte nella versione 2.7 dell'estensione per l'interfaccia
ml
della riga di comando di Azure. Usare il comandoaz extension update --name ml
per ottenere la versione più recente.
Connettersi all'area di lavoro
L'area di lavoro è la risorsa di primo livello per Azure Machine Learning. Offre una posizione centralizzata per lavorare con tutti gli artefatti creati quando si usa Azure Machine Learning. In questa sezione ci si connette all'area di lavoro in cui verranno eseguite le attività di distribuzione.
Nel comando seguente immettere l'ID sottoscrizione, il nome dell'area di lavoro, il nome del gruppo di risorse e il percorso:
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. Successivamente, verrà creato un cluster di elaborazione in cui verrà eseguita la distribuzione batch. Successivamente, verranno registrati i componenti, le trasformazioni e i modelli necessari per generare la pipeline di inferenza. Infine, la pipeline verrà generata e testata.
Creare l'ambiente
I componenti di questo esempio useranno un ambiente con le librerie XGBoost
e scikit-learn
. Il file environment/conda.yml
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 elaborazione. Possono essere eseguiti in qualsiasi cluster di elaborazione 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 utilizzerà un cluster di elaborazione di Azure Machine Learning denominato batch-cluster
. Verificare che il calcolo esista nell'area di lavoro o, in caso contrario, crearlo.
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Registrare componenti e modelli
Verranno registrati i componenti, le trasformazioni e i modelli necessari per la generazione della 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 gli 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. I dati di input, invece, sono stati pre-elaborati (o trasformati) prima del training, usando un componente di preparazione. Sarà necessario registrare anche questo componente. Registrare il componente di preparazione:
az ml component create -f components/prepare/prepare.yml
Suggerimento
Dopo la registrazione del componente di preparazione, è possibile farvi riferimento dall'area di lavoro. Ad esempio,
azureml:uci_heart_prepare@latest
otterrà l'ultima versione del componente di preparazione.Durante le trasformazioni dei dati nel componente di preparazione, i dati di input sono stati normalizzati per centrare i predittori e limitarne i valori nell'intervallo [-1, 1]. I parametri di trasformazione sono stati acquisiti in una trasformazione scikit-learn che è anche possibile registrare per l’applicazione in un secondo momento quando sono disponibili nuovi dati. Registrare la trasformazione come indicato di seguito:
az ml model create --name heart-classifier-transforms --type custom_model --path transformations
Verrà eseguita 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 sua definizione per vedere quali componenti vengono riutilizzati dalla pipeline di training e quali sono nuovi.
Creare la pipeline
A questo punto, è possibile associare tutti gli elementi. 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
: una cartella contenente i dati di input a cui assegnare i punteggi -
transformations
(facoltativo): il percorso delle trasformazioni che verranno applicate, se disponibile. Se è specificato, le trasformazioni vengono lette dal modello indicato nel percorso. Se il percorso non viene specificato, tuttavia, 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 componentepreprocess_job
può essere usato durante il training e l'assegnazione dei punteggi.
-
-
score_job
: questo passaggio eseguirà l'inferenza sui dati trasformati usando il modello di input. Tenere presente che il componente usa un modello MLflow per eseguire l'inferenza. Infine, i punteggi vengono riscritti nello stesso formato in cui sono stati letti.
La configurazione della pipeline è definita nel file pipeline.yml
:
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 campione. A tale scopo, verrà creato un processo usando la pipeline e il cluster di elaborazione batch-cluster
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
Immettere 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 che l'uso del flag
--set-default
sta ad indicare che ora questa nuova distribuzione è la distribuzione predefinita.La distribuzione è pronta per l'uso.
Testare la distribuzione
Dopo aver creato la distribuzione, questa è pronta per ricevere i processi. Per testarla, effettuare la procedura seguente:
Per la distribuzione è necessario indicare un input di dati e un input letterale.
Il file
inputs.yml
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 a cui sono stati assegnati i punteggi
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 punteggio pre-elaborato. Ad esempio, la colonna age
è stata normalizzata e la colonna thal
contiene valori di codifica originari. In pratica, è probabile che si desideri solo l’output della stima e si desideri concatenarlo 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 preveda di riutilizzare il cluster di elaborazione con distribuzioni successive.
az ml compute delete -n batch-cluster