Personalizzare gli output nelle distribuzioni batch
SI APPLICA A:Estensione ml dell'interfaccia della riga di comando di Azure v2 (corrente)Python SDK azure-ai-ml v2 (corrente)
Questa guida illustra come creare distribuzioni che generano output e file personalizzati. In alcuni casi è necessario un maggiore controllo su ciò che viene scritto come output dai processi di inferenza batch. Questi casi includono le situazioni seguenti:
- È necessario controllare la modalità di scrittura delle stime nell'output. Ad esempio, si vuole aggiungere la stima ai dati originali se i dati sono tabulari.
- È necessario scrivere le stime in un formato di file diverso da quello supportato per le distribuzioni batch.You need to write your predictions in a different file format than one supported out-of-the-box by batch deployments.
- Il modello è un modello generativo che non può scrivere l'output in un formato tabulare. Ad esempio, i modelli che producono immagini come output.
- Il modello produce più file tabulari anziché uno singolo. Ad esempio, i modelli che eseguono la previsione considerando più scenari.
Le distribuzioni batch consentono di assumere il controllo dell'output dei processi consentendo di scrivere direttamente nell'output del processo di distribuzione batch. In questa esercitazione si apprenderà come distribuire un modello per eseguire l'inferenza batch e scrivere gli output in formato parquet aggiungendo le stime ai dati di input originali.
Informazioni sull'esempio
Questo esempio illustra come distribuire un modello per eseguire l'inferenza batch e personalizzare la modalità di scrittura delle previsioni nell'output. Il modello si basa sul set di dati UCI Heart Disease. Il database contiene 76 attributi, ma in questo esempio viene utilizzato un subset di 14 attributi. Il modello cerca di prevedere la presenza di una malattia cardiaca in un paziente. Valore intero compreso tra 0 (nessuna presenza) e 1 (presenza).
Il training del modello è stato eseguito usando un XGBBoost
classificatore e tutto il pre-elaborazione richiesto è stato inserito in un pacchetto come scikit-learn
pipeline, rendendo questo modello una pipeline end-to-end che passa dai dati non elaborati alle stime.
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-models/custom-outputs-parquet
Seguire la procedura in un notebook di Jupyter
È disponibile un notebook di Jupyter che è possibile usare per seguire questo esempio. Nel repository clonato aprire il notebook denominato custom-output-batch.ipynb.
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 una distribuzione batch con un output personalizzato
In questo esempio si crea una distribuzione in grado di scrivere direttamente nella cartella di output del processo di distribuzione batch. La distribuzione usa questa funzionalità per scrivere file Parquet personalizzati.
Registrare il modello
È possibile distribuire modelli registrati solo usando un endpoint batch. In questo caso è già disponibile una copia locale del modello nel repository, quindi è sufficiente pubblicare il modello nel Registro di sistema nell'area di lavoro. È possibile ignorare questo passaggio se il modello che si sta tentando di distribuire è già registrato.
MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"
Creare uno script di punteggio
È necessario creare uno script di assegnazione dei punteggi in grado di leggere i dati di input forniti dalla distribuzione batch e restituire i punteggi del modello. Si scriverà anche direttamente nella cartella di output del processo. In sintesi, lo script di assegnazione dei punteggi proposto esegue le operazioni seguenti:
- Legge i dati di input come file CSV.
- Esegue la funzione
predict
del modello MLflow sui dati di input. - Aggiunge le previsioni a un oggetto
pandas.DataFrame
insieme ai dati di input. - Scrive i dati in un file denominato come file di input, ma in formato
parquet
.
codice/batch_driver.py
import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List
def init():
global model
global output_path
# AZUREML_MODEL_DIR is an environment variable created during deployment
# It is the path to the model folder
# Please provide your model's folder name if there's one:
output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
model_path = os.environ["AZUREML_MODEL_DIR"]
model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]
with open(model_file, "rb") as file:
model = pickle.load(file)
def run(mini_batch: List[str]):
for file_path in mini_batch:
data = pd.read_csv(file_path)
pred = model.predict(data)
data["prediction"] = pred
output_file_name = Path(file_path).stem
output_file_path = os.path.join(output_path, output_file_name + ".parquet")
data.to_parquet(output_file_path)
return mini_batch
Note:
- Si noti che la variabile di ambiente
AZUREML_BI_OUTPUT_PATH
viene usata per ottenere l'accesso al percorso di output del processo di distribuzione. - La
init()
funzione popola una variabile globale denominataoutput_path
che può essere usata in un secondo momento per sapere dove scrivere. - Il metodo
run
restituisce un elenco dei file elaborati. È necessario che larun
funzione restituisca unlist
oggetto opandas.DataFrame
.
Avviso
Tenere presente che tutti gli executor batch hanno accesso in scrittura contemporaneamente a questo percorso. Ciò significa che è necessario tenere conto della concorrenza. In questo caso, assicurarsi che ogni executor scriva il proprio file usando il nome del file di input come nome della cartella di output.
Creare l'endpoint
A questo punto si crea un endpoint batch denominato heart-classifier-batch
in cui viene distribuito il modello.
Decidere il nome dell'endpoint. Il nome dell'endpoint viene visualizzato nell'URI associato all'endpoint, quindi i nomi degli endpoint batch devono essere univoci all'interno di un'area di Azure. Ad esempio, può essere presente un solo endpoint batch con il nome
mybatchendpoint
inwestus2
.In questo caso, inserire il nome dell'endpoint in una variabile in modo da poterlo fare facilmente riferimento in un secondo momento.
ENDPOINT_NAME="heart-classifier-custom"
Configurare l'endpoint batch.
Il file YAML seguente definisce un endpoint batch:
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: heart-classifier-batch description: A heart condition classifier for batch inference auth_mode: aad_token
Creare l'endpoint:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Creare la distribuzione
Seguire i passaggi successivi per creare una distribuzione usando lo script di assegnazione dei punteggi precedente:
Creare prima di tutto un ambiente in cui è possibile eseguire lo script di assegnazione dei punteggi:
Non è necessario alcun passaggio aggiuntivo per l'interfaccia della riga di comando di Azure Machine Learning. La definizione dell'ambiente è inclusa nel file di distribuzione.
environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml
Creare la distribuzione. Si noti che
output_action
è ora impostato suSUMMARY_ONLY
.Nota
In questo esempio si presuppone che sia presente un cluster di calcolo con nome
batch-cluster
. Modificare il nome di conseguenza.Per creare una nuova distribuzione nell'endpoint creato, creare una configurazione YAML simile alla seguente. È possibile controllare lo schema YAML dell'endpoint batch completo per ottenere proprietà aggiuntive.
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-custom description: A heart condition classifier based on XGBoost and Scikit-Learn pipelines that append predictions on parquet files. type: model model: azureml:heart-classifier-sklpipe@latest environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml code_configuration: code: code scoring_script: batch_driver.py compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: summary_only retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Creare quindi la distribuzione con il comando seguente:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
A questo punto, l'endpoint batch è pronto per essere usato.
Testare la distribuzione
Per testare l'endpoint, usare un esempio di dati senza etichetta che si trovano in questo repository, che possono essere usati con il modello. Gli endpoint batch possono elaborare solo i dati che si trovano nel cloud ed è accessibile dall'area di lavoro di Azure Machine Learning. In questo esempio viene caricato in un archivio dati di Azure Machine Learning. Si creerà un asset di dati che può essere usato per richiamare l'endpoint per l'assegnazione dei punteggi. Si noti tuttavia che gli endpoint batch accettano dati che possono essere inseriti in più tipi di posizioni.
Richiamare l'endpoint con i dati da un account di archiviazione:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
Nota
L'utilità
jq
potrebbe non essere installata in ogni installazione. È possibile ottenere istruzioni su GitHub.Un processo batch viene avviato non appena viene restituito il comando. È possibile monitorare lo stato del processo fino al termine dell'operazione:
az ml job show -n $JOB_NAME --web
Analizzare gli output
Il processo genera un output denominato score
in cui vengono inseriti tutti i file generati. Poiché la directory è stata scritta direttamente, un file per ogni file di input, è quindi possibile prevedere lo stesso numero di file. In questo esempio particolare assegnare un nome ai file di output uguali agli input, ma hanno un'estensione parquet.
Nota
Si noti che un file predictions.csv è incluso anche nella cartella di output. Questo file contiene il riepilogo dei file elaborati.
È possibile scaricare i risultati del processo usando il nome del processo:
Per scaricare le previsioni, usare il comando seguente:
az ml job download --name $JOB_NAME --output-name score --download-path ./
Una volta scaricato il file, è possibile aprirlo usando lo strumento preferito. Nell'esempio seguente vengono caricate le previsioni usando il dataframe Pandas
.
import pandas as pd
import glob
output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score
L'output sarà simile al seguente:
età | sex | ... | thal | stima |
---|---|---|---|---|
63 | 1 | ... | fixed | 0 |
67 | 1 | ... | normale | 1 |
67 | 1 | ... | reversible | 0 |
37 | 1 | ... | normale | 0 |
Pulire le risorse
Eseguire il codice seguente per eliminare l'endpoint batch e tutte le distribuzioni sottostanti. I processi di assegnazione dei punteggi batch non vengono eliminati.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes