Share via


Da artefatti a modelli in MLflow

L'articolo seguente illustra le differenze tra un artefatto MLflow e un modello MLflow e come eseguire la transizione da uno all'altro. Spiega anche in che modo Azure Machine Learning usa il concetto di modello MLflow per abilitare flussi di lavoro di distribuzione semplificati.

Qual è la differenza tra un artefatto e un modello?

Se non si ha familiarità con MLflow, è possibile che non si sia consapevoli della differenza tra registrazione di artefatti o file rispetto alla registrazione di modelli MLflow. Esistono tuttavia alcune differenze fondamentali tra queste due opzioni:

Artefatto

Un artefatto è qualsiasi file generato (e acquisito) dall'esecuzione o dal processo di un esperimento. Un artefatto può rappresentare un modello serializzato come un file pickle, i pesi di un modello PyTorch o TensorFlow o anche un file di testo contenente i coefficienti di una regressione lineare. Alcuni artefatti potrebbero anche non avere nulla a che fare con il modello stesso; possono invece contenere configurazioni per eseguire il modello o pre-elaborare informazioni o dati di esempio e così via. Gli artefatti possono essere disponibili in vari formati.

È possibile che gli artefatti siano già stati registrati:

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

mlflow.log_artifact(filename)

Modello

Anche un modello in MLflow è un artefatto. Tuttavia, si formulano presupposti più forti su questo tipo di artefatto. Tali presupposti forniscono un contratto chiaro tra i file salvati e ciò che significano. Quando si registrano i modelli come artefatti (file semplici), è necessario conoscere il generatore di modelli destinato a ognuno di questi file in modo da sapere come caricare il modello per l'inferenza. Al contrario, i modelli MLflow possono essere caricati usando il contratto specificato nel Formato MLmodel.

In Azure Machine Learning i modelli di registrazione presentano i vantaggi seguenti:

  • È possibile distribuirli in tempo reale o in endpoint batch senza fornire uno script di assegnazione dei punteggi o un ambiente.
  • Quando si distribuiscono modelli, le distribuzioni hanno automaticamente un swagger generato e la funzionalità Test può essere usata in Studio di Azure Machine Learning.
  • È possibile usare i modelli direttamente come input della pipeline.
  • È possibile usare il dashboard di intelligenza artificiale responsabile con i modelli.

È possibile registrare i modelli usando MLflow SDK:

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

Formato MLmodel

MLflow adotta il formato MLmodel come modo per creare un contratto tra gli artefatti e ciò che rappresentano. Il formato MLmodel archivia gli asset in una cartella. Tra questi asset è presente un file denominato MLmodel. Questo file è l'unica fonte di verità sul modo in cui un modello può essere caricato e usato.

Lo screenshot seguente mostra una cartella del modello MLflow di esempio in Studio di Azure Machine Learning. Il modello viene inserito in una cartella denominata credit_defaults_model. Non esiste alcun requisito specifico per la denominazione di questa cartella. La cartella contiene il file MLmodel tra gli altri artefatti del modello.

A screenshot showing assets of a sample MLflow model, including the MLmodel file.

Il codice seguente è un esempio dell'aspetto del file MLmodel per un modello di visione artificiale sottoposto a training con fastai:

MLmodel

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 per l'uso, MLflow ha introdotto il concetto di flavor come modo per fornire un contratto univoco che funziona in tutti i framework di Machine Learning. Un flavor indica cosa aspettarsi per un determinato modello creato con un framework specifico. Ad esempio, TensorFlow ha un proprio flavor, che specifica come deve essere salvato e caricato 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. Questa decisione consente a ogni flavor di 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.

Il codice seguente è un esempio della sezione flavors per un modello fastai.

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 in 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 quando i modelli vengono registrati e vengono salvati in modo permanente nella sezione signature del fileMLmodel. La funzionalità Autolog in MLflow deduce automaticamente le firme in modo ottimale. Tuttavia, potrebbe essere necessario 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:

  • Firma basata su colonne: questa firma opera sui dati tabulari. Per i modelli con questo tipo di firma, MLflow fornisce pandas.DataFrame oggetti come input.
  • Firma basata su Tensor: questa firma funziona con matrici o tensori n-dimensionali. Per i modelli con questa firma, MLflow fornisce numpy.ndarray come input (o un dizionario di numpy.ndarray nel caso di tensori denominati).

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

MLmodel

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. In questo modo è più semplice testare le distribuzioni usando Studio di Azure Machine Learning.

Ambiente del modello

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

Il codice seguente è un esempio di ambiente usato per un modello creato con il framework fastai :

conda.yaml

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

Qual è la differenza tra un ambiente MLflow e un ambiente di Azure Machine Learning?

Mentre un ambiente MLflow opera a livello di modello, un ambiente di Azure Machine Learning opera a livello di area di lavoro (per ambienti registrati) o processi/distribuzioni (per ambienti anonimi). Quando si distribuiscono modelli MLflow in Azure Machine Learning, l'ambiente del modello viene compilato e usato per la distribuzione. In alternativa, è possibile eseguire l'override di questo comportamento con l' interfaccia della riga di comando di Azure Machine Learning v2 e distribuire modelli MLflow usando un ambiente specifico di Azure Machine Learning.

Funzione Predict

Tutti i modelli MLflow contengono una funzione predict. Questa funzione viene chiamata quando un modello viene distribuito usando un'esperienza di distribuzione senza codice. Che cosa la funzione predict restituisce (ad esempio, classi, probabilità o previsioni) dipende dal framework (ovvero il flavor) usato per il training. Leggere la documentazione di ogni flavor per sapere cosa restituiscono.

Negli stessi casi, potrebbe essere necessario personalizzare questa funzione predict per modificare la modalità di esecuzione dell'inferenza. In questi casi, è necessario registrare modelli con un comportamento diverso nel metodo predict o registrare un flavor di un modello personalizzato.

Flussi di lavoro per il caricamento di modelli MLflow

È possibile caricare i modelli creati come modelli MLflow da diverse posizioni, tra cui:

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

Sono disponibili due flussi di lavoro per il caricamento dei modelli:

  • Caricare lo stesso oggetto e gli 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 ONNX restituisce un ModelProto mentre un modello di albero delle decisioni sottoposto a training con scikit-learn restituisce un oggetto DecisionTreeClassifier. Usare mlflow.<flavor>.load_model() per eseguire il caricamento dello stesso oggetto modello e degli stessi tipi registrati.

  • Caricare un modello per l'inferenza in esecuzione: è possibile caricare i modelli usando MLflow SDK e ottenere un wrapper in cui MLflow garantisce che sia presente una funzione predict. Non importa quale flavor si sta usando, ogni modello MLflow ha una funzione predict. MLflow garantisce inoltre che questa funzione possa essere chiamata 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.