Condividi tramite


Registrare, caricare, registrare e distribuire modelli MLflow

Un modello MLflow è un formato standard per la creazione di pacchetti di modelli di Machine Learning che possono essere usati in un'ampia gamma di strumenti downstream, ad esempio l'inferenza batch in Apache Spark o la gestione in tempo reale tramite un'API REST. Il formato definisce una convenzione che consente di salvare un modello in versioni diverse (python-function, pytorch, sklearn e così via), che possono essere comprese da diverse piattaforme di gestione e inferenza del modello.

Registrare e caricare modelli

Quando si registra un modello, MLflow registra automaticamente i requirements.txt file e conda.yaml i file. È possibile usare questi file per ricreare l'ambiente di sviluppo del modello e reinstallare le dipendenze usando virtualenv (scelta consigliata) o conda.

Importante

Anaconda Inc. ha aggiornato le condizioni per anaconda.org canali. In base alle nuove condizioni di servizio, potrebbe essere necessaria una licenza commerciale se ci si affida alla distribuzione e alla creazione di pacchetti di Anaconda. Per altre informazioni, vedere Domande frequenti su Anaconda Commercial Edition. L'uso di qualsiasi canale Anaconda è disciplinato dalle condizioni per il servizio.

I modelli MLflow registrati prima della versione 1.18 (Databricks Runtime 8.3 ML o versioni precedenti) sono stati registrati per impostazione predefinita con il canale conda defaults (https://repo.anaconda.com/pkgs/) come dipendenza. A causa di questa modifica della licenza, Databricks ha interrotto l'uso del canale per i defaults modelli registrati usando MLflow v1.18 e versioni successive. Il canale predefinito registrato è ora conda-forge, che punta alla community gestita https://conda-forge.org/.

Se è stato registrato un modello prima di MLflow v1.18 senza escludere il defaults canale dall'ambiente conda per il modello, tale modello potrebbe avere una dipendenza dal defaults canale che potrebbe non essere previsto. Per verificare manualmente se un modello ha questa dipendenza, è possibile esaminare channel il conda.yaml valore nel file incluso nel pacchetto con il modello registrato. Ad esempio, un conda.yaml modello con una defaults dipendenza del canale può essere simile al seguente:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

Poiché Databricks non è in grado di determinare se l'uso del repository Anaconda per interagire con i modelli è consentito nella relazione con Anaconda, Databricks non impone ai clienti di apportare modifiche. Se l'uso del repository Anaconda.com tramite l'uso di Databricks è consentito in base ai termini di Anaconda, non è necessario eseguire alcuna azione.

Se si vuole modificare il canale usato nell'ambiente di un modello, è possibile registrare nuovamente il modello nel registro dei modelli con un nuovo conda.yamloggetto . A tale scopo, è possibile specificare il canale nel conda_env parametro di log_model().

Per altre informazioni sull'API log_model() , vedere la documentazione di MLflow relativa al modello con cui si sta lavorando, ad esempio log_model per scikit-learn.

Per altre informazioni sui conda.yaml file, vedere la documentazione di MLflow.

Comandi API

Per registrare un modello nel server di rilevamento MLflow, usare mlflow.<model-type>.log_model(model, ...).

Per caricare un modello registrato in precedenza per l'inferenza o un ulteriore sviluppo, usare mlflow.<model-type>.load_model(modelpath), dove modelpath è uno dei seguenti:

  • un percorso relativo all'esecuzione (ad esempio runs:/{run_id}/{model-path})
  • un percorso DBFS
  • un percorso del modello registrato , ad esempio models:/{model_name}/{model_stage}.

Per un elenco completo delle opzioni per il caricamento di modelli MLflow, vedere Riferimento agli artefatti nella documentazione di MLflow.

Per i modelli Python MLflow, un'opzione aggiuntiva consiste nell'usare mlflow.pyfunc.load_model() per caricare il modello come funzione Python generica. È possibile usare il frammento di codice seguente per caricare il modello e assegnare un punteggio ai punti dati.

model = mlflow.pyfunc.load_model(model_path)
model.predict(model_input)

In alternativa, è possibile esportare il modello come funzione definita dall'utente apache Spark da usare per l'assegnazione dei punteggi in un cluster Spark, come processo batch o come processo di Spark Streaming in tempo reale.

# load input data table as a Spark DataFrame
input_data = spark.table(input_table_name)
model_udf = mlflow.pyfunc.spark_udf(spark, model_path)
df = input_data.withColumn("prediction", model_udf())

Dipendenze del modello di log

Per caricare con precisione un modello, assicurarsi che le dipendenze del modello vengano caricate con le versioni corrette nell'ambiente notebook. In Databricks Runtime 10.5 ML e versioni successive MLflow avvisa se viene rilevata una mancata corrispondenza tra l'ambiente corrente e le dipendenze del modello.

Altre funzionalità per semplificare il ripristino delle dipendenze del modello sono incluse in Databricks Runtime 11.0 ML e versioni successive. In Databricks Runtime 11.0 ML e versioni successive, per pyfunc i modelli flavor, è possibile chiamare mlflow.pyfunc.get_model_dependencies per recuperare e scaricare le dipendenze del modello. Questa funzione restituisce un percorso al file delle dipendenze che è quindi possibile installare usando %pip install <file-path>. Quando si carica un modello come funzione definita dall'utente mlflow.pyfunc.spark_udf PySpark, specificare env_manager="virtualenv" nella chiamata. In questo modo le dipendenze del modello vengono ripristinate nel contesto della funzione definita dall'utente pySpark e non influiscono sull'ambiente esterno.

È anche possibile usare questa funzionalità in Databricks Runtime 10.5 o versioni successive installando manualmente MLflow versione 1.25.0 o successiva:

%pip install "mlflow>=1.25.0"

Per altre informazioni su come registrare le dipendenze del modello (Python e non Python) e gli artefatti, vedere Dipendenze del modello di log.

Informazioni su come registrare le dipendenze del modello e gli artefatti personalizzati per la gestione del modello:

Frammenti di codice generati automaticamente nell'interfaccia utente di MLflow

Quando si registra un modello in un notebook di Azure Databricks, Azure Databricks genera automaticamente frammenti di codice che è possibile copiare ed usare per caricare ed eseguire il modello. Per visualizzare questi frammenti di codice:

  1. Passare alla schermata Esecuzioni per l'esecuzione che ha generato il modello. (Vedere Visualizzare l'esperimento del notebook per visualizzare la schermata Esecuzioni.
  2. Scorrere fino alla sezione Artefatti .
  3. Fare clic sul nome del modello registrato. Viene aperto un pannello a destra che mostra il codice che è possibile usare per caricare il modello registrato ed eseguire stime su frame di dati Spark o pandas.

Frammenti di codice del pannello artefatti

Esempi

Per esempi di modelli di registrazione, vedere gli esempi in Tenere traccia delle esecuzioni di training di Machine Learning. Per un esempio di caricamento di un modello registrato per l'inferenza, vedere l'esempio di inferenza del modello.

Registrare i modelli nel Registro modelli

È possibile registrare i modelli nel Registro modelli MLflow, un archivio modelli centralizzato che fornisce un'interfaccia utente e un set di API per gestire il ciclo di vita completo dei modelli MLflow. Per istruzioni su come usare il Registro modelli per gestire i modelli nel catalogo unity di Databricks, vedere Gestire il ciclo di vita del modello in Unity Catalog. Per usare il Registro modelli di area di lavoro, vedere Gestire il ciclo di vita del modello usando il Registro modelli di area di lavoro (legacy).To use the Workspace Model Registry, see Manage model lifecycle using the Workspace Model Registry (legacy).

Per registrare un modello usando l'API, usare mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}").

Salvare i modelli in DBFS

Per salvare un modello in locale, usare mlflow.<model-type>.save_model(model, modelpath). modelpath deve essere un percorso DBFS . Ad esempio, se si usa un percorso dbfs:/my_project_models DBFS per archiviare il lavoro del progetto, è necessario usare il percorso /dbfs/my_project_modelsdel modello :

modelpath = "/dbfs/my_project_models/model-%f-%f" % (alpha, l1_ratio)
mlflow.sklearn.save_model(lr, modelpath)

Per i modelli di MLlib usare pipeline di Machine Learning.

Scaricare gli artefatti del modello

È possibile scaricare gli artefatti del modello registrati (ad esempio file di modello, tracciati e metriche) per un modello registrato con varie API.

Esempio di API Python:

from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository

model_uri = MlflowClient.get_model_version_download_uri(model_name, model_version)
ModelsArtifactRepository(model_uri).download_artifacts(artifact_path="")

Esempio di API Java:

MlflowClient mlflowClient = new MlflowClient();
// Get the model URI for a registered model version.
String modelURI = mlflowClient.getModelVersionDownloadUri(modelName, modelVersion);

// Or download the model artifacts directly.
File modelFile = mlflowClient.downloadModelVersion(modelName, modelVersion);

Esempio di comando dell'interfaccia della riga di comando :

mlflow artifacts download --artifact-uri models:/<name>/<version|stage>

Distribuire modelli per la gestione online

È possibile usare Model Serving per ospitare modelli di Machine Learning dal Registro modelli come endpoint REST. Questi endpoint vengono aggiornati automaticamente in base alla disponibilità delle versioni del modello e alle relative fasi.

È anche possibile distribuire un modello in framework di gestione di terze parti usando gli strumenti di distribuzione predefiniti di MLflow. Vedi l'esempio seguente.