Come rendere operativa una pipeline di training con endpoint batch
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 rendere operativa una pipeline di training in un endpoint batch. La pipeline usa più componenti (o passaggi) che includono il training del modello, la pre-elaborazione dei dati e la valutazione del modello.
Si apprenderà come:
- Creare e testare una pipeline di training
- Distribuire la pipeline in un endpoint batch
- Modificare la pipeline e creare una nuova distribuzione nello stesso endpoint
- Testare la nuova distribuzione e impostarla come distribuzione predefinita
Informazioni su questo esempio
Questo esempio distribuisce una pipeline di training che accetta i dati di training di input (etichettati) e produce un modello predittivo, insieme ai risultati della valutazione e alle trasformazioni applicate durante la pre-elaborazione. La pipeline userà i dati tabulari del Set di dati UCI Heart Disease per eseguire il training di un modello XGBoost. Si usa un componente di pre-elaborazione dei dati per pre-elaborare i dati prima che vengano inviati al componente di training per adattarsi e valutare il modello.
Di seguito è riportata una visualizzazione della pipeline:
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/training-with-components
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 il componente della pipeline di training
In questa sezione verranno creati tutti gli asset necessari per la pipeline di training. Si inizierà creando un ambiente che include le librerie necessarie per eseguire il training del modello. Si creerà quindi un cluster di elaborazione in cui verrà eseguita la distribuzione batch e infine si registreranno i dati di input come asset di dati.
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
- pandas==1.4
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 i dati di training come asset di dati
I dati di training sono rappresentati nei file CSV. Per simulare un carico di lavoro a livello di produzione, verranno registrati i dati di training nel file heart.csv
come un asset di dati nell'area di lavoro. Questo asset di dati verrà indicato successivamente come input per l'endpoint.
az ml data create --name heart-classifier-train --type uri_folder --path data/train
Creare la pipeline
La pipeline da rendere operativa accetta un input, i dati di training e produce tre output: il modello sottoposto a training, i risultati della valutazione e le trasformazioni dei dati applicate come pre-elaborazione. La pipeline è costituita da due componenti:
-
preprocess_job
: questo passaggio legge i dati di input e restituisce i dati preparati e le trasformazioni applicate. Il passaggio riceve tre input:-
data
: cartella contenente i dati di input da trasformare e a cui assegnare un punteggio -
transformations
: (facoltativo) percorso delle trasformazioni che verranno applicate, se disponibili. Se il percorso non viene specificato, le trasformazioni verranno apprese dai dati di input. Poiché l'inputtransformations
è facoltativo, il componentepreprocess_job
può essere usato durante il training e l'assegnazione dei punteggi. -
categorical_encoding
: la strategia di codifica per le funzionalità categoriche (ordinal
oonehot
).
-
-
train_job
: questo passaggio eseguirà il training di un modello XGBoost in base ai dati preparati e restituirà i risultati della valutazione e il modello sottoposto a training. Il passaggio riceve tre input:-
data
: i dati pre-elaborati. -
target_column
: colonna che verrà stimata. -
eval_size
: indica la proporzione dei dati di input usati per la valutazione.
-
La configurazione della pipeline è definita nel file deployment-ordinal/pipeline.yml
:
deployment-ordinal/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline
name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
type: uri_folder
mode: upload
jobs:
preprocess_job:
type: command
component: ../components/prepare/prepare.yml
inputs:
data: ${{parent.inputs.input_data}}
categorical_encoding: ordinal
outputs:
prepared_data:
transformations_output: ${{parent.outputs.prepare_transformations}}
train_job:
type: command
component: ../components/train_xgb/train_xgb.yml
inputs:
data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
target_column: target
register_best_model: false
eval_size: 0.3
outputs:
model:
mode: upload
type: mlflow_model
path: ${{parent.outputs.model}}
evaluation_results:
mode: upload
type: uri_folder
path: ${{parent.outputs.evaluation_results}}
Nota
Nel file pipeline.yml
l'input transformations
non è presente in preprocess_job
, pertanto lo script apprenderà i parametri di trasformazione dai dati di input.
Di seguito è riportata una visualizzazione della pipeline:
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:
deployment-ordinal/pipeline-job.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
compute: batch-cluster
component: pipeline.yml
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
mode: upload
Creare il processo di test:
az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest
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-train"
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-train description: An endpoint to perform training 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. Per distribuzione si intende un set di risorse necessarie per ospitare l'asset che esegue il lavoro effettivo.
Configurare la distribuzione:
Il file
deployment-ordinal/deployment.yml
contiene la configurazione della distribuzione. È possibile controllare lo schema YAML dell'endpoint batch completo per ottenere proprietà aggiuntive.deployment-ordinal/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-xgb description: A sample deployment that trains an XGBoost model for the UCI dataset. endpoint_name: uci-classifier-train 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-ordinal/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 testarlo, attenersi a questa procedura:
Per la distribuzione è necessario indicare un input di dati.
Il file
inputs.yml
contiene la definizione per l'asset di dati di input:inputs.yml
inputs: input_data: type: uri_folder path: azureml:heart-classifier-train@latest
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
È opportuno ricordare che solo gli input della pipeline vengono pubblicati come input nell'endpoint batch. Ad esempio, categorical_encoding
è un input di un passaggio della pipeline, ma non un input nella pipeline stessa. Considerare questo aspetto per gestire quali input si intende esporre e quali nascondere ai client.
Accedere agli output dei processi
Una volta completato il processo, è possibile accedere ad alcuni output. Questa pipeline produce gli output seguenti per i relativi componenti:
-
preprocess job
: l'output ètransformations_output
-
train job
: gli output sonomodel
eevaluation_results
È possibile scaricare i risultati associati usando:
az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results
Creare una nuova distribuzione nell'endpoint
Gli endpoint possono ospitare più distribuzioni contemporaneamente, mantenendo una sola distribuzione come predefinita. Pertanto è possibile eseguire l'iterazione sui diversi modelli, distribuire i diversi modelli nell'endpoint e testarli e infine passare la distribuzione predefinita alla distribuzione del modello più adatta.
A questo punto verrà descritto come modificare il modo in cui viene eseguita la pre-elaborazione nella pipeline per verificare se si ottiene un modello che offre prestazioni migliori.
Modificare un parametro nel componente di pre-elaborazione della pipeline
Il componente di pre-elaborazione ha un input denominato categorical_encoding
, che può avere valori ordinal
o onehot
. Questi valori corrispondono a due modi diversi per codificare le funzionalità categoriche.
-
ordinal
: codifica i valori di funzionalità con valori numerici (ordinali) da[1:n]
, doven
è il numero di categorie nella funzionalità. La codifica ordinale implica che esiste un ordine di classificazione naturale tra le categorie di funzionalità. -
onehot
: non implica una relazione ordinata in base a una classificazione naturale, ma introduce un problema di dimensionalità se il numero di categorie è elevato.
Per impostazione predefinita, è stato usato ordinal
in precedenza. A questo punto è possibile modificare la codifica categorica per usare onehot
in modo da vedere come viene eseguito il modello.
Suggerimento
In alternativa, potrebbe essere stato esposto l'input categorial_encoding
ai client come input per il processo della pipeline stesso. Tuttavia, è stato scelto di modificare il valore del parametro nel passaggio di pre-elaborazione in modo che sia possibile nascondere e controllare il parametro all'interno della distribuzione e sfruttare l'opportunità di avere più distribuzioni nello stesso endpoint.
Modificare la pipeline. L'aspetto è il seguente:
La configurazione della pipeline è definita nel file
deployment-onehot/pipeline.yml
:deployment-onehot/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json type: pipeline name: uci-heart-train-pipeline display_name: uci-heart-train description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset. inputs: input_data: type: uri_folder outputs: model: type: mlflow_model mode: upload evaluation_results: type: uri_folder mode: upload prepare_transformations: type: uri_folder mode: upload jobs: preprocess_job: type: command component: ../components/prepare/prepare.yml inputs: data: ${{parent.inputs.input_data}} categorical_encoding: onehot outputs: prepared_data: transformations_output: ${{parent.outputs.prepare_transformations}} train_job: type: command component: ../components/train_xgb/train_xgb.yml inputs: data: ${{parent.jobs.preprocess_job.outputs.prepared_data}} target_column: target eval_size: 0.3 outputs: model: type: mlflow_model path: ${{parent.outputs.model}} evaluation_results: type: uri_folder path: ${{parent.outputs.evaluation_results}}
Configurare la distribuzione:
Il file
deployment-onehot/deployment.yml
contiene la configurazione della distribuzione. È possibile controllare lo schema YAML dell'endpoint batch completo per ottenere proprietà aggiuntive.deployment-onehot/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-onehot description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables. endpoint_name: uci-classifier-train 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-onehot/deployment.yml
La distribuzione è pronta per l'uso.
La distribuzione è pronta per l'uso.
Testare una distribuzione non predefinita
Dopo aver creato la distribuzione, questa è pronta per ricevere i processi. È possibile testarlo nello stesso modo in cui è stato fatto in precedenza, ma ora verrà richiamata una distribuzione specifica:
Richiamare la distribuzione come indicato di seguito, specificando il parametro di distribuzione per attivare la distribuzione specifica
uci-classifier-train-onehot
:DEPLOYMENT_NAME="uci-classifier-train-onehot" JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_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
Configurare la nuova distribuzione come predefinita
Dopo aver soddisfatto le prestazioni della nuova distribuzione, è possibile impostare la nuova distribuzione come predefinita:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Eliminare la distribuzione precedente
Al termine, è possibile eliminare la distribuzione precedente se non è più necessaria:
az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes
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