Freigeben über


Artefakte und Modelle in MLflow

In diesem Artikel werden MLflow-Artefakte und MLflow-Modelle sowie die Unterschiede zwischen MLflow-Modellen und anderen Artefakten erläutert. Außerdem wird in diesem Artikel erläutert, wie Azure Machine Learning die Merkmale eines MLflow-Modells verwendet, um optimierte Bereitstellungsworkflows zu ermöglichen.

Artefakte und Modelle

In MLflow gibt es einige grundlegende Unterschiede zwischen der Protokollierung einfacher Dateiartefakte und der Protokollierung von MLflow-Modellen.

Artefakt

Ein Artefakt ist jede Datei, die aus dem Ausführen eines Experiments oder einem Auftrag generiert und erfasst wird. Ein Artefakt kann ein Modell serialisiert als Pickle-Datei, die Gewichtungen eines PyTorch- oder TensorFlow-Modells oder eine Textdatei sein, die die Koeffizienten einer linearen Regression enthält. Einige Artefakte haben nichts mit dem Modell selbst zu tun, enthalten jedoch Ausführungskonfigurationen, Vorverarbeitungsinformationen oder Stichprobendaten. Artefakte können verschiedene Formate aufweisen.

Im folgenden Beispiel wird ein Dateiartefakt protokolliert.

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

Modell

Ein MLflow-Modell ist ein Artefakt, für das Sie stärkere Annahmen treffen, die einen klaren Vertrag zwischen den gespeicherten Dateien und ihrer Bedeutung bieten. Wenn Sie die Dateien Ihres Modells jedoch einfach als Artefakte protokollieren, müssen Sie wissen, was jede der Dateien bedeutet und wie sie für Rückschlüsse geladen werden.

Sie können MLflow-Modelle mithilfe des MLflow SDK protokollieren, z. B.:

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

Die Protokollierung von MLflow-Modellen in Azure Machine Learning bietet die folgenden Vorteile:

  • Sie können MLflow-Modelle an Echtzeit- oder Batchendpunkten ohne ein Bewertungsskript oder eine Umgebung bereitstellen.
  • Wenn Sie MLflow-Modelle bereitstellen, generieren die Bereitstellungen automatisch eine Swagger-Datei, sodass Sie das Testfeature in Azure Machine Learning Studio verwenden können.
  • Sie können die MLflow-Modelle direkt als Pipelineeingaben verwenden.
  • Sie können das Dashboard für verantwortungsvolle KI mit MLflow-Modellen verwenden.

Das MLModel-Format

Für Modelle, die als einfache Artefaktdateien protokolliert werden, müssen Sie wissen, was der Modellersteller für jede Datei vorgesehen hat, bevor Sie das Modell für Rückschlüsse laden können. Bei MLflow-Modellen laden Sie das Modell jedoch im MLmodel-Format, um den Vertrag zwischen den Artefakten und ihren Darstellungen anzugeben.

Beim MLmodel-Format werden Objekte in einem Ordner gespeichert, der keine spezifische Benennungsanforderung hat. Zu den Ressourcen gehört eine Datei namens MLmodel, die die Single Source of Truth für das Laden und Verwenden des Modells ist.

Die folgende Abbildung zeigt einen MLflow-Modellordner namens credit_defaults_model in Azure Machine Learning Studio. Der Ordner enthält die MLmodel-Datei und andere Modellartefakte.

Screenshot: Ressourcen eines MLflow-Beispielmodells (einschließlich der MLmodel-Datei)

Das folgende Beispiel zeigt eine MLmodel-Datei für ein Modell für maschinelles Sehen, das mit fastai trainiert wurde:

artifact_path: classifier
flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Modellvarianten

Angesichts der Vielzahl der verfügbaren Machine Learning-Frameworks hat MLflow das Konzept von Varianten als Möglichkeit eingeführt, einen einzigartigen Vertrag für alle Machine Learning-Frameworks anzubieten. Eine Variante gibt an, was für ein bestimmtes, mit einem spezifischen Framework erstellten Modell erwartet werden soll. Beispielsweise verfügt TensorFlow über eine eigene Variante, die angibt, wie ein TensorFlow-Modell beibehalten und geladen werden soll.

Da jede Modellvariante angibt, wie Modelle für ein bestimmtes Framework gespeichert und geladen werden sollen, erzwingt das MLmodel-Format keinen einzelnen Serialisierungsmechanismus, den alle Modelle unterstützen müssen. So kann jede Variante die Methoden verwenden, die die beste Leistung oder beste Unterstützung gemäß den bewährten Methoden bieten, ohne die Kompatibilität mit dem MLmodel-Standard zu beeinträchtigen.

Das folgende Beispiel zeigt den Abschnitt flavors für ein fastai-Modell.

flavors:
  fastai:
    data: model.fastai
    fastai_version: 2.4.1
  python_function:
    data: model.fastai
    env: conda.yaml
    loader_module: mlflow.fastai
    python_version: 3.8.12

Modellsignatur

Die Modellsignatur in MLflow ist ein wichtiger Bestandteil der Modellspezifikation, da sie als Datenvertrag zwischen dem Modell und dem Server dient, auf dem das Modell ausgeführt wird. Eine Modellsignatur ist auch wichtig für das Parsen und die Erzwingung der Eingabetypen eines Modells zur Bereitstellungszeit. Wenn eine Signatur verfügbar ist, erzwingt MLflow Eingabetypen, wenn Daten an Ihr Modell übermittelt werden. Weitere Informationen finden Sie unter Erzwingen von MLflow-Signaturen.

