Open Neural Network Exchange in der Praxis Interoperabilität von ML-Frameworks und ONNX
Anbieter zum Thema
ONNX steht für Open Neural Network Exchange, ein offenes Austauschformat für die Repräsentation und Speicherung von KI-Modellen. Wie Machine-Learning-Frameworks in der Praxis mit ONNX umgehen, zeigt dieser Beitrag.

ONNX wird seit 2017 von Microsoft zusammen mit Facebook als Open-Source-Projekt entwickelt. Mittlerweile unterstützen mehr als dreißig Unternehmen wie IBM, NVIDIA, Intel, AWS und SAS das Projekt. ONNX erlaubt es, KI-Modelle zwischen einer Vielzahl von Machine Learning (ML)-Frameworks wie TensorFlow, PyTorch und scikit-learn ohne nennenswerten Aufwand auszutauschen.
Jedes ML-Framework besitzt individuelle Vorteile bei der Umsetzung von bestimmten Anwendungsfällen. Mit ONNX kann der Entwickler frei zwischen ihnen wählen. Der KI-Entwickler kann so beispielsweise für das Trainieren der KI-Modelle seine bevorzugten Tools und Frameworks nutzen. Die Modelle lassen sich dann mittels entsprechender Konverter in das ONNX-Format übersetzten, um dieses im nächsten Schritt, zum Beispiel von einem App-Entwickler, in einer anderen Umgebung direkt einbetten zu können.
Ein weiterer Vorteil für das Arbeiten mit ONNX ist der ONNX Model Zoo. Der Model Zoo ist eine Sammlung von vortrainierten KI-Modellen im ONNX-Format, die von der Community bereitgestellt und für bestimmte Anwendungsfälle optimiert wurden.
Brücke in der KI-Welt
Idealerweise ist in einem KI-Projekt das verwendete Framework, welches für die Modellentwicklung genutzt wird, unabhängig von der später eingesetzten Laufzeitumgebung. In der Realität sieht das aber oft anders aus: Soll ein mit TensorFlow entwickeltes Modell auf ein mobiles Endgerät zur Ausführung gebracht werden, so geschieht dies in der Regel mit TensorFlow Lite oder TensorFlow.js.
Dies schafft jedoch eine Abhängigkeit der Laufzeitumgebung zum Framework, welches bei der Modellentwicklung genutzt wurde. Vorteilhafter ist es, wenn man das ML-Modell mit seinem bevorzugten Framework entwickelt, dann in ein unabhängiges Standardformat konvertiert und es unter einer geeigneten Laufzeitumgebung ausführt.
Genau dieses Problem der fehlenden Interoperabilität zwischen den ML-Frameworks wird durch das ONNX-Austauschformat gelöst. Das generelle Vorgehen zur Verwendung des ONNX-Formats für KI-Projekte lässt sich grob in drei Schritte aufteilen:
- 1. Erstellung und Training des Modells mit dem bevorzugten Framework,
- 2. Konvertierung ins ONNX-Format,
- 3. Nutzung des Modells unter der am besten geeigneten Laufzeitumgebung.
An einem praktischen Beispiel zeigen wir nun, wie sich dieses Vorgehen umsetzen lässt. Ausgehend vom IRIS-Datensatz wird unter Verwendung des scikit-learn Frameworks ein einfaches Klassifizierungs¬modell erstellt und in das ONNX-Format konvertiert. Anschließend verwenden wir das so trainierte Modell in einem ML.NET-basierten C#-Projekt, um zuvor unbekannte Daten zu klassifizieren.
Die IRIS-Daten bestehen hier exemplarisch aus 150 Datensätzen und beschreiben eine Schwertlilienpflanze durch jeweils fünf Attribute – sepal length, sepal width, petal length, petal width und der Pflanzenart. Dabei kann die Pflanzenart einen von drei möglichen Werten annehmen: Setosa, Versicolour und Virginica. Die Aufgabe ist es nun, anhand der Pflanzen¬merkmale ihre Art zu bestimmen. Es liegt also ein einfaches „Supervised Learning“-Problem vor.
Damit ein trainiertes Modell in das ONNX-Format umgewandelt werden kann, wird ein passender Konverter benötigt. In diesem Fall einer, der für das scikit-learn Framework zugeschnitten ist. Einen solchen Konverter findet man zum Beispiel im Python Package skl2onnx. Der folgende Programmcode zeigt, wie mit wenigen Zeilen Code ein scikit-learn Modell als ONNX-Datei gespeichert werden kann.
# convert into ONNX
initial_type = [
('float_input', FloatSensorType([None, 4]))
]
onx = skl2onnx.convert_sklearn(
model,
name='IRIS Model',
doc_string='Simple classifier for the iris dataset.',
initial_types=initial_type
)
# save model as ONNX file
with open('./data/iris.onnx', 'wb') as f:
f.write(onx.SerializeToString())
Sobald ein ML-Modell im ONNX-Format vorliegt, lässt sich mit diesem Model auf verschiedene Arten weiterarbeiten. Ein nützliches Tool in diesem Zusammenhang ist die Netron App.
Netron ist ein Viewer für Deep Learning und ML-Modelle, mit dessen Hilfe man die interne Struktur als gerichteten Graphen darstellen kann, um einen tieferen Einblick in den Aufbau der Modelle zu bekommen. Zusätzlich werden weitere Eigenschaften wie die ONNX-Version oder die Namen der Ein- und Ausgabefelder des Modells angezeigt. Die vorangestellte Abbildung zeigt das Modell aus dem oberen Beispiel.
Im nächsten Schritt soll das trainierte Modell, welches als ONNX-Datei vorliegt, in einem C# ML.NET-Projekt verwendet werden. Das ML.NET Framework basiert auf .NET Core und .NET Standard und kann plattformübergreifend unter Linux, Windows und macOS ausgeführt werden.
Als zentraler Einstiegspunkt für alle ML.NET Operationen dient die Klasse MLContext aus dem Microsoft.ML Namespace. Nach dem Laden des Modells können anhand der Eingabedaten Vorhersagen gemacht werden. Dabei müssen die Daten durch C#-Objekte übergeben werden, die entsprechende annotierte Attribute besitzen.
Mit Hilfe der Annotationen kann das ML.NET Framework die Datentypen und die Zuordnung auf die Eingabe- und Ausgabefelder im ONNX-Modell herleiten und so die Daten korrekt abbilden. Die Spaltennamen der Ein- und Ausgabeparameter aus dem Modell müssen dabei ebenfalls über Annotationen bekannt gemacht werden. Die Spaltennamen wurden bei der Modellerstellung festgelegt und können auch im Netron Viewer angezeigt werden.
Der Eingabedatensatz aus dem Beispiel besteht aus einem Feld mit vier numerischen Werten und wurde im Modell mit dem Namen float_input bezeichnet. Als Ausgabe erhält man eine Zahl, die eine der möglichen Klassen darstellt (output_label) und eine Wahrscheinlichkeit für die Korrektheit dieser Klassifizierung (output_probability).
ONNX Zoo
Es wird also deutlich, wie einfach und schnell sich ein Modell aus scikit-learn ins ONNX-Format konvertieren und anwenden lässt. Doch wie verhält es sich, wenn man größere und komplexere Modelle für spezialisierte Anwendungsfälle wie Handschrift- oder Personenerkennung entwickeln will?
Die Schritte sind prinzipiell die gleichen, jedoch würde das Schreiben der Skripte, das Sammeln von benötigten Daten sowie das Trainieren der Modelle sehr viel mehr Zeit und Ressourcen benötigen. Um diesem Problem für solche Anwendungsfälle entgegenzuwirken, wurde der ONNX Zoo etabliert.
Der ONNX Zoo bietet eine große Vielfalt an bereits vortrainierten Modellen aus dem Deep-Learning-Bereich, die man sofort für sich und sein Problem nutzen und in die bestehenden Prozesse einbinden kann. Alle Modelle im ONNX Zoo kommen aus der Community und werden kontinuierlich weiterentwickelt. Sie bieten somit die ideale Plattform, um komplexe Fragestellungen lösen zu können. Die Modelle werden je nach Anwendungsfall in die folgenden Kategorien unterteilt:
- Objekterkennung und Bild-Segmentierung
- Körper-, Gesichts- und Gestenanalyse
- Sprach- & Audioverarbeitung
- Sprachenverständnis und -übersetzung
- Visuelle Fragebeantwortung & Dialog
Bei diesen Modellen handelt es sich um komplexe „State of the Art“ Deep-Learning-Architekturen. Darunter finden sich die allseits bekannten Architekturen von AlexNet, YOLO, Mask-RCNN und Bert wieder. Somit lässt sich zum Beispiel ein Objekterkennungsprogramm, welches Personen auf dem Video erkennen soll, in nur wenigen Zeilen Code umsetzen.
Der Nachteil ist, dass sich die Modelle in diesem Format nicht weiter auf neuen Datensätzen trainieren und optimieren lassen. Hierfür muss das Modell wieder in ein Format umgewandelt werden, welches ein Training erlaubt (zum Beispiel Tensorflow). Nach einem erneuten Training kann das Modell wieder zurück in ONNX umgewandelt und in die bestehenden Prozesse eingebunden werden.
ONNX.js
Eine weitere Komponente des ONNX-Kosmos bildete das ONNX.js-Framework, welches im November 2018 von Microsoft veröffentlicht wurde. ONNX.js ist eine JavaScript-Bibliothek für die Ausführung von ONNX-Modellen im Webbrowser. Durch die clientseitige Ausführung der Modelle sollen die KI-Anwendungen noch näher an den Endnutzer gebracht werden.
Für die Ausführung der ML-Modelle macht sich ONNX.js verschiedene Programmierschnittstellen zu Nutze, um die Hardware eines Endgerätes voll ausschöpfen zu können. Durch WebAssembly werden die Modelle auf der CPU ausgeführt und mit sogenannten Web Workern können Datenverarbeitungsschritte parallelisiert werden.
Dies ermöglicht eine nahezu gleichwertige Leistung, wie sie in den Frameworks wie Keras, PyTorch oder TensorFlow geboten wird. Neben der CPU können die Modelle mit WebGL auch auf der GPU ausgeführt werden. Dies bietet einen Vorteil, da die Ausführungszeiten der Modelle gegenüber der Ausführung mit der CPU um mehr als das Dreißigfache verkürzt werden können.
Der wohl größte Vorteil von ONNX.js liegt allerdings in der Bereitstellung der ML-Modelle. In den meisten Fällen werden die ML-Modelle als eine REST API bereitgestellt. In dieser Form können Daten an einen Server gesendet, die Modelle auf dem Server ausgeführt und die Ergebnisse an den Endnutzer zurückgesendet werden. Die Ausführung erfolgt also serverseitig.
Mit der Ausführung eines ML-Modells durch ONNX.js werden nicht die Daten zu dem Modell gebracht, sondern das Modell zu den Daten. Das Modell wird also auf dem Endgerät ausgeführt, was verschiedene Vorteile, aber auch einige Nachteile mit sich bringt.
Ein wichtiger Aspekt bei der clientseitigen Anwendung von ML-Modellen ist der Datenschutz, da die Daten für die Modellanwendung das Endgerät nicht verlassen müssen. Somit bietet ONNX.js für Bereiche wie der Gesundheits- oder Telekommunikationsbranche, die unter hohen Datenschutzauflagen arbeiten, eine Möglichkeit ihren Kunden zusätzliche ML-Lösungen anzubieten, die aus Datenschutzgründen zunächst nicht möglich waren.
Da die Daten nicht mehr aus dem Endgerät an einen Server gesendet werden müssen, können die Inferenzzeiten verkürzt und damit auch die Benutzerfreundlichkeit verbessert werden. Dies kann auch bei der Arbeit mit Datenströmen (z.B. Videodaten) ein Vorteil sein, da in diesem Bereich Verzögerungen von nur Sekundenbruchteilen eine Auswirkung auf die Umsetzbarkeit eines Projektes haben können.
Diesen Vorteil erkauft man sich allerdings mit dem Nachteil, dass man das ML-Modell zunächst auf das Endgerät übertragen muss. Speziell bei komplexeren ML-Modellen, die einige Gigabyte groß werden können, kann dies zu längeren initialen Ladezeiten führen. Oftmals kann die Komplexität eines ML-Modells noch nicht zum Beginn eines Projektes eingeschätzt werden, da diese stark von den Daten und dem Anwendungsfall abhängig ist. Daher müssen die initialen Ladezeiten einkalkuliert und für den einzelnen Anwendungsfall bewertet werden.
Ein weiterer Punkt ist die Datenvorverarbeitung. Wenn ein ML-Modell auf den Endgeräten ausgeführt werden soll, muss die Vorverarbeitung der Daten ebenfalls auf diesen Endgeräten stattfinden. Dabei kommen oftmals spezielle statistische Methoden zum Einsatz, die mit Sprachen wie Python, R, Go oder Julia bereits in die verschiedensten Frameworks, eingebettet sind. Die Nachbildung dieser Transformationsschritte kann sich mit JavaScript komplizierter gestalten, da es aktuell noch an ausgereiften Machine-Learning-Bibliotheken mangelt.
ONNX.js bringt also neue Möglichkeit für die Bereitstellung von ML-Modellen, wodurch einige Probleme in Bezug auf den Datenschutz und die Inferenzzeiten gelöst werden können. Allerdings werden ebenso neue Herausforderungen für die Datenverarbeitung und Übertragung der ML-Modelle geschaffen. Dennoch wird die clientseitige Anwendung von ML-Modelle zukünftig mehr an Bedeutung gewinnen, womit ONNX.js ein weiterer nützlicher Baustein für die Bereitstellung von ML-Modellen ist.
Fazit
Der Bedarf an einem offenen Standard für den Austausch von Deep Learning und ML-Modellen wird mit der stetig wachsenden Zahl an KI-Anwendungen immer wichtiger. Das Austauschformat ONNX garantiert, dass Modelle nicht an ein bestimmtes Framework gebunden sind und stellt so sicher, dass entwickelte KI-Lösungen auch langfristig nutzbar bleiben. Zusätzlich bietet der ONNX Zoo die ideale Plattform, um bereits vortrainierte Deep Learning Modelle zu nutzen. Zum Schluss lassen sich die Modelle mit ONNX.js schnell in einer Webapplikation integrieren und operationalisieren.
* Roland Abel ist Software-Architekt bei der adesso SE und beschäftigt sich mit der Entwicklung von Machine-Learning- und Deep-Learning-Modellen. Oleg Smolanko ist Data Scientist bei adesso SE und ist darauf spezialisiert individuelle KI-Lösungen auf Azure umzusetzen und zu operationalisieren. Bjarne Meyn ist Data Scientist bei der adesso SE und spezialisiert auf die Entwicklung und Implementierung von Machine-Learning-Lösungen auf der Azure Cloud Platform.
(ID:47291906)