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 l'inferenza in tempo reale e batch. Sono inoltre disponibili informazioni 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 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 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 seguente file conda.yaml 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 loro versioni 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 di 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, poiché 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, un ambiente o esempi personalizzati.

Modelli distribuiti in Azure Machine Learning rispetto a modelli distribuiti nel server predefinito MLflow

MLflow comprende 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 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 differenti 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 è possibile ridimensionare a grandi quantità di dati. Al momento il server MLflow non dispone di questa funzionalità, anche se è possibile ottenere una capacità 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 Usa batch1
Formato di input di tensori come elenchi serializzati JSON (tensori) e dizionario di elenchi (tensori denominati)
Input di tensori 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 del dizionario input_data. Poiché tale 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 su 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 di tensori

{
    "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 di tensori denominati

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

Si può essere abituati a 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 potrebbe 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, la versione usata 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 funzione predict() genera i risultati.

Tuttavia, in alcuni casi è possibile 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à rispetto a 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 per mezzo di 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 ulteriori 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, è anche necessario fornire un ambiente per la distribuzione.

Strumenti di distribuzione

Azure Machine Learning offre diversi modi per distribuire modelli MLflow in endpoint online e batch. È possibile distribuire i modelli con 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
Distribuisci agli 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 (servizio Azure Container/servizio Azure Kubernetes) Supporto legacy2 Non supportato2 Non supportato2
Eseguire la distribuzione nei servizi Web (servizio Azure Container/servizio Azure Kubernetes - con uno script di assegnazione dei punteggi) Non supportato3 Supporto legacy2 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 È consigliabile passare agli endpoint online gestiti.

3 MLflow (software open source) non comprende 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 desidera 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 desidera automatizzare le distribuzioni usando le pipeline di automazione.
    • Si desidera mantenere la configurazione della distribuzione in un repository Git.
  • Usare la distribuzione dell'interfaccia utente di Studio di Azure Machine Learning se si desidera distribuire e testare rapidamente i modelli sottoposti a training con MLflow.