Konvertieren von benutzerdefinierten ML-Modellen in MLflow-formatierte Modelle

In diesem Artikel erfahren Sie, wie Sie Ihr benutzerdefiniertes ML-Modell in das MLflow-Format konvertieren. MLflow ist eine Open-Source-Bibliothek zum Verwalten des Lebenszyklus Ihrer Machine Learning-Experimente. In einigen Fällen können Sie ein Machine Learning-Framework ohne Unterstützung seiner integrierten MLflow-Modellvariante verwenden. Aufgrund dieses Mangels an einer integrierten MLflow-Modellvariante können Sie das Modell nicht mit Fluent-APIs des MLflow-Modells protokollieren oder registrieren. Um dies zu beheben, können Sie Ihr Modell in ein MLflow-Format konvertieren, in dem Sie die folgenden Vorteile von Azure Machine Learning und MLflow-Modellen nutzen können.

Mit Azure Machine Learning erhalten MLflow-Modelle die folgenden zusätzlichen Vorteile:

  • Bereitstellung ohne Code
  • Portierbarkeit als Open-Source-Standardformat
  • Möglichkeit zur Bereitstellung sowohl lokal als auch in der Cloud

MLflow bietet Unterstützung für eine Vielzahl von Machine Learning-Frameworks (scikit-learn, Keras, Pytorch und mehr). Es deckt jedoch möglicherweise nicht jeden Anwendungsfall ab. Sie können z. B. ein MLflow-Modell mit einem Framework erstellen, das MLflow nicht nativ unterstützt, oder Sie möchten die Art und Weise ändern, wie Ihr Modell beim Ausführen von Aufträgen die Vor- oder Nachverarbeitung durchführt. Weitere Informationen zu MLflow-Modellen finden Sie unter Von Artefakten zu Modellen in MLflow.

Wenn Sie Ihr Modell nicht mit MLFlow trainiert haben und das MLflow-No-Code-Bereitstellungsangebot von Azure Machine Learning verwenden möchten, müssen Sie Ihr benutzerdefiniertes Modell in MLFLow konvertieren. Erfahren Sie mehr über benutzerdefinierte Python-Modelle und MLflow.

Voraussetzungen

Nur das installierte mlflow-Paket ist erforderlich, um Ihre benutzerdefinierten Modelle in ein MLflow-Format zu konvertieren.

Erstellen eines Python-Wrappers für Ihr Modell

Bevor Sie Ihr Modell in ein von MLflow unterstütztes Format konvertieren können, müssen Sie zuerst einen Python-Wrapper für Ihr Modell erstellen. Der folgende Code veranschaulicht, wie ein Python-Wrapper für ein sklearn-Modell erstellt wird.


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

Erstellen einer Conda-Umgebung

Als Nächstes müssen Sie eine Conda-Umgebung für das neue MLflow-Modell erstellen, das alle erforderlichen Abhängigkeiten enthält. Wenn nicht angegeben, wird die Umgebung von der aktuellen Installation abgeleitet. Wenn nicht, kann sie angegeben werden.


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'
}

Laden des MLFlow-formatierten Modells und von Testvorhersagen

Sobald Ihre Umgebung bereit ist, können Sie den SKlearnWrapper, die Conda-Umgebung und Ihr neu erstelltes Artefaktewörterbuch an die mlflow.pyfunc.save_model()-Methode übergeben. Dadurch wird das Modell auf Ihrem Datenträger gespeichert.

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)

Um sicherzustellen, dass ihr neu gespeichertes MLflow-formatiertes Modell sich während des Speicherns nicht geändert hat, können Sie Ihr Modell laden und eine Testvorhersage anzeigen, um sie mit Ihrem ursprünglichen Modell zu vergleichen.

Der folgende Code zeigt eine Testvorhersage aus dem mlflow-formatierten Modell und eine Testvorhersage aus dem sklearn-Modell an, das zum Vergleich auf Ihrem Datenträger gespeichert wurde.

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)

Registrieren des MLflow-formatierten Modells

Nachdem Sie sich versichert haben, dass Ihr Modell ordnungsgemäß gespeichert wurde, können Sie einen Testlauf erstellen, damit Sie Ihr MLflow-formatiertes Modell in ihrer Modellregistrierung registrieren und speichern können.


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

Wichtig

In einigen Fällen können Sie ein Machine Learning-Framework ohne Unterstützung seiner integrierten MLflow-Modellvariante verwenden. Die vaderSentiment-Bibliothek ist beispielsweise eine Standardbibliothek für die Verarbeitung natürlicher Sprachen (NLP), die für die Stimmungsanalyse verwendet wird. Da ihr eine integrierte MLflow-Modellvariante fehlt, können Sie das Modell nicht mit Fluent-APIs des MLflow-Modells protokollieren oder registrieren. Sehen Sie sich ein Beispiel zum Speichern, Protokollieren und Registrieren eines Modells, das über keine unterstützte integrierte MLflow-Modellvariante verfügt, an.

Nächste Schritte