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:

Connettersi all'area di lavoro

Connettersi prima di tutto all'area di lavoro di Azure Machine Learning in cui si lavorerà.

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:

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.

  1. Gli endpoint richiedono un nome, che deve essere univoco nella stessa area. Assicurarsi di crearne uno che non esista già:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Configurare l'endpoint

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Creare l'endpoint:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Recupero del segreto di autenticazione per l'endpoint.

    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.

  1. Configurare la distribuzione

    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
    
  2. Creare la distribuzione

    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.

  3. Assegnare tutto il traffico alla distribuzione

    Finora, l'endpoint dispone di una distribuzione, ma il traffico non viene assegnato ad esso. Assegnarlo.

    Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, poiché è stato usato --all-traffic durante la creazione.

  4. Aggiornare la configurazione dell'endpoint:

    Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure, poiché è stato usato --all-traffic durante la creazione.

  5. Creare un input di esempio per testare la distribuzione

    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" ]
            ]
        }
    }
    
  6. Testare la distribuzione

    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.

  1. Registrare una nuova versione del modello

    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")
    
  2. Configurare una nuova distribuzione

    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"
    
  3. Creare la nuova distribuzione

    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
    
  4. Testare la distribuzione senza modificare il traffico

    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:

  1. Configurare il traffico:

    Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure

  2. Aggiornare l'endpoint

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Se si decide di passare l'intero traffico alla nuova distribuzione, aggiornare tutto il traffico:

    Questo passaggio non è necessario nell'interfaccia della riga di comando di Azure

  4. Aggiornare l'endpoint

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Poiché la distribuzione precedente non riceve traffico, è possibile eliminarla in modo sicuro:

    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

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.

Passaggi successivi