Verwaltung und Inbetriebnahme von ML-Modellen

Seite 3: Open Neural Network Exchange (ONNX)

Inhaltsverzeichnis

Nachdem das Training beendet ist, könnte man das Baseline-Modell deployen. Dazu müssen Entwickler eine Applikation bauen, die neue Daten mit dem Modell inferiert. Dazu ruft XGBoost die predict-Methode auf. Darüber hinaus ist die Entwicklung, Versionierung und Verwaltung weiterer Modell-Experimente mit DVC möglich. Vielleicht liefert ein Deep-Learning-Verfahren bessere Ergebnisse als der XGBoost-Ansatz.

Bei diesen Experimenten stellen sich unter anderem folgende Fragen:

  • TensorFlow, PyTorch oder MxNet – welches dieser Frameworks sollte man wählen?
  • Was passiert, wenn ein besseres Modell gefunden wurde?
  • Ist für jedes Modell-Framework die Entwicklung einer neuen Applikation nötig?

Sinnvoll wäre eine Produktionsumgebung, die mit standardisierten Modellen funktioniert. Dadurch wären alle Frameworks mit der Umgebung kompatibel, die den Export des Modells in das standardisierte Format implementieren.

Open Neural Networks Exchange (ONNX) ist eines der Projekte, die sich mit der Standardisierung von Machine-Learning- und Deep-Learning-Modellen beschäftigt. Das Projekt wurde 2017 von Microsoft, Facebook und Amazon ins Leben gerufen. Die Idee hinter ONNX ist, dass man ein Modell zwischen einem Framework A und B problemlos austauschen kann. Abbildung 4 zeigt einen Teilausschnitt des Frameworks. Der Standard besteht aus einem erweiterbaren Graphen, definierten Datentypen und festgelegten Operatoren und Funktionen. Durch eine Import- und Exportfunktion zu bestehenden Frameworks lassen sich die Architektur und Gewichte eines Modells austauschen. Die Kompatibilität zwischen den Frameworks bezeichnet man Fachjargon als Interoperabilität.

Teilausschnitt der Frameworks mit ONNX Support (Abb. 4)

Die Konvertierung des XGBoost-Modells nach ONNX benötigt das Paket onnxmltools. Darüber hinaus ist vor der Konvertierung die Definition des Eingangsvektors für das Modell notwendig. src/xgb_train.py wird um die folgenden Zeilen ergänzt, um das ONNX-Modell ebenfalls abzulegen. Zusätzlich wird der dvc run-Befehl mit dem Flag -o model/xgb/model.onnx erweitert:

dvc run -f model/xgb.dvc -d src/xgb_train.py -d data/prepared -o model/xgb/model.pickle -o model/xgb/model.onnx -M model/xgb/score.metrics python src/xgb_train.py

Das folgende Beispiel bildet die Erweiterung von src/xgb_train.py um die ONNX-Konvertierung des XGBoost-Modells ab.

import onnxmltools
from onnxmltools.convert.common.data_types import FloatTensorType

initial_type = [('feature_input', FloatTensorType([1, 784]))]
xgb_onnx = onnxmltools.convert.convert_xgboost(xgb, initial_types=initial_type)
with open("model/xgb/model.onnx", "wb") as file:
    file.write(xgb_onnx.SerializeToString())

Ein weiteres Projekt, das der Standard entwickelt hat, ist die ONNX Runtime, eine Laufzeit für die Inferenz (s. Abb. 5). Mit dieser Technologie lassen sich ONNX-Modelle innerhalb einer Umgebung ausführen. Dadurch ist es möglich, die Modelle nach dem Training ohne große Anpassungen direkt in den produktiven Betrieb mit der gleichen Komponente zu übernehmen.

Training mit XGBoost, Standardisierung mit ONNX und Inferenz mit der ONNX Runtime (Abb. 5)

Nachdem onnxruntime über pip installiert wurde, lass sich die Inferenz ausführen.

import onnxruntime as rt
import numpy as np

session = rt.InferenceSession("model/xgb/model.onnx") 
input_name = session.get_inputs()[0].name 
session.run([], {input_name: np.array(np.random.rand(1, 28*28), dtype=np.float32)})

Dazu wird zuerst das Modell geladen und im Anschluss mithilfe der Metadaten der Eingangsvektor definiert. Für den Input ist es wichtig, dass die Daten als NumPy-Array mit dem Datentyp Float32 vorliegen.