Condividi tramite


Artefatti e modelli in MLflow

Questo articolo illustra gli artefatti MLflow e i modelli MLflow e il modo in cui i modelli MLflow differiscono da altri artefatti. L'articolo illustra anche in che modo Azure Machine Learning usa le caratteristiche di un modello MLflow per abilitare flussi di lavoro di distribuzione semplificati.

Artefatti e modelli

In MLflow esistono alcune differenze fondamentali tra la registrazione di semplici artefatti di file e la registrazione di modelli MLflow.

Artefatto

Un artefatto è qualsiasi file generato e acquisito dall'esecuzione o dal processo di un esperimento. Un artefatto può essere un modello serializzato come file pickle, i pesi di un modello PyTorch o TensorFlow o un file di testo contenente i coefficienti di una regressione lineare. Alcuni artefatti non hanno nulla a che fare con il modello stesso, ma contengono configurazioni di esecuzione, informazioni di pre-elaborazione o dati di esempio. Gli artefatti possono avere diversi formati.

Nell'esempio seguente viene registrato un artefatto di file.

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

Modello

Un modello MLflow è un artefatto per il quale si effettuano presupposti più forti che forniscono un contratto chiaro tra i file salvati e ciò che significano. Se, tuttavia, si registrano i file del modello semplicemente come artefatti, è necessario conoscere il significato di ognuno dei file e come caricarli per l'inferenza.

È possibile registrare i modelli MLflow usando MLflow SDK, ad esempio:

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

La registrazione dei modelli MLflow in Azure Machine Learning offre i vantaggi seguenti:

  • È possibile distribuire modelli MLflow in endpoint in tempo reale o batch senza fornire uno script di assegnazione dei punteggi o un ambiente.
  • Quando si distribuiscono modelli MLflow, le distribuzioni generano automaticamente un file swagger, in modo da poter usare la funzionalità Test in studio di Azure Machine Learning.
  • È possibile usare i modelli MLflow direttamente come input della pipeline.
  • È possibile usare il dashboard Di intelligenza artificiale responsabile con i modelli MLflow.

Formato MLmodel

Per i modelli registrati come file di artefatti semplici, è necessario conoscere il generatore di modelli destinato a ogni file prima di poter caricare il modello per l'inferenza. Per i modelli MLflow, tuttavia, si carica il modello usando il formato MLmodel per specificare il contratto tra gli artefatti e ciò che rappresentano.

Il formato MLmodel archivia gli asset in una cartella senza requisiti di denominazione specifici. Tra gli asset è presente un file denominato MLmodel che rappresenta l'unica origine di verità per il caricamento e l'uso del modello.

L'immagine seguente mostra una cartella del modello MLflow denominata credit_defaults_model in studio di Azure Machine Learning. La cartella contiene il file MLmodel e altri artefatti del modello.

Screenshot che mostra gli asset di un modello MLflow di esempio, incluso il file MLmodel.

L'esempio seguente mostra un file MLmodel per un modello di visione artificiale sottoposto a training con fastai:

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Versioni del modello

Considerando il numero elevato di framework di Machine Learning disponibili, MLflow ha introdotto il concetto di flavor come un modo per fornire un contratto univoco per tutti i framework di Machine Learning. Un sapore indica cosa aspettarsi per un determinato modello creato con un framework specifico. Ad esempio, TensorFlow ha un proprio sapore, che specifica come rendere persistente e caricare un modello TensorFlow.

Poiché ogni tipo di modello indica come rendere persistente e caricare il modello per un determinato framework, il formato MLmodel non applica un singolo meccanismo di serializzazione che tutti i modelli devono supportare. Pertanto, ogni sapore può usare i metodi che forniscono le migliori prestazioni o il miglior supporto in base alle procedure consigliate, senza compromettere la compatibilità con lo standard MLmodel.

Nell'esempio seguente viene illustrata la flavors sezione relativa a un fastai modello.

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

Firma del modello

Una firma del modello MLflow è una parte importante della specifica del modello, perché funge da contratto dati tra il modello e il server che esegue il modello. Una firma del modello è importante anche per l'analisi e l'applicazione dei tipi di input di un modello in fase di distribuzione. Se è disponibile una firma, MLflow applica i tipi di input quando i dati vengono inviati al modello. Per altre informazioni, vedere applicazione della firma MLflow.

