Tutorial#

ONNX Runtime bietet eine einfache Möglichkeit, maschinell gelernte Modelle mit hoher Leistung auf CPUs oder GPUs auszuführen, ohne von dem Trainings-Framework abhängig zu sein. Machine-Learning-Frameworks sind in der Regel für das Batch-Training optimiert und nicht für die Vorhersage, was in Anwendungen, Websites und Diensten ein häufigeres Szenario ist. Auf hoher Ebene können Sie

  1. Ein Modell mit Ihrem bevorzugten Framework trainieren.

  2. Das Modell in das ONNX-Format konvertieren oder exportieren. Weitere Details finden Sie in den ONNX-Tutorials.

  3. Das Modell mit ONNX Runtime laden und ausführen.

In diesem Tutorial werden wir kurz eine Pipeline mit scikit-learn erstellen, sie in das ONNX-Format konvertieren und die ersten Vorhersagen durchführen.

Schritt 1: Trainieren eines Modells mit Ihrem bevorzugten Framework#

Wir werden den berühmten Iris-Datensatz verwenden.

<<<

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y)

from sklearn.linear_model import LogisticRegression
clr = LogisticRegression()
clr.fit(X_train, y_train)
print(clr)

>>>

    LogisticRegression()

Schritt 2: Konvertieren oder Exportieren des Modells in das ONNX-Format#

ONNX ist ein Format zur Beschreibung von Modellen des maschinellen Lernens. Es definiert eine Reihe von häufig verwendeten Operatoren zur Zusammensetzung von Modellen. Es gibt Tools zur Konvertierung anderer Modellformate in ONNX. Hier werden wir ONNXMLTools verwenden.

<<<

from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType

initial_type = [('float_input', FloatTensorType([None, 4]))]
onx = convert_sklearn(clr, initial_types=initial_type)
with open("logreg_iris.onnx", "wb") as f:
    f.write(onx.SerializeToString())

>>>

    

Schritt 3: Laden und Ausführen des Modells mit ONNX Runtime#

Wir werden ONNX Runtime verwenden, um die Vorhersagen für dieses Machine-Learning-Modell zu berechnen.

<<<

import numpy
import onnxruntime as rt

sess = rt.InferenceSession(
    "logreg_iris.onnx", providers=rt.get_available_providers())
input_name = sess.get_inputs()[0].name
pred_onx = sess.run(None, {input_name: X_test.astype(numpy.float32)})[0]
print(pred_onx)

>>>

    [1 2 1 2 2 2 0 1 0 2 2 2 2 1 1 1 1 2 0 1 0 2 0 2 0 0 0 0 2 2 1 2 1 1 1 0 2
     1]

Der Code kann so geändert werden, dass eine bestimmte Ausgabe erhalten wird, indem ihr Name in einer Liste angegeben wird.

<<<

import numpy
import onnxruntime as rt

sess = rt.InferenceSession(
    "logreg_iris.onnx", providers=rt.get_available_providers())
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name
pred_onx = sess.run(
    [label_name], {input_name: X_test.astype(numpy.float32)})[0]
print(pred_onx)

>>>

    [1 2 1 2 2 2 0 1 0 2 2 2 2 1 1 1 1 2 0 1 0 2 0 2 0 0 0 0 2 2 1 2 1 1 1 0 2
     1]