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 MLflow in Azure Machine Learning per inferenza in tempo reale e batch. Informazioni anche sui diversi strumenti che è possibile usare per gestire la distribuzione.

Distribuzione di modelli MLflow e modelli personalizzati

A differenza della distribuzione di modelli personalizzati in Azure Machine Learning, quando si distribuiscono modelli MLflow in Azure Machine Learning, non è necessario fornire uno script di assegnazione dei punteggi o un ambiente per la distribuzione. Azure Machine Learning genera invece 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 del pacchetto indicate nel modello MLflow siano soddisfatte.
  • Fornisce un'immagine di base MLflow o un ambiente curato che contiene gli elementi seguenti:
    • I pacchetti necessari per Azure Machine Learning per eseguire l'inferenza, incluso 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 in modo dinamico i pacchetti Python necessari per i modelli MLflow.

Pacchetti e dipendenze Python

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 seguente mostra un esempio di dipendenze conda specificate in un modello MLflow.

conda.yaml

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

Avviso

MLflow rileva automaticamente i pacchetti durante la registrazione di un modello e aggiunge le versioni del pacchetto nelle dipendenze conda del modello. Tuttavia, questo rilevamento automatico dei pacchetti potrebbe non riflettere sempre le intenzioni o i requisiti. In questi casi, prendere in considerazione la registrazione dei modelli con una definizione di dipendenze conda personalizzata.

Implicazioni dell'uso di 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 impone 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 avrà esito negativo.

È possibile esaminare la firma di un modello MLflow aprendo il file MLmodel associato al modello. Per altre informazioni sul funzionamento delle firme in MLflow, vedere Firme in MLflow.

Il file seguente mostra il file MLmodel associato a un modello MLflow.

MLmodel

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 facoltative ma altamente consigliate, perché offrono un modo pratico per rilevare tempestivamente i problemi di compatibilità dei dati. Per altre informazioni su come registrare modelli con firme, vedere Registrazione di modelli con una firma personalizzata, un ambiente o esempi.

Modelli distribuiti in Azure Machine Learning e modelli distribuiti nel server predefinito MLflow

MLflow include strumenti di distribuzione predefiniti che gli sviluppatori di modelli possono usare per testare i modelli in locale. Ad esempio, è possibile eseguire un'istanza locale di un modello registrato nel Registro di sistema del server MLflow usando mlflow models serve -m my_model o usando l'interfaccia della riga di comando di MLflow mlflow models predict.

Inferenza con endpoint batch e online

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

Gli endpoint online sono simili al server predefinito MLflow in quanto forniscono un modo scalabile, sincrono e leggero per eseguire modelli per l'inferenza.

D'altra parte, gli endpoint batch sono in grado di eseguire l'inferenza asincrona su processi di inferenza a esecuzione prolungata che possono essere ridimensionati a grandi quantità di dati. Il server MLflow attualmente non dispone di 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.

Le sezioni che seguono si concentrano maggiormente sui modelli MLflow distribuiti negli endpoint online di Azure Machine Learning.

Formati di input

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 batch1
Formato di input tensor come elenchi serializzati JSON (tensori) e dizionario di elenchi (tensori denominati)
Input tensor formattato come nell'API di TF Serving

1 Prendere in considerazione l'uso dell'inferenza batch per elaborare i file. Per altre informazioni, vedere Distribuire modelli MLflow in endpoint batch.

Struttura di input

Indipendentemente dal tipo di input usato, Azure Machine Learning richiede di fornire input in un payload JSON, all'interno della chiave input_datadel dizionario . Poiché questa chiave non è necessaria quando si usa il comando mlflow models serve per gestire i modelli, i payload non possono essere usati in modo intercambiabile per gli endpoint online di Azure Machine Learning e il server predefinito MLflow.

Importante

Avviso MLflow 2.0: si noti che la struttura del payload è cambiata in MLflow 2.0.

Questa sezione illustra diversi esempi di payload e le differenze per un modello distribuito nel server predefinito MLflow rispetto al server di inferenza di Azure Machine Learning.

Esempio di payload per un dataframe pandas serializzato JSON nell'orientamento di divisione

{
    "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]
        ]
    }
}

Esempio di payload per un 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]
    ]
}

Esempio di payload per un input denominato-tensor

{
    "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]
        ]
    }
}

Per altre informazioni sugli strumenti di distribuzione predefiniti di MLflow, vedere Strumenti di distribuzione predefiniti nella documentazione di MLflow.

Personalizzare l'inferenza durante la distribuzione di modelli MLflow

