Implementazione progressiva di modelli MLflow in endpoint online
In questo articolo, viene illustrato come aggiornare e distribuire in modo progressivo modelli MLflow in endpoint online senza causare interruzioni del servizio. Viene usata la distribuzione blue-green, detta anche strategia di implementazione sicura, per introdurre la nuova versione di un servizio Web in produzione. Questa strategia consentirà di implementare la nuova versione del servizio Web in un piccolo subset di utenti o di richieste prima di implementarla completamente.
Informazioni su questo esempio
Gli endpoint online comprendono il concetto di endpoint e distribuzione. Un endpoint rappresenta l'API usata dai clienti per utilizzare il modello, mentre la distribuzione indica l'implementazione specifica di tale API. Questa distinzione consente agli utenti di separare l'API dall'implementazione e di modificare l'implementazione sottostante senza influire sul consumer. Questo esempio userà tali concetti per aggiornare il modello distribuito negli endpoint senza provocare interruzioni del servizio.
Il modello che verrà distribuito si basa sul set di dati UCI Heart Disease. Il database contiene 76 attributi, ma viene usato un subset di 14 attributi. Il modello cerca di prevedere la presenza di una malattia cardiaca in un paziente. È un valore intero compreso tra 0 (assenza) e 1 (presenza). È stato eseguito il training usando un classificatore XGBBoost
e tutta la pre-elaborazione necessaria è stata inserita in un pacchetto come pipeline scikit-learn
, 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 o incollare file, è possibile clonare il repository e quindi modificare le directory in sdk/using-mlflow/deploy
.
Seguire la procedura in Jupyter Notebooks
È possibile seguire questo esempio nei notebook seguenti. Nel repository clonato aprire, il notebook: mlflow_sdk_online_endpoints_progresive.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.
- 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 oppure un ruolo personalizzato che consenta "Microsoft.MachineLearningServices/workspaces/onlineEndpoints/". Per altre informazioni, vedere Gestire l'accesso a un'area di lavoro di Azure Machine Learning.
Sarà inoltre necessario:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
- Installare l'interfaccia della riga di comando di Azure e l'estensione di Machine Learning nell'interfaccia della riga di comando di Azure. Per altre informazioni, vedere Installare, configurare e usare 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 (SDK di MLflow)
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Registrazione del modello nel registro
Verificare che il modello sia registrato nel registro di Azure Machine Learning. La distribuzione di modelli non registrati non è supportata in Azure Machine Learning. È possibile registrare un nuovo modello usando l'SDK di MLflow:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Creare un endpoint online
Gli endpoint online sono endpoint usati per l'inferenza online (in tempo reale). Gli endpoint online contengono distribuzioni pronte a ricevere dati dai client e in grado di inviare risposte in tempo reale.
Questa funzionalità verrà sfruttata se si distribuiscono più versioni dello stesso modello nello stesso endpoint. Tuttavia, la nuova distribuzione riceverà lo 0% del traffico in corrispondenza dell'assegnazione di tag. Una volta verificato il corretto funzionamento del nuovo modello, il traffico verrà spostato progressivamente da una distribuzione all'altra.
Gli endpoint richiedono un nome, che deve essere univoco nella stessa area. Assicurarsi di crearne uno che non esista già:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1) ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
Configurare l'endpoint
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: heart-classifier-edp auth_mode: key
Creare l'endpoint:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Recupero del segreto di autenticazione per l'endpoint.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
Creare una distribuzione blu
Finora l'endpoint è vuoto. Non sono presenti distribuzioni. Si creerà la prima distribuendo lo stesso modello su cui si stava lavorando in precedenza. Questa distribuzione verrà denominata "default", che rappresenta la distribuzione blu.
Configurare la distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
blue-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: default endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Creare la distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Se l'endpoint non dispone di connettività in uscita, usare la creazione di pacchetti di modelli (anteprima) includendo il flag
--with-package
:az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Suggerimento
Si imposta il flag
--all-traffic
nel comando Crea, che assegnerà tutto il traffico alla nuova distribuzione.Assegnare tutto il traffico alla distribuzione
Finora, l'endpoint dispone di una distribuzione, ma il traffico non viene assegnato ad esso. Assegnarlo.
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, poiché è stato usato
--all-traffic
durante la creazione.Aggiornare la configurazione dell'endpoint:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, poiché è stato usato
--all-traffic
durante la creazione.Creare un input di esempio per testare la distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
sample.yml
{ "input_data": { "columns": [ "age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal" ], "data": [ [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ] ] } }
Testare la distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
Creare una distribuzione verde nell'endpoint:
Si supponga di avere una nuova versione del modello creata dal team di sviluppo e che sia pronta per essere prodotta. È prima possibile provare a utilizzare questo modello e, una volta ottenuta familiarità, è possibile aggiornare l'endpoint per instradare il traffico a esso.
Registrare una nuova versione del modello
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
MODEL_NAME='heart-classifier' az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Ottenere il numero di versione del nuovo modello:
VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
Configurare una nuova distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
green-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: xgboost-model endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Denominare la distribuzione come indicato di seguito:
GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
Creare la nuova distribuzione
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Se l'endpoint non dispone di connettività in uscita, usare la creazione di pacchetti di modelli (anteprima) includendo il flag
--with-package
:az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Testare la distribuzione senza modificare il traffico
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
Suggerimento
Si noti come ora si indica il nome della distribuzione che si vuole richiamare.
Aggiornare progressivamente il traffico
Una volta che si è acquisita familiarità con la nuova distribuzione, è possibile aggiornare il traffico per instradarne alcuni alla nuova distribuzione. Il traffico viene configurato a livello di endpoint:
Configurare il traffico:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure
Aggiornare l'endpoint
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
Se si decide di passare l'intero traffico alla nuova distribuzione, aggiornare tutto il traffico:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure
Aggiornare l'endpoint
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
Poiché la distribuzione precedente non riceve traffico, è possibile eliminarla in modo sicuro:
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
Suggerimento
Si noti che a questo punto, la precedente "distribuzione blu" è stata eliminata e la nuova "distribuzione verde" ha preso il posto della "distribuzione blu".
Pulire le risorse
- Interfaccia della riga di comando di Azure
- Python (SDK di Azure Machine Learning)
- Python (SDK di MLflow)
az ml online-endpoint delete --name $ENDPOINT_NAME --yes
Importante
Si noti che l'eliminazione di un endpoint elimina anche tutte le distribuzioni al suo interno.