Condividi tramite


Linee guida per la distribuzione di modelli MLflow

SI APPLICA A: estensione ML dell'interfaccia della riga di comando di Azure v2 (corrente)

In questo articolo vengono fornite informazioni sulla distribuzione di modelli di MLflow in Azure Machine Learning per inferenza in tempo reale e batch e su diversi strumenti che è possibile usare per gestire le distribuzioni.

Distribuzione senza codice

Quando si distribuiscono modelli di MLflow in Azure Machine Learning, a differenza della distribuzione di modelli personalizzati, non è necessario fornire uno script di assegnazione dei punteggi o un ambiente. Azure Machine Learning genera automaticamente lo script di assegnazione dei punteggi e l'ambiente. Questa funzionalità è denominata distribuzione senza codice.

Per la distribuzione senza codice, Azure Machine Learning:

  • Assicura che tutte le dipendenze dei pacchetti indicate nel modello MLflow siano soddisfatte.
  • Fornisce un ambiente di base p immagine curata di MLflow che contiene gli elementi seguenti:
    • Pacchetti necessari per Azure Machine Learning per eseguire l'inferenza, tra cui mlflow-skinny.
    • Script di assegnazione dei punteggi per eseguire 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.

Pacchetti e dipendenze

Azure Machine Learning genera automaticamente gli ambienti per l'esecuzione dell'inferenza nei modelli MLflow. Per compilare gli ambienti, Azure Machine Learning legge le dipendenze conda specificate nel modello MLflow e aggiunge tutti i pacchetti necessari per eseguire il server di inferenza. Questi pacchetti aggiuntivi variano a seconda del tipo di distribuzione.

Il file conda.yaml di esempio seguente mostra le dipendenze Conda specificate in un modello di MLflow.

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

Importante

MLflow rileva automaticamente i pacchetti durante la registrazione di un modello e aggiunge le loro versioni nelle dipendenze Conda del modello. Questo rilevamento automatico dei pacchetti potrebbe non riflettere sempre le intenzioni o i requisiti dell'utente. In alternativa, è possibile registrare modelli con una firma, un ambiente o esempi personalizzati.

Modelli con firme

I modelli MLflow possono includere una firma che indica gli input previsti e i relativi tipi. Quando tali modelli vengono distribuiti in endpoint online o batch, Azure Machine Learning garantisce che il numero e i tipi di input dei dati siano conformi alla firma. Se i dati di input non possono essere analizzati come previsto, la chiamata al modello ha esito negativo.

È possibile esaminare una firma del modello di MLflow aprendo il file MLmodel. Per altre informazioni sul funzionamento delle firme in MLflow, vedere Firme in MLflow.

Il file MLmodel di esempio seguente evidenzia signature.

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

Suggerimento

Le firme nei modelli MLflow sono consigliate perché offrono un modo pratico per rilevare i problemi di compatibilità dei dati. Per altre informazioni su come registrare modelli con firme, vedere Registrazione di modelli con una firma, un ambiente o esempi personalizzati.

Distribuzione nel server predefinito di MLflow rispetto alla distribuzione nel server di inferenza di Azure Machine Learning

Gli sviluppatori di modelli possono usare strumenti di distribuzione predefiniti di MLflow per testare i modelli in locale. Ad esempio, è possibile eseguire un'istanza locale di un modello registrato nel registro del server MLflow usando mlflow models serve o l'interfaccia della riga di comando di MLflow mlflow models predict. Per altre informazioni sugli strumenti di distribuzione predefiniti di MLflow, vedere Strumenti di distribuzione predefiniti nella documentazione di MLflow.

Azure Machine Learning supporta anche la distribuzione di modelli in endpoint online e batch. Questi endpoint eseguono tecnologie di inferenza differenti che possono avere funzionalità diverse.

  • Gli endpoint online di Azure Machine Learning, simili al server predefinito di MLflow, offrono un modo scalabile, sincrono e leggero per eseguire modelli per l'inferenza.

  • Gli endpoint batch di Azure Machine Learning possono eseguire l'inferenza asincrona su processi di inferenza a esecuzione prolungata che possono essere ridimensionati fino a grandi quantità di dati. Il server di MLflow non ha questa funzionalità, anche se è possibile ottenere una funzionalità simile usando processi Spark. Per altre informazioni sugli endpoint batch e sui modelli MLflow, vedere Usare modelli MLflow nelle distribuzioni batch.

Formati di input

La tabella seguente illustra i tipi di input supportati dal server predefinito di MLflow rispetto agli endpoint online di Azure Machine Learning.

Input type Server predefinito MLflow Endpoint online di Azure Machine Learning
DataFrame pandas serializzati JSON nell'orientamento di divisione
DataFrame pandas serializzati JSON nell'orientamento dei record Deprecato
DataFrame pandas serializzati CSV Usare l'inferenza batch. Per altre informazioni, vedere Distribuire modelli MLflow in endpoint batch.
Input TensorFlow come elenchi serializzati JSON (tensori) e dizionario di elenchi (tensori denominati)
Input TensorFlow con l'API TensorFlow Serving

Le sezioni seguenti sono incentrate sui modelli di MLflow distribuiti negli endpoint online di Azure Machine Learning.

Struttura di input

Indipendentemente dal tipo di input, Azure Machine Learning richiede di fornire input in un payload JSON nella chiave del dizionario input_data. Questa chiave non è necessaria quando si usa il comando mlflow models serve per gestire i modelli, quindi i payload non possono essere usati in modo intercambiabile per gli endpoint online di Azure Machine Learning e il server predefinito di MLflow.

