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:

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:


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>

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.

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.

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

  1. Configurare l'endpoint in cui verrà distribuito il modello. L'esempio seguente configura il nome e la modalità di autenticazione dell'endpoint:

    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
    
  2. Creare l'endpoint:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Configurare la distribuzione. Per distribuzione si intende un set di risorse necessarie per ospitare il modello che esegue l'inferenza effettiva.

    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: 1
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Nota

    La generazione automatica dei scoring_script e dei environment è supportata solo per versione del modello pyfunc. Per usare un modello diverso, vedere Personalizzazione delle distribuzioni di modelli MLflow.

  4. Creare la distribuzione:

    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
    
  5. Assegnare tutto il traffico alla distribuzione. Finora, l'endpoint ha una distribuzione, ma nessuna parte del suo traffico viene assegnato ad esso.

    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 comando az ml online-endpoint update --traffic. Per altre informazioni su come aggiornare il traffico, vedere Aggiornare progressivamente il traffico.

  6. Aggiornare la configurazione dell'endpoint:

    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 comando az 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:

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:

  1. 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.

    Screenshot showing the folder where the model artifacts are placed.

  2. Creare uno script di assegnazione del punteggio. Si noti che il nome della cartella model identificato in precedenza è incluso nella funzione init().

    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+.

  3. 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:

    L'ambiente verrà creato inline nella configurazione della distribuzione.

  4. Creare la distribuzione:

    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
    
  5. 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:

    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:

az ml online-endpoint delete --name $ENDPOINT_NAME --yes