Le firme sono indicate al momento della registrazione dei modelli e vengono mantenute nella signature sezione del file MLmodel . La funzionalità Di log automatico in MLflow fa automaticamente il massimo sforzo per dedurre le firme. Tuttavia, è possibile registrare manualmente i modelli se le firme dedotte non sono quelle necessarie. Per altre informazioni, vedere Come registrare i modelli con firme.

Esistono due tipi di firme:

  • Le firme basate su colonne operano su dati tabulari . Per i modelli con questo tipo di firma, MLflow fornisce pandas.DataFrame oggetti come input.
  • Le firme basate su tensor funzionano con matrici o tensori n-dimensionali. Per i modelli con questa firma, MLflow fornisce numpy.ndarray come input o un dizionario di numpy.ndarray per tensori denominati.

Nell'esempio seguente viene illustrata la signature sezione relativa a un modello di visione artificiale sottoposto a training con fastai. Questo modello riceve un batch di immagini rappresentate come tensori di forma (300, 300, 3) con la relativa rappresentazione RGB come numeri interi senza segno. Il modello restituisce batch di stime come probabilità per due classi.

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Suggerimento

Azure Machine Learning genera un file swagger per una distribuzione di un modello MLflow con una firma disponibile. Questo file semplifica il test delle distribuzioni usando studio di Azure Machine Learning.

Ambiente del modello

I requisiti per l'esecuzione del modello sono specificati nel file conda.yaml . MLflow può rilevare automaticamente le dipendenze oppure è possibile indicare manualmente le dipendenze chiamando il mlflow.<flavor>.log_model() metodo . La chiamata al metodo può essere utile se le librerie incluse in MLflow nell'ambiente non sono quelle che si intende usare.

L'esempio di conda.yaml seguente illustra un ambiente per un modello creato con il fastai framework:

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

Nota

Un ambiente MLflow opera a livello di modello, ma un ambiente di Azure Machine Learning opera a livello di area di lavoro per gli ambienti registrati o il livello di processi/distribuzioni per gli ambienti anonimi. Quando si distribuiscono modelli MLflow, Azure Machine Learning compila l'ambiente del modello e lo usa per la distribuzione. È possibile usare l'interfaccia della riga di comando di Azure Machine Learning per eseguire l'override di questo comportamento e distribuire modelli MLflow in un ambiente specifico di Azure Machine Learning.

Funzione Predict

Tutti i modelli MLflow contengono una predict funzione, che viene chiamata quando il modello viene distribuito usando una distribuzione senza codice. predict La funzione restituisce, ad esempio classi, probabilità o previsioni, dipende dal framework o dal sapore usato per il training. La documentazione di ogni sapore descrive ciò che restituisce.

È possibile personalizzare la predict funzione per modificare la modalità di esecuzione dell'inferenza. È possibile registrare i modelli con un comportamento diverso oppure registrare un modello personalizzato.

Flussi di lavoro per il caricamento di modelli MLflow

È possibile caricare i modelli MLflow dalle posizioni seguenti:

  • Direttamente dall'esecuzione in cui sono stati registrati i modelli
  • Dal file system in cui vengono salvati i modelli
  • Dal registro dei modelli in cui vengono registrati i modelli

MLflow offre un modo coerente per caricare questi modelli indipendentemente dalla posizione.

Per il caricamento dei modelli sono disponibili due flussi di lavoro:

  • Eseguire il caricamento dello stesso oggetto e degli stessi tipi registrati. È possibile caricare i modelli usando MLflow SDK e ottenere un'istanza del modello con tipi appartenenti alla libreria di training. Ad esempio, un modello OPEN Neural Network Exchange (ONNX) restituisce un ModelProtooggetto , mentre un modello di albero delle decisioni sottoposto a training con scikit-learn restituisce un DecisionTreeClassifier oggetto . Usare mlflow.<flavor>.load_model() per eseguire il caricamento dello stesso oggetto modello e degli stessi tipi registrati.

  • Eseguire il caricamento di un modello per l'esecuzione dell'inferenza. È possibile caricare i modelli usando MLflow SDK e ottenere un wrapper con una funzione garantita predict . Non importa quale sapore si usa, perché ogni modello MLflow ha una predict funzione.

    MLflow garantisce che sia possibile chiamare questa funzione usando argomenti di tipo pandas.DataFrame, numpy.ndarrayo dict[string, numpyndarray], a seconda della firma del modello. MLflow gestisce la conversione dei tipi nel tipo di input previsto dal modello. Usare mlflow.pyfunc.load_model() per caricare un modello per l'esecuzione dell'inferenza.