È possibile usare per creare script di assegnazione dei punteggi per personalizzare la modalità di esecuzione dell'inferenza per i modelli personalizzati. Tuttavia, quando si distribuiscono modelli MLflow in Azure Machine Learning, la decisione su come eseguire l'inferenza viene eseguita dal generatore di modelli (la persona che ha compilato il modello), anziché dal tecnico DevOps (la persona che sta provando a distribuirlo). Ogni framework del modello può applicare automaticamente routine di inferenza specifiche.

In qualsiasi momento, se è necessario modificare la modalità di esecuzione dell'inferenza di un modello MLflow, è possibile eseguire una delle due 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, il sapore usato per il modello decide come eseguire l'inferenza e quali risultati restituisce il modello. MLflow non applica alcun comportamento specifico per il modo in cui la predict() funzione genera i risultati.

In alcuni casi, tuttavia, potrebbe essere necessario eseguire alcune operazioni di pre-elaborazione o post-elaborazione prima e dopo l'esecuzione del modello. In altri casi, è possibile modificare ciò che viene restituito (ad esempio, probabilità e 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 considerazioni sulle prestazioni. Un'altra alternativa consiste nel personalizzare il modo in cui il modello esegue l'inferenza, usando un modello personalizzato.

Personalizzare l'inferenza con uno script di assegnazione dei punteggi

Anche se i modelli MLflow non richiedono uno script di assegnazione dei punteggi, è comunque possibile specificarne uno, se necessario. È possibile usare lo script di assegnazione dei punteggi per personalizzare la modalità di esecuzione dell'inferenza per i modelli MLflow. Per altre informazioni su come personalizzare l'inferenza, vedere Personalizzazione delle distribuzioni di modelli MLflow (endpoint online) e Personalizzazione delle distribuzioni di modelli MLflow (endpoint batch).

Importante

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

Strumenti di distribuzione

Azure Machine Learning offre molti modi per distribuire modelli MLflow in endpoint online e batch. È possibile distribuire i modelli usando gli strumenti seguenti:

  • MLflow SDK
  • Interfaccia della riga di comando di Azure Machine Learning
  • Azure Machine Learning SDK per Python
  • Studio di Azure Machine Learning

Ogni flusso di lavoro ha funzionalità diverse, in particolare per il tipo di calcolo di destinazione. La tabella seguente illustra le diverse funzionalità.

Scenario MLflow SDK Interfaccia della riga di comando di Azure Machine Learning/SDK Studio di Azure Machine Learning
Eseguire la distribuzione in endpoint online gestiti Vedere l'esempio1 Vedere l'esempio1 Vedere l'esempio1
Eseguire la distribuzione in endpoint online gestiti (con uno script di assegnazione dei punteggi) Non supportato3 Vedere l'esempio Vedere l'esempio
Eseguire la distribuzione in endpoint batch Non supportato3 Vedere l'esempio Vedere l'esempio
Eseguire la distribuzione in endpoint batch (con uno script di assegnazione dei punteggi) Non supportato3 Vedere l'esempio Vedere l'esempio
Eseguire la distribuzione nei servizi Web (ACI/servizio Azure Kubernetes) Supportolegacy 2 Non supportato2 Non supportato2
Eseguire la distribuzione nei servizi Web (ACI/servizio Azure Kubernetes- con uno script di assegnazione dei punteggi) Non supportato3 Supportolegacy 2 Supportolegacy 2

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 È consigliabile passare agli endpoint online gestiti.

3 MLflow (OSS) non ha il concetto di script di assegnazione dei punteggi e attualmente non supporta l'esecuzione batch.

Quale strumento di distribuzione usare?

  • Usare MLflow SDK se si applicano entrambe le condizioni seguenti:

    • Si ha familiarità con MLflow o si usa una piattaforma che supporta MLflow in modo nativo, ad esempio Azure Databricks.
    • Si vuole continuare a usare lo stesso set di metodi di MLflow.
  • Usare l'interfaccia della riga di comando di Azure Machine Learning v2 se si applica una di queste condizioni:

    • Si ha familiarità con l'interfaccia della riga di comando di Azure Machine Learning v2.
    • Si vogliono automatizzare le distribuzioni usando le pipeline di automazione.
    • Si vuole mantenere la configurazione della distribuzione in un repository Git.
  • Usare la distribuzione dell'interfaccia utente studio di Azure Machine Learning se si vuole distribuire e testare rapidamente i modelli sottoposti a training con MLflow.