MLflow-modellen vastleggen, laden, registreren en implementeren

Een MLflow-model is een standaardindeling voor het verpakken van machine learning-modellen die kunnen worden gebruikt in verschillende downstreamhulpprogramma's, bijvoorbeeld batchdeductie op Apache Spark of realtime-service via een REST API. De indeling definieert een conventie waarmee u een model in verschillende varianten kunt opslaan (python-function, pytorch, sklearn, enzovoort), dat kan worden begrepen door verschillende modelfuncties en deductieplatforms.

Modellen registreren en laden

Wanneer u een model registreert, registreert MLflow automatisch logboeken requirements.txt en conda.yaml bestanden. U kunt deze bestanden gebruiken om de ontwikkelomgeving van het model opnieuw te maken en afhankelijkheden opnieuw te installeren met behulp van virtualenv (aanbevolen) of conda.

Belangrijk

Anaconda Inc. heeft hun servicevoorwaarden voor anaconda.org kanalen bijgewerkt. Op basis van de nieuwe servicevoorwaarden hebt u mogelijk een commerciële licentie nodig als u afhankelijk bent van de verpakking en distributie van Anaconda. Zie Veelgestelde vragen over Anaconda Commercial Edition voor meer informatie. Uw gebruik van anaconda-kanalen is onderhevig aan hun servicevoorwaarden.

