ONNX (Open Neural Network Exchange)
ONNX ist ein offenes Format, das ein trainiertes Modell als Graph aus Standardoperatoren speichert. Dadurch kann ein in PyTorch trainiertes Modell auf vielen Laufzeitumgebungen ausgeführt werden.
ONNX (Austauschformat für offene neuronale Netze) ist ein offenes Standarddateiformat für Modelle des maschinellen Lernens. Eine .onnx-Datei speichert ein trainiertes Modell als Berechnungsgraph aus Standardoperatoren zusammen mit seinen Gewichten. So kann ein Modell, das mit einem Framework wie PyTorch trainiert wurde, in anderen Laufzeitumgebungen und auf vielen Hardwaretypen ausgeführt werden. Facebook und Microsoft führten ONNX im September 2017 ein. Seit November 2019 ist ONNX ein abgeschlossenes Projekt von LF AI & Data, der KI-Stiftung der Linux Foundation. ONNX ist üblicherweise die Übergabestelle zwischen Training und Modellbereitstellung: Eine einzelne exportierte Datei kann von ONNX Runtime, TensorRT, OpenVINO und den Compilern vieler Edge-KI-Beschleuniger verwendet werden.
Was eine ONNX-Datei enthält#
Ein ONNX-Modell wird mit Protocol Buffers serialisiert und besteht aus vier Teilen:
- Graph: Knoten, die Operatoren wie
Conv,MatMulundReluaufrufen und durch benannte Tensoren miteinander verbunden sind. Ein- und Ausgaben des Graphen enthalten Datentypen und Formen. Jede Dimension kann fest oder symbolisch sein, etwa eine variable Batch-Größe. - Initialisierer: Die trainierten Gewichte. Da Protocol Buffers eine einzelne Datei auf 2 GB begrenzt, speichern größere Modelle ihre Gewichte in externen Datendateien neben der
.onnx-Datei. - Opset-Version: Die Operatoren sind in Opsets versioniert, und eine Laufzeitumgebung muss das Opset unterstützen, mit dem ein Modell exportiert wurde. Neue Opsets ergänzen Operatoren, ohne ältere zu verändern, etwa den Operator
Attention, der in Opset 23 hinzugefügt wurde. - Metadaten: Der Name des Herstellers, die Modellversion und benutzerdefinierte Schlüssel-Wert-Paare, etwa Klassennamen.
Eine zweite Operator-Domäne, ONNX-ML, deckt klassische Modelle wie Baumensembles und lineare Klassifizierer ab. Deshalb exportieren Konverter wie skl2onnx und onnxmltools scikit-learn-, LightGBM- und XGBoost-Modelle in dasselbe Format. Mit Viewern wie Netron lässt sich der Graph Knoten für Knoten anzeigen. In der Praxis verbindet ONNX viele Trainingsframeworks mit vielen Laufzeitumgebungen:
ONNX-Modelle ausführen#
ONNX Runtime, Microsofts quelloffene Inferenz-Engine, führt ONNX-Dateien auf Servern, Desktopcomputern, Smartphones und in Browsern aus. Beim Laden eines Modells optimiert sie den Graphen, indem sie beispielsweise Konstanten zusammenfasst und eine Faltung mit der darauffolgenden Batch-Normalisierung fusioniert. Anschließend übergibt sie jeden Teil des Graphen einem Ausführungsanbieter, der zur vorhandenen Hardware passt: CUDA oder TensorRT auf NVIDIA-GPUs, OpenVINO auf Intel-Hardware, DirectML auf Windows-GPUs, Core ML auf Apple-Geräten, QNN auf Qualcomm-NPUs und WebGPU in Browsern. Windows ML, Microsofts lokales Inferenzframework, läuft auf ONNX Runtime. Andere Engines wie TensorRT und OpenVINO importieren ONNX-Dateien und kompilieren sie in ihre eigenen Formate.
Ultralytics YOLO26 exportiert nach ONNX mit model.export(format="onnx"), und der TensorRT-Export von Ultralytics erstellt seine Engine aus derselben ONNX-Datei. Die exportierte Datei lässt sich ohne PyTorch mit ONNX Runtime ausführen:
import onnxruntime as ort
from ultralytics import YOLO
# YOLO26n mit symbolischen Dimensionen für Batchgröße, Höhe und Breite nach ONNX exportieren
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# Den Graphen in ONNX Runtime laden, das weder PyTorch noch Ultralytics benötigt
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)Ausgegeben werden die Eingabe des Graphen, images, mit symbolischen Dimensionen für Batchgröße, Höhe und Breite, sowie die rohe Vorhersageausgabe, output0. Diese Signatur verwendet jede ONNX-Laufzeitumgebung, um dem Modell Eingaben zu übergeben und seine Ergebnisse auszulesen.
ONNX im Vergleich zu verwandten Formaten und Werkzeugen#
- ONNX Runtime: Die Inferenz-Engine führt ONNX-Dateien aus. Sie ist ein eigenständiges, von Microsoft geleitetes Projekt, das häufig verkürzt als „ONNX“ bezeichnet wird.
- TensorRT: Der Compiler von NVIDIA wandelt eine ONNX-Datei in eine Engine um, die für einen bestimmten GPU-Typ und eine bestimmte TensorRT-Version optimiert ist. Teams behalten daher die ONNX-Datei als portable Quelle und erstellen für jedes Zielsystem eigene Engines.
- PyTorch-Formate:
.pt-Checkpoints und safetensors-Dateien speichern Gewichte für Code, der das Modell erneut erstellt. TorchScript undtorch.exportbilden Graphen für die eigenen Laufzeitumgebungen von PyTorch ab. - Weitere Bereitstellungsformate: OpenVINO IR,
.tflite-Dateien für LiteRT, Core ML-Pakete und GGUF-Dateien für quantisierte LLMs sind jeweils auf bestimmte Laufzeitumgebungen ausgelegt. Apples coremltools wandelt PyTorch-Modelle direkt um; ab Version 6 wurde die ONNX-Eingabe nicht mehr unterstützt.
Anwendungen in der Praxis#
- Plattformübergreifende Apps: Eine ONNX-Datei kann auf Linux-Servern, in Windows-Apps über Windows ML und in Android- und iOS-Apps über ONNX Runtime Mobile eingesetzt werden.
- Inferenz im Browser: ONNX Runtime Web führt Modelle mit WebGPU oder WebAssembly auf dem Gerät des Nutzers aus. Kamerabilder für Funktionen wie die Posenschätzung verlassen dadurch nie den Browser.
- Edge-Beschleuniger: NPU-Werkzeugketten von Anbietern wie Hailo, Qualcomm und Rockchip nehmen ONNX-Modelle als Eingabe und kompilieren sie häufig mit einer Quantisierung auf INT8 für ihre Chips.
- Klassische Modelle im Produktivbetrieb: Mit ONNX Runtime lassen sich Gradient-Boosting-Bäume und in ONNX umgewandelte scikit-learn-Pipelines in C#-, Java- und C++-Diensten ausführen, ohne dass der Bereitstellungspfad einen Python-Interpreter benötigt.