Importante

La struttura del payload è stata modificata in MLflow 2.0.

Gli esempi di payload seguenti mostrano differenze tra un modello distribuito nel server predefinito di MLflow rispetto al server di inferenza di Azure Machine Learning.

DataFrame Pandas con serializzazione JSON nell'orientamento suddiviso

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

Input tensor

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

Input tensore denominato

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

Personalizzazione dell'inferenza per i modelli di MLflow

Gli script di assegnazione dei punteggi personalizzano la modalità di esecuzione dell'inferenza per i modelli personalizzati. Tuttavia, per la distribuzione del modello di MLflow, la decisione su come eseguire l'inferenza viene presa dal generatore di modelli anziché dal tecnico della distribuzione. Ogni framework del modello può applicare automaticamente routine di inferenza specifiche.

Se è necessario modificare la modalità di esecuzione dell'inferenza per un modello di MLflow, è possibile eseguire una delle operazioni seguenti:

  • Modificare la modalità di registrazione del modello nella routine di training.
  • Personalizzare l'inferenza con uno script di assegnazione dei punteggi in fase di distribuzione.

Modificare la modalità di registrazione del modello durante il training

Quando si registra un modello usando mlflow.autolog o mlflow.<flavor>.log_model, la versione usata per il modello determina come eseguire l'inferenza e i risultati da restituire. MLflow non applica alcun comportamento specifico per il modo in cui la funzione predict() genera i risultati.

In alcuni casi è possibile che si vogliano eseguire alcune operazioni di pre-elaborazione o post-elaborazione prima e dopo l'esecuzione del modello. In alternativa, potrebbe essere necessario modificare ciò che viene restituito, ad esempio probabilità anziché classi. Una soluzione consiste nell'implementare pipeline di Machine Learning che passano direttamente dagli input agli output.

Ad esempio, sklearn.pipeline.Pipeline o pyspark.ml.Pipeline sono modi comuni per implementare le pipeline e a volte sono consigliati per motivi relativi alle prestazioni. È anche possibile personalizzare il modo in cui il modello esegue l'inferenza registrando modelli personalizzati.

Personalizzare l'inferenza con uno script di assegnazione dei punteggi

Anche se i modelli di MLflow non richiedono uno script di assegnazione dei punteggi, è comunque possibile specificarne uno per personalizzare l'esecuzione dell'inferenza per i modelli di MLflow, se necessario. Per altre informazioni su come personalizzare l'inferenza, vedere Personalizzare le distribuzioni del modello di MLflow per gli endpoint online o Personalizzare la distribuzione del modello con lo script di assegnazione dei punteggi per gli endpoint batch.

Importante

Se si sceglie di specificare uno script di assegnazione dei punteggi per una distribuzione del modello MLflow, è anche necessario fornire un ambiente per la distribuzione.

Strumenti di distribuzione

Azure Machine Learning offre gli strumenti seguenti per distribuire modelli di MLflow in endpoint online e batch:

Ogni strumento ha funzionalità diverse, in particolare per il tipo di ambiente di calcolo a cui può essere destinato. La tabella seguente illustra il supporto per diversi scenari di distribuzione di MLflow.

Scenario MLflow SDK Interfaccia della riga di comando di Azure Machine Learning, SDK o studio
Eseguire la distribuzione in endpoint online gestiti1 Supportata. Vedere Implementazione progressiva dei modelli di MLflow in endpoint online Supportata. Vedere Distribuire modelli di MLflow negli endpoint online
Eseguire la distribuzione in endpoint online gestiti con uno script di assegnazione dei punteggi Non supportato3 Supportata. Vedere Personalizzare le distribuzioni del modello di MLflow
Distribuisci agli endpoint batch Non supportato3 Supportata. Vedere Usare modelli di MLflow nelle distribuzioni in batch
Eseguire la distribuzione in endpoint batch con uno script di assegnazione dei punteggi Non supportato3 Supportata. Vedere Personalizzare la distribuzione del modello con lo script di assegnazione dei punteggi
Eseguire la distribuzione in servizi Web come Istanze di Azure Container o il servizio Azure Kubernetes Supporto legacy2 Non supportato2
Eseguire la distribuzione in servizi Web come Istanze di Container o il servizio Azure Kubernetes con uno script di assegnazione dei punteggi Non supportato3 Supporto legacy2

1 La distribuzione in endpoint online presenti in aree di lavoro con collegamento privato abilitato richiede di creare pacchetti di modelli prima della distribuzione (anteprima).

2 Passare a endpoint online gestiti, se possibile.

3 MLflow open source non comprende il concetto di script di assegnazione dei punteggi e attualmente non supporta l'esecuzione batch.

Scegliere uno strumento di distribuzione

Usare MLflow SDK se:

  • Si ha familiarità con MLflow e si vuole continuare a usare gli stessi metodi e
  • Si usa una piattaforma come Azure Databricks che supporta MLflow in modo nativo.

Usare l'interfaccia della riga di comando di Azure Machine Learning v2 o l'SDK per Python se:

  • Si ha familiarità con questo approccio o
  • Si vuole automatizzare la distribuzione con le pipeline o
  • Si vuole mantenere la configurazione della distribuzione in un repository Git.

Usare l'interfaccia utente dello studio di Azure Machine Learning se si vuole distribuire e testare rapidamente i modelli sottoposti a training con MLflow.