Share via


Aangepaste ML-modellen converteren naar modellen met MLflow-indeling

In dit artikel leert u hoe u uw aangepaste ML-model converteert naar de MLflow-indeling. MLflow is een opensource-bibliotheek voor het beheren van de levenscyclus van uw machine learning-experimenten. In sommige gevallen kunt u een machine learning-framework gebruiken zonder de ingebouwde ondersteuning voor de smaak van het MLflow-model. Vanwege dit gebrek aan ingebouwde MLflow-modelsmaak, kunt u het model niet registreren of registreren met fluent API's van het MLflow-model. U kunt dit oplossen door uw model te converteren naar een MLflow-indeling, waarbij u kunt profiteren van de volgende voordelen van Azure Machine Learning- en MLflow-modellen.

Met Azure Machine Learning krijgen MLflow-modellen de extra voordelen van:

  • Geen code-implementatie
  • Draagbaarheid als open source standaardindeling
  • Mogelijkheid om zowel lokaal als in de cloud te implementeren

MLflow biedt ondersteuning voor verschillende machine learning-frameworks (scikit-learn, Keras, Pytorch en meer); Het is echter mogelijk dat niet alle use-cases worden behandeld. U kunt bijvoorbeeld een MLflow-model maken met een framework dat MLflow niet systeemeigen ondersteunt of u wilt mogelijk de manier wijzigen waarop uw model de voor- of naverwerking uitvoert bij het uitvoeren van taken. Lees Van artefacten naar modellen in MLflow voor meer informatie over MLflow-modellen.

Als u uw model niet hebt getraind met MLFlow en de MLflow-implementatie zonder code van Azure Machine Learning wilt gebruiken, moet u uw aangepaste model converteren naar MLFLow. Meer informatie over aangepaste Python-modellen en MLflow.

Vereisten

Alleen het mlflow-pakket dat is geïnstalleerd, is nodig om uw aangepaste modellen te converteren naar een MLflow-indeling.

Een Python-wrapper maken voor uw model

Voordat u uw model kunt converteren naar een indeling die door MLflow wordt ondersteund, moet u eerst een Python-wrapper voor uw model maken. De volgende code laat zien hoe u een Python-wrapper maakt voor een sklearn model.


# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc


PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
                                                  minor=version_info.minor,
                                                  micro=version_info.micro)

# Train and save an SKLearn model
sklearn_model_path = "model.pkl"

artifacts = {
    "sklearn_model": sklearn_model_path
}

# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):

    def load_context(self, context):
        import pickle
        self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
    
    def predict(self, model, data):
        return self.sklearn_model.predict(data)

Een Conda-omgeving maken

Vervolgens moet u een Conda-omgeving maken voor het nieuwe MLflow-model dat alle benodigde afhankelijkheden bevat. Als dit niet wordt aangegeven, wordt de omgeving afgeleid van de huidige installatie. Zo niet, dan kan dit worden opgegeven.


import cloudpickle
conda_env = {
    'channels': ['defaults'],
    'dependencies': [
      'python={}'.format(PYTHON_VERSION),
      'pip',
      {
        'pip': [
          'mlflow',
          'scikit-learn=={}'.format(sklearn.__version__),
          'cloudpickle=={}'.format(cloudpickle.__version__),
        ],
      },
    ],
    'name': 'sklearn_env'
}

Het model met MLFlow-indeling laden en voorspellingen testen

Zodra uw omgeving klaar is, kunt u de SKlearnWrapper, de Conda-omgeving en de zojuist gemaakte artefactenwoordenlijst doorgeven aan de methode mlflow.pyfunc.save_model(). Als u dit doet, wordt het model op uw schijf opgeslagen.

mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)

Om ervoor te zorgen dat het zojuist opgeslagen model met MLflow-indeling niet is gewijzigd tijdens het opslaan, kunt u het model laden en een testvoorspelling afdrukken om uw oorspronkelijke model te vergelijken.

Met de volgende code wordt een testvoorspelling van het model met mlflow-indeling afgedrukt en een testvoorspelling van het sklearn-model dat ter vergelijking op uw schijf is opgeslagen.

loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)

input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)

# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)

Het model met MLflow-indeling registreren

Zodra u hebt bevestigd dat uw model correct is opgeslagen, kunt u een testuitvoering maken, zodat u uw met MLflow opgemaakte model kunt registreren en opslaan in uw modelregister.


mlflow.start_run()

mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path, 
                        loader_module=None, 
                        data_path=None, 
                        code_path=None,
                        python_model=SKLearnWrapper(),
                        registered_model_name="Custom_mlflow_model", 
                        conda_env=conda_env,
                        artifacts=artifacts)
mlflow.end_run()

Belangrijk

In sommige gevallen kunt u een machine learning-framework gebruiken zonder de ingebouwde ondersteuning voor de smaak van het MLflow-model. De bibliotheek is bijvoorbeeld vaderSentiment een standaardbibliotheek voor natuurlijke taalverwerking (NLP) die wordt gebruikt voor sentimentanalyse. Omdat er geen ingebouwde MLflow-modelsmaak is, kunt u het model niet registreren of registreren met Fluent API's van het MLflow-model. Bekijk een voorbeeld van het opslaan, registreren en registreren van een model dat geen ondersteunde ingebouwde MLflow-modelsmaak heeft.

Volgende stappen