MLflow-modellen die zijn geregistreerd vóór v1.18 (Databricks Runtime 8.3 ML of eerder) zijn standaard vastgelegd met het conda-kanaal defaults (https://repo.anaconda.com/pkgs/) als afhankelijkheid. Vanwege deze licentiewijziging heeft Databricks het gebruik van het defaults kanaal gestopt voor modellen die zijn geregistreerd met MLflow v1.18 en hoger. Het standaardkanaal dat is geregistreerd, is nu conda-forge, die verwijst naar de door de community beheerde https://conda-forge.org/.

Als u een model hebt geregistreerd vóór MLflow v1.18 zonder het defaults kanaal uit te sluiten van de Conda-omgeving voor het model, heeft dat model mogelijk een afhankelijkheid van het defaults kanaal dat u mogelijk niet hebt bedoeld. Als u handmatig wilt controleren of een model deze afhankelijkheid heeft, kunt u de waarde onderzoeken channel in het conda.yaml bestand dat is verpakt met het geregistreerde model. Een model conda.yaml met een defaults kanaalafhankelijkheid kan er bijvoorbeeld als volgt uitzien:

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

Omdat Databricks niet kan bepalen of uw gebruik van de Anaconda-opslagplaats om te communiceren met uw modellen is toegestaan in uw relatie met Anaconda, dwingt Databricks klanten niet om wijzigingen aan te brengen. Als uw gebruik van de Anaconda.com opslagplaats via het gebruik van Databricks is toegestaan volgens de voorwaarden van Anaconda, hoeft u geen actie te ondernemen.

Als u het kanaal wilt wijzigen dat wordt gebruikt in de omgeving van een model, kunt u het model opnieuw registreren bij het modelregister met een nieuw conda.yaml. U kunt dit doen door het kanaal op te geven in de conda_env parameter van log_model().

Zie de MLflow-documentatie voor de modelsmaak waarmee u werkt, bijvoorbeeld log_model voor scikit-learn voor meer informatie over de log_model() API.

Zie de MLflow-documentatie voor meer informatie over conda.yaml bestanden.

API-opdrachten

Als u een model wilt registreren bij de MLflow-traceringsserver, gebruikt u mlflow.<model-type>.log_model(model, ...).

Als u een eerder geregistreerd model wilt laden voor deductie of verdere ontwikkeling, gebruikt mlflow.<model-type>.load_model(modelpath)u waar modelpath een van de volgende opties is:

  • een run-relative path (zoals runs:/{run_id}/{model-path})
  • een DBFS-pad
  • een geregistreerd modelpad (zoals models:/{model_name}/{model_stage}).

Zie Referencing Artifacts in de MLflow-documentatie voor een volledige lijst met opties voor het laden van MLflow-modellen.

Voor Python MLflow-modellen is een extra optie om het model te mlflow.pyfunc.load_model() laden als een algemene Python-functie. U kunt het volgende codefragment gebruiken om het model te laden en gegevenspunten te scoren.

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

Als alternatief kunt u het model exporteren als een Apache Spark UDF om te gebruiken voor het scoren op een Spark-cluster, hetzij als batchtaak of als een realtime Spark Streaming-taak.

# 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())

Afhankelijkheden van logboekmodellen

Als u een model nauwkeurig wilt laden, moet u ervoor zorgen dat de modelafhankelijkheden worden geladen met de juiste versies in de notebookomgeving. In Databricks Runtime 10.5 ML en hoger waarschuwt MLflow u als er een onjuiste overeenkomst wordt gedetecteerd tussen de huidige omgeving en de afhankelijkheden van het model.

Aanvullende functionaliteit om het herstellen van modelafhankelijkheden te vereenvoudigen, is opgenomen in Databricks Runtime 11.0 ML en hoger. In Databricks Runtime 11.0 ML en hoger kunt u voor pyfunc smaakmodellen aanroepen mlflow.pyfunc.get_model_dependencies om de modelafhankelijkheden op te halen en te downloaden. Deze functie retourneert een pad naar het afhankelijkhedenbestand dat u vervolgens kunt installeren met behulp van %pip install <file-path>. Wanneer u een model laadt als pySpark UDF, geeft u env_manager="virtualenv" dit op in de mlflow.pyfunc.spark_udf aanroep. Hiermee herstelt u modelafhankelijkheden in de context van de PySpark UDF en heeft dit geen invloed op de externe omgeving.

U kunt deze functionaliteit ook gebruiken in Databricks Runtime 10.5 of lager door MLflow versie 1.25.0 of hoger handmatig te installeren:

%pip install "mlflow>=1.25.0"

Zie Logboekmodelafhankelijkheden voor meer informatie over het vastleggen van modelafhankelijkheden (Python en niet-Python) en artefacten.

Meer informatie over het vastleggen van modelafhankelijkheden en aangepaste artefacten voor het leveren van modellen:

Automatisch gegenereerde codefragmenten in de MLflow-gebruikersinterface

Wanneer u een model in een Azure Databricks-notebook aanmeldt, genereert Azure Databricks automatisch codefragmenten die u kunt kopiëren en gebruiken om het model te laden en uit te voeren. Ga als volgt te werk om deze codefragmenten weer te geven:

  1. Navigeer naar het scherm Runs voor de uitvoering die het model heeft gegenereerd. (Zie Bekijk het notebookexperiment voor het weergeven van het scherm Uitvoeringen.)
  2. Schuif naar de sectie Artefacten .
  3. Klik op de naam van het geregistreerde model. Er wordt een deelvenster aan de rechterkant geopend met code die u kunt gebruiken om het vastgelegde model te laden en voorspellingen te doen op Spark- of Pandas DataFrames.

Codefragmenten in het artefactpaneel

Voorbeelden

Zie de voorbeelden in Trainingsuitvoeringen voor machine learning bijhouden voor voorbeelden van logboekregistratiemodellen. Zie het voorbeeld van modeldeductie voor een voorbeeld van het laden van een geregistreerd model voor deductie.

Modellen registreren in het modelregister

U kunt modellen registreren in het MLflow-modelregister, een gecentraliseerd modelarchief dat een gebruikersinterface en set API's biedt voor het beheren van de volledige levenscyclus van MLflow-modellen. Zie Modellevenscyclus beheren in Unity Catalog voor instructies over het gebruik van het modelregister voor het beheren van modellen in Databricks Unity Catalog. Zie Modellevenscyclus beheren met behulp van het werkruimtemodelregister (verouderd) als u het werkruimtemodelregister wilt gebruiken.

Als u een model wilt registreren met behulp van de API, gebruikt u mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}").

Modellen opslaan in DBFS

Als u een model lokaal wilt opslaan, gebruikt u mlflow.<model-type>.save_model(model, modelpath). modelpath moet een DBFS-pad zijn. Als u bijvoorbeeld een DBFS-locatie dbfs:/my_project_models gebruikt om uw projectwerk op te slaan, moet u het modelpad /dbfs/my_project_modelsgebruiken:

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

Voor MLlib-modellen gebruikt u ML-pijplijnen.

Modelartefacten downloaden

U kunt de vastgelegde modelartefacten (zoals modelbestanden, plots en metrische gegevens) downloaden voor een geregistreerd model met verschillende API's.

Python-API-voorbeeld :

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="")

Voorbeeld van Java-API :

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);

CLI-opdrachtvoorbeeld :

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

Modellen implementeren voor onlinebediening

U kunt Model serving gebruiken om machine learning-modellen uit het modelregister als REST-eindpunten te hosten. Deze eindpunten worden automatisch bijgewerkt op basis van de beschikbaarheid van modelversies en hun fasen.

U kunt ook een model implementeren op frameworks van derden met behulp van de ingebouwde implementatiehulpprogramma's van MLflow. Zie het volgende voorbeeld.