ONNX définit un format de graphe de calcul : les nœuds représentent des opérations (multiplication matricielle, convolution, attention), les arêtes représentent les tenseurs circulant entre les opérations. Le graphe inclut toute l'information nécessaire pour exécuter le modèle : architecture, poids, formes d'entrée/sortie et définitions d'opérateurs. ONNX Runtime (Microsoft) est le runtime le plus populaire, supportant CPU, GPU et accélérateurs spécialisés.
ONNX est le plus utile quand : (1) tu dois déployer sur du matériel non-NVIDIA (Intel, AMD, ARM, mobile) où PyTorch CUDA n'est pas disponible, (2) tu as besoin de vitesse d'inférence maximale et que les optimisations d'ONNX Runtime surpassent PyTorch, ou (3) tu intègres un modèle dans une application non-Python (ONNX Runtime a des bindings C++, C#, Java et JavaScript). Pour l'inférence GPU standard avec de gros LLM, les frameworks de service spécialisés (vLLM, TGI) surpassent généralement ONNX.
Toutes les opérations PyTorch ne se convertissent pas proprement en ONNX, surtout les opérateurs personnalisés et les architectures dynamiques. Les modèles complexes peuvent nécessiter une intervention manuelle pour être correctement exportés. ONNX est aussi en retard par rapport aux architectures de pointe — les nouveaux types de modèles peuvent ne pas être supportés tant que les opérateurs ONNX ne sont pas ajoutés. Pour l'inférence LLM spécifiquement, l'écosystème GGUF/llama.cpp et TensorRT-LLM sont devenus plus populaires qu'ONNX pour la plupart des cas d'usage.