Signaturen werden zum Zeitpunkt der Protokollierung der Modelle angegeben und im Abschnitt signature der MLmodel-Datei gespeichert. Das Autolog-Feature in MLflow leitet Signaturen automatisch auf bestmögliche Weise ab. Sie können Modelle jedoch auch manuell protokollieren, wenn die abgeleiteten Signaturen nicht die benötigten sind. Weitere Informationen finden Sie unter Protokollieren von Modellen mit Signaturen.

Es gibt zwei Arten von Signaturen:

  • Spaltenbasierte Signaturen basieren auf Tabellendaten. Bei Modellen mit dieser Signatur liefert MLflow pandas.DataFrame-Objekte als Eingaben.
  • Tensorbasierte Signaturen funktionieren mit n-dimensionalen Arrays oder Tensoren. Bei Modellen mit dieser Signatur liefert MLflow numpy.ndarray oder im Fall benannter Tensoren ein Wörterbuch von numpy.ndarray.

Das folgende Beispiel zeigt den Abschnitt signature für ein Modell für maschinelles Sehen, das mit fastai trainiert wurde. Dieses Modell erhält einen Batch von Bildern, die als Tensoren der Form (300, 300, 3) mit der RGB-Darstellung als ganze Zahlen ohne Vorzeichen dargestellt werden. Das Modell gibt Batches von Vorhersagen als Wahrscheinlichkeiten für zwei Klassen aus.

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

Tipp

Azure Machine Learning generiert eine Swagger-Datei für die Bereitstellung eines MLflow-Modells mit einer verfügbaren Signatur. Dadurch ist es einfacher, Bereitstellungen mit Azure Machine Learning Studio zu testen.

Modellumgebung

Anforderungen für das auszuführende Modell werden in der Datei conda.yaml angegeben. MLflow kann Abhängigkeiten automatisch erkennen oder manuell durch Aufrufen der mlflow.<flavor>.log_model()-Methode angeben. Das Aufrufen der Methode kann nützlich sein, wenn die Bibliotheken, die MLflow in Ihrer Umgebung hinzugefügt hat, nicht die Bibliotheken sind, die Sie verwenden möchten.

Das folgende Beispiel für die Datei conda.yaml zeigt eine Umgebung für ein Modell, das mit dem fastai-Framework erstellt wurde:

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - astunparse==1.6.3
  - cffi==1.15.0
  - configparser==3.7.4
  - defusedxml==0.7.1
  - fastai==2.4.1
  - google-api-core==2.7.1
  - ipython==8.2.0
  - psutil==5.9.0
name: mlflow-env

Hinweis

Während eine MLflow-Umgebung auf der Ebene des Modells arbeitet, wird eine Azure Machine Learning-Umgebung auf der Ebene des Arbeitsbereichs (für registrierte Umgebungen) oder der Aufträge/Bereitstellungen (für anonyme Umgebungen) ausgeführt. Wenn Sie MLflow-Modelle bereitstellen, erstellt Azure Machine Learning die Modellumgebung und verwendet sie für die Bereitstellung. Sie können die Azure Machine Learning CLI verwenden, um dieses Verhalten außer Kraft zu setzen und MLflow-Modelle in einer bestimmten Azure Machine Learning-Umgebung bereitzustellen.

Prognosefunktion

Alle MLflow-Modelle enthalten eine predict-Funktion, die aufgerufen wird, wenn das Modell mithilfe einer No-Code-Bereitstellung bereitgestellt wird. Die Rückgabe der predict-Funktion (z. B. Klassen, Wahrscheinlichkeiten oder eine Vorhersage) hängt vom Framework (d. h. der Variante) ab, das fürs Training verwendet wird. In der Dokumentation der einzelnen Varianten wird beschrieben, was sie zurückgibt.

Sie können die predict-Funktion anpassen, um die Ausführung der Rückschlüsse zu ändern. Sie können entweder Modelle mit einem anderen Verhalten protokollieren oder eine benutzerdefinierte Modellvariante protokollieren.

Workflows zum Laden von MLflow-Modellen

Sie können MLflow-Modelle von den folgenden Speicherorten laden:

  • Direkt aus der Ausführung, in der die Modelle protokolliert werden
  • Aus dem Dateisystem, in dem die Modelle gespeichert sind
  • Aus der Modellregistrierung, in der die Modelle registriert sind

MLflow bietet eine konsistente Methode, diese Modelle unabhängig vom Ort zu laden.

Es gibt zwei Workflows zum Laden von Modellen:

  • Zurückladen desselben Objekts und derselben protokollierten Typen: Sie können Modelle mithilfe des MLflow SDK laden und eine Instanz des Modells mit Typen aus der Trainingsbibliothek abrufen. Beispielsweise gibt ein ONNX-Modell (Open Neural Network Exchange) ModelProto zurück, während ein mit scikit-learn trainiertes Entscheidungsstrukturmodell ein DecisionTreeClassifier-Objekt zurückgibt. Verwenden Sie mlflow.<flavor>.load_model(), um dasselbe Modellobjekt und dieselben protokollierten Typen zurückzuladen.

  • Zurückladen eines Modells zum Ausführen von Rückschlüssen: Sie können Modelle mithilfe des MLflow SDK laden und einen Wrapper abrufen, für den eine predict-Funktion garantiert wird. Es spielt keine Rolle, welche Variante Sie verwenden, da jedes MLflow-Modell über eine predict-Funktion verfügt.

    MLflow garantiert, dass Sie diese Funktion je nach Modellsignatur mithilfe von Argumenten vom Typ pandas.DataFrame, numpy.ndarray, oder dict[string, numpyndarray] aufrufen können. MLflow führt die Typkonvertierung in den Eingabetyp durch, den das Modell erwartet. Verwenden Sie mlflow.pyfunc.load_model(), um ein Modell für die Ausführung von Rückschlüssen zurückzuladen.