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 dieses Problem zu beheben, können Sie Ihr Modell in ein MLflow-Modellformat konvertieren, in dem Sie die folgenden Vorteile von Azure Machine Learning und MLflow-Modellen anwenden 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 verschiedene Machine Learning-Frameworks wie Scikit-learn, Keras und Pytorch. MLflow deckt möglicherweise nicht jeden Anwendungsfall ab. Sie könnten z. B. ein MLflow-Modell mit einem Framework erstellen wollen, das MLflow nicht nativ unterstützt. Möglicherweise möchten Sie die Art und Weise ändern, wie Ihr Modell beim Ausführen von Aufträgen die Vorverarbeitung oder Nachbearbeitung 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. Weitere Informationen finden Sie unter Benutzerdefinierte Python-Modelle.

Voraussetzungen

  • Installieren Sie das Paket mlflow.

Erstellen eines Python-Wrappers für Ihr Modell

Bevor Sie Ihr Modell in ein von MLflow unterstütztes Modellformat konvertieren können, müssen Sie 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 erstellen Sie eine Conda-Umgebung für das neue MLflow-Modell, 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

Nachdem Ihre Umgebung bereit ist, übergeben Sie den SKlearnWrapper, die Conda-Umgebung und Ihr neu erstelltes Artefaktewörterbuch an die mlflow.pyfunc.save_model()-Methode. 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, laden Sie Ihr Modell und geben Sie eine Testvorhersage aus, um sie mit Ihrem ursprünglichen Modell zu vergleichen.

Der folgende Code gibt eine Testvorhersage aus dem MLflow-formatierten Modell und eine Testvorhersage aus dem sklearn-Modell aus. Er speichert die Testvorhersagen für den Vergleich auf Ihrem Datenträger.

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 bestätigt haben, dass Ihr Modell ordnungsgemäß gespeichert wurde, können Sie eine Testausführung erstellen. Registrieren und speichern Sie Ihr MLflow-formatiertes Modell in Ihrer Modellregistrierung.


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. Ein Beispiel zum Speichern, Protokollieren und Registrieren eines Modells, das über keine unterstützte integrierte MLflow-Modellvariante verfügt, finden Sie unter Registrieren eines nicht unterstützten Machine Learning-Modells.