ONNX und Modellexport: Modelle zwischen Frameworks austauschen
Kurz: ONNX ist ein offenes Austauschformat für trainierte Modelle; damit lassen sich in PyTorch oder TensorFlow trainierte Netze unabhängig vom Framework schnell und plattformübergreifend ausführen.
Genauer: Ein Modell wird oft in Python/PyTorch trainiert, soll aber in C++, Java, im Browser, auf dem Handy oder Edge-Gerät laufen. ONNX (Open Neural Network Exchange) beschreibt das Modell als Graph aus Operatoren mit Gewichten in einer Datei.
Im Detail
Export und Ausführen
import torch
modell.eval()
beispiel = torch.randn(1, 3, 224, 224)
torch.onnx.export(modell, beispiel, 'modell.onnx',
input_names=['bild'], output_names=['klassen'],
dynamic_axes={'bild': {0: 'batch'}}, opset_version=17)import onnxruntime as ort, numpy as np
sess = ort.InferenceSession('modell.onnx', providers=['CPUExecutionProvider'])
out = sess.run(None, {'bild': np.random.randn(1,3,224,224).astype('float32')})ONNX Runtime läuft auf CPU, GPU (CUDA, DirectML), NPU, mobil und im Browser (onnxruntime-web, WebGPU/WASM). Prüfe Ergebnisse gegen das Original (np.allclose).
Optimieren
- Graph-Optimierung: Operatoren verschmelzen, Konstanten falten.
- Quantisierung (INT8/FP16) für kleinere, schnellere Modelle (siehe Quantisierung).
- Pruning/Distillation vor dem Export.
- Batching, feste vs. dynamische Eingabeformen (
dynamic_axes). - Hardware-Beschleuniger: TensorRT (NVIDIA), OpenVINO (Intel), Core ML (Apple), TFLite (Android/Edge), ncnn.
- LLMs: GGUF/llama.cpp, safetensors; ONNX-GenAI.
- Profilieren (Latenz, Speicher) auf Zielhardware.
Formate im Überblick
- ONNX: neutral, breite Runtime-Unterstützung.
- TorchScript/torch.export: PyTorch-intern.
- SavedModel/TFLite: TensorFlow/Edge.
- Core ML (.mlmodel): Apple.
- safetensors: sichere Gewichte-Dateien (kein Code-Ausführen wie bei Pickle; Pickle-Dateien aus unbekannter Quelle sind unsicher!).
- GGUF: Quantisierte LLMs für llama.cpp/Ollama.
- Hugging Face Hub: Modelle teilen, Model Cards und Lizenzen lesen.
Fallstricke
- Nicht jeder Operator wird unterstützt; dynamische Kontrollflüsse (if/Schleifen) lassen sich schwer exportieren.
- Vor-/Nachverarbeitung (Tokenizer, Normalisierung, Skalierung) muss identisch nachgebaut werden: häufige Fehlerquelle!
- Versionsabhängigkeit (Opset); Genauigkeitsunterschiede FP16/INT8 prüfen.
- Lizenz des Modells und der Trainingsdaten (kommerzielle Nutzung?).
- Sicherheit: Modelle aus unbekannter Quelle wie Software behandeln (Signaturen, Hash, safetensors).
- Wartung: Modell-Versionierung, Monitoring (MLOps), Rollback.
Siehe auch: MLOps, Quantisierung, KI-Frameworks