Distribuire modelli MLflow negli endpoint online
SI APPLICA A: estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)
Questo articolo illustra come distribuire il modello MLflow in un endpoint online per l'inferenza in tempo reale. Quando si distribuisce il modello MLflow in un endpoint online, non è necessario specificare uno script di assegnazione dei punteggi o un ambiente. Questa condizione è conosciuta come Distribuzione senza codice.
Per la distribuzione senza codice, Azure Machine Learning:
- Installa dinamicamente i pacchetti Python forniti nel file
conda.yaml
. Di conseguenza, le dipendenze vengono installate durante il runtime del contenitore. - Fornisce un ambiente di base/immagine curata di MLflow che contiene gli elementi seguenti:
azureml-inference-server-http
mlflow-skinny
- Uno script di assegnazione dei punteggi per l'inferenza.
Suggerimento
Aree di lavoro senza accesso alla rete pubblica: prima di poter distribuire modelli MLflow in endpoint online senza connettività in uscita, è necessario creare un pacchetto dei modelli (anteprima). Usando la creazione di pacchetti di modelli, è possibile evitare la necessità di una connessione Internet, che Azure Machine Learning richiederebbe altrimenti di installare per installare in modo dinamico i pacchetti Python necessari per i modelli MLflow.
Informazioni sull'esempio
L'esempio mostra come distribuire un modello MLflow in un endpoint online per eseguire stime. Nell'esempio viene usato un modello MLflow basato sul set di dati diabetes. Questo set di dati contiene 10 variabili di base: età, sesso, indice di massa corporea, pressione sanguigna media e sei misurazioni del siero sanguigno ottenute da 442 pazienti diabetici. Contiene anche la risposta di interesse, una misura quantitativa della progressione della malattia un anno dopo il suo manifestarsi.
Il training del modello è stato eseguito tramite un regressore scikit-learn
e tutta la preelaborazione necessaria è stata inserita in un pacchetto come pipeline, rendendo questo modello una pipeline end-to-end che va dai dati non elaborati alle previsioni.
Le informazioni contenute in questo articolo si basano sugli esempi di codice contenuti nel repository azureml-examples. Per eseguire i comandi in locale senza dover copiare/incollare il file YAML e altri file, clonare il repository e quindi modificare le directory in cli
, se si usa l'interfaccia della riga di comando di Azure. Se si usa Azure Machine Learning SDK per Python, modificare le directory in sdk/python/endpoints/online/mlflow
.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Seguire la procedura in Jupyter Notebook
È possibile seguire la procedura per usare Python SDK di Azure Machine Learning aprendo il notebook Distribuisci modello MLflow su endpoint online 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.
I controlli degli accessi in base al ruolo di Azure vengono usati per concedere l'accesso alle operazioni in Azure Machine Learning. Per eseguire la procedura descritta in questo articolo, all'account utente deve essere assegnato il ruolo di Proprietario o Collaboratore per l'area di lavoro di Azure Machine Learning o a un ruolo personalizzato che consente
Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*
. Per altre informazioni, vedere Gestire l'accesso a un'area di lavoro di Azure Machine Learning.È necessario avere un modello MLflow registrato nell'area di lavoro. Questo articolo registra un modello sottoposto a training per il set di dati Diabetes nell'area di lavoro.
Inoltre, è necessario:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
- Installare l'interfaccia della riga di comando di Azure e l'estensione di
ml
nell'interfaccia della riga di comando di Azure. Per altre informazioni sull'installazione dell'interfaccia della riga di comando, vedere Installare e configurare l'interfaccia della riga di comando (v2).
Connettersi all'area di lavoro
Connettersi prima di tutto all'area di lavoro di Azure Machine Learning in cui si lavorerà.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registrare il modello
È possibile distribuire solo i modelli registrati in endpoint online. 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.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"
Cosa accade se il modello è stato registrato all'interno di un'esecuzione?
Se il modello è stato registrato all'interno di un'esecuzione, è possibile registrarlo direttamente.
Per registrare il modello, è necessario conoscere la posizione in cui è archiviato. Se si usa la funzionalità di autolog
MLflow, il percorso del modello dipende dal tipo di modello e dal framework. È necessario controllare l'output dei processi per identificare il nome della cartella del modello. La cartella contiene un file denominato MLModel
.
Se si usa il metodolog_model
per registrare manualmente i modelli, passare il percorso del modello come argomento del metodo. Ad esempio, se si registra il modello, usando mlflow.sklearn.log_model(my_model, "classifier")
, il percorso in cui viene archiviato il modello viene chiamato classifier
.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
Usare l'interfaccia della riga di comando di Azure Machine Learning v2 per creare un modello da un output del processo di training. Nell'esempio seguente viene registrato un modello denominato $MODEL_NAME
usando gli artefatti di un processo con ID $RUN_ID
. Il percorso in cui è archiviato il modello è $MODEL_PATH
.
az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH
Nota
Il percorso $MODEL_PATH
è la posizione in cui il modello è stato archiviato nell'esecuzione.
Distribuire un modello di MLflow in un endpoint online
Configurare l'endpoint in cui verrà distribuito il modello. L'esempio seguente configura il nome e la modalità di autenticazione dell'endpoint:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
Impostare un nome endpoint eseguendo il comando seguente (sostituire
YOUR_ENDPOINT_NAME
con un nome univoco):export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
Configurare l'endpoint:
create-endpoint.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: my-endpoint auth_mode: key
Creare l'endpoint:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
Configurare la distribuzione. Per distribuzione si intende un set di risorse necessarie per ospitare il modello che esegue l'inferenza effettiva.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
sklearn-deployment.yaml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-deployment endpoint_name: my-endpoint model: name: mir-sample-sklearn-ncd-model version: 2 path: sklearn-diabetes/model type: mlflow_model instance_type: Standard_DS3_v2 instance_count: 1
Nota
La generazione automatica dei
scoring_script
e deienvironment
è supportata solo per versione del modellopyfunc
. Per usare un modello diverso, vedere Personalizzazione delle distribuzioni di modelli MLflow.Creare la distribuzione:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Se l'endpoint non dispone di connettività in uscita, usare creazione di pacchetti di modelli (anteprima) includendo il flag
--with-package
:az ml online-deployment create --with-package --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
Assegnare tutto il traffico alla distribuzione. Finora, l'endpoint ha una distribuzione, ma nessuna parte del suo traffico viene assegnato ad esso.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, perché è stato usato il flag
--all-traffic
durante la creazione. Se è necessario modificare il traffico, è possibile usare il comandoaz ml online-endpoint update --traffic
. Per altre informazioni su come aggiornare il traffico, vedere Aggiornare progressivamente il traffico.Aggiornare la configurazione dell'endpoint:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, perché è stato usato il flag
--all-traffic
durante la creazione. Se è necessario modificare il traffico, è possibile usare il comandoaz ml online-endpoint update --traffic
. Per altre informazioni su come aggiornare il traffico, vedere Aggiornare progressivamente il traffico.
Richiamare l'endpoint
Quando la distribuzione è pronta, è possibile usarla per gestire la richiesta. Un modo per testare la distribuzione consiste nell'usare la funzionalità di chiamata predefinita nel client di distribuzione in uso. Il codice JSON seguente è una richiesta di esempio per la distribuzione.
sample-request-sklearn.json
{"input_data": {
"columns": [
"age",
"sex",
"bmi",
"bp",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6"
],
"data": [
[ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
[ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
],
"index": [0,1]
}}
Nota
input_data
viene usato in questo esempio, anziché inputs
che viene usato nella gestione di MLflow. Questo perché Azure Machine Learning richiede un formato di input diverso per poter generare automaticamente i contratti swagger per gli endpoint. Per altre informazioni sui formati di input previsti, vedere Differenze tra i modelli distribuiti in Azure Machine Learning e MLflow server predefinito.
Inviare una richiesta all'endpoint come indicato di seguito:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
La risposta sarà simile al testo seguente:
[
11633.100167144921,
8522.117402884991
]
Importante
Per MLflow no-code-deployment, test tramite endpoint locali non è attualmente supportato.
Personalizzare le distribuzioni del modello MLflow
Non è necessario specificare uno script di assegnazione dei punteggi nella definizione di distribuzione di un modello MLflow a un endpoint online. Tuttavia, è possibile scegliere di farlo e personalizzare la modalità di esecuzione dell'inferenza.
In genere si vuole personalizzare la distribuzione del modello MLflow quando:
- Il modello non include una versione
PyFunc
. - È necessario personalizzare la modalità di esecuzione del modello, ad esempio per usare una versione specifica per caricare il modello, usando
mlflow.<flavor>.load_model()
. - È necessario eseguire la pre/post-elaborazione nella routine di assegnazione dei punteggi quando non viene eseguita dal modello stesso.
- L'output del modello non può essere rappresentato correttamente nei dati tabulari. Ad esempio, si tratta di un tensore che rappresenta un'immagine.
Importante
Se si sceglie di specificare uno script di assegnazione dei punteggi per una distribuzione del modello MLflow, sarà necessario specificare anche l'ambiente in cui verrà eseguita la distribuzione.
Passaggi
Per distribuire un modello MLflow con uno script di assegnazione dei punteggi personalizzato:
Identificare la cartella in cui si trova il modello MLflow.
a. Passare ad Azure Machine Learning Studio.
b. Passare alla sezione Modelli.
c. Selezionare il modello che si sta tentando di distribuire e passare alla scheda Artefatti.
d. Prendere nota della cartella visualizzata. Questa cartella è stata specificata al momento della registrazione del modello.
Creare uno script di assegnazione del punteggio. Si noti che il nome della cartella
model
identificato in precedenza è incluso nella funzioneinit()
.Suggerimento
Lo script di assegnazione dei punteggi seguente viene fornito come esempio su come eseguire l'inferenza con un modello MLflow. È possibile adattare questo script alle proprie esigenze o modificare una delle relative parti in modo da riflettere lo scenario.
score.py
import logging import os import json import mlflow from io import StringIO from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json def init(): global model global input_schema # "model" is the path of the mlflow artifacts when the model was registered. For automl # models, this is generally "mlflow-model". model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model") model = mlflow.pyfunc.load_model(model_path) input_schema = model.metadata.get_input_schema() def run(raw_data): json_data = json.loads(raw_data) if "input_data" not in json_data.keys(): raise Exception("Request must contain a top level key named 'input_data'") serving_input = json.dumps(json_data["input_data"]) data = infer_and_parse_json_input(serving_input, input_schema) predictions = model.predict(data) result = StringIO() predictions_to_json(predictions, result) return result.getvalue()
Avviso
avviso MLflow 2.0: lo script di assegnazione dei punteggi fornito funzionerà sia con MLflow 1.X sia con MLflow 2.X. È tuttavia consigliabile che i formati di input/output previsti in tali versioni possano variare. Controllare la definizione dell'ambiente usata per assicurarsi di usare la versione prevista di MLflow. Si noti che MLflow 2.0 è supportato solo in Python 3.8+.
Creare un ambiente in cui è possibile eseguire lo script di assegnazione dei punteggi. Poiché il modello è un modello MLflow, i requisiti di conda vengono specificati anche nel pacchetto del modello. Per altre informazioni sui file inclusi in un modello MLflow, vedere Il formato MLmodel. Si compilerà quindi l'ambiente usando le dipendenze conda dal file. È tuttavia necessario includere anche il pacchetto
azureml-inference-server-http
, necessario per le distribuzioni online in Azure Machine Learning.Il file di definizione conda è il seguente:
conda.yml
channels: - conda-forge dependencies: - python=3.9 - pip - pip: - mlflow - scikit-learn==1.2.2 - cloudpickle==2.2.1 - psutil==5.9.4 - pandas==2.0.0 - azureml-inference-server-http name: mlflow-env
Nota
Il pacchetto
azureml-inference-server-http
è stato aggiunto al file di dipendenze conda originale.Questo file di dipendenze conda verrà usato per creare l'ambiente:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
L'ambiente verrà creato inline nella configurazione della distribuzione.
Creare la distribuzione:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
Creare un file di configurazione della distribuzione deployment.yml:
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: sklearn-diabetes-custom endpoint_name: my-endpoint model: azureml:sklearn-diabetes@latest environment: image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04 conda_file: sklearn-diabetes/environment/conda.yml code_configuration: code: sklearn-diabetes/src scoring_script: score.py instance_type: Standard_F2s_v2 instance_count: 1
Creare la distribuzione:
az ml online-deployment create -f deployment.yml
Al termine della distribuzione, è pronto per gestire le richieste. Un modo per testare la distribuzione consiste nell'usare un file di richiesta di esempio insieme al metodo
invoke
.sample-request-sklearn.json
{"input_data": { "columns": [ "age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6" ], "data": [ [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ], [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0] ], "index": [0,1] }}
Inviare una richiesta all'endpoint come indicato di seguito:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json
La risposta sarà simile al testo seguente:
{ "predictions": [ 11633.100167144921, 8522.117402884991 ] }
Avviso
Avviso MLflow 2.0: in MLflow 1.X la chiave
predictions
non sarà presente.
Pulire le risorse
Al termine dell'uso dell'endpoint, eliminare le risorse associate:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (MLflow SDK)
- Studio
az ml online-endpoint delete --name $ENDPOINT_NAME --yes