ONNX (Open Neural Network Exchange)
ONNX est un format ouvert qui stocke un modèle entraîné sous forme de graphe d’opérateurs standard. Un modèle entraîné dans PyTorch peut ainsi s’exécuter sur de nombreux environnements d’exécution.
ONNX (Open Neural Network Exchange) est un format de fichier ouvert et standardisé pour les modèles d’apprentissage automatique. Un fichier .onnx stocke un modèle entraîné sous la forme d’un graphe de calcul composé d’opérateurs standard et de ses poids, afin qu’un modèle entraîné dans un framework, comme PyTorch, puisse s’exécuter dans d’autres environnements et sur de nombreux types de matériel. Facebook et Microsoft ont lancé ONNX en septembre 2017 ; depuis novembre 2019, ONNX est un projet arrivé à maturité de LF AI & Data, la fondation de l’IA de la Linux Foundation. ONNX est le point de passage habituel entre l’entraînement et le déploiement de modèles : un seul fichier exporté peut alimenter ONNX Runtime, TensorRT, OpenVINO et les compilateurs de nombreux accélérateurs d’IA en périphérie.
Contenu d’un fichier ONNX#
Un modèle ONNX est sérialisé avec Protocol Buffers et contient quatre éléments :
- Graphe : Des nœuds qui appellent des opérateurs comme
Conv,MatMuletRelu, reliés par des tenseurs nommés. Les entrées et sorties du graphe comportent des types de données et des formes ; chaque dimension peut être fixe ou symbolique, comme la taille variable d’un lot. - Initialiseurs : Les poids entraînés. Protocol Buffers limite un fichier unique à 2 Go ; les modèles plus volumineux stockent donc leurs poids dans des fichiers de données externes placés à côté du fichier
.onnx. - Version de l’ensemble d’opérateurs : Les opérateurs sont versionnés dans des ensembles d’opérateurs (opsets), et un environnement d’exécution doit prendre en charge l’opset utilisé pour exporter le modèle. Les nouveaux opsets ajoutent des opérateurs sans modifier les anciens, comme l’opérateur
Attentionajouté dans l’opset 23. - Métadonnées : Le nom du producteur, la version du modèle et les paires clé-valeur personnalisées, comme les noms des classes.
Un deuxième domaine d’opérateurs, ONNX-ML, couvre les modèles classiques comme les ensembles d’arbres et les classificateurs linéaires. Des convertisseurs comme skl2onnx et onnxmltools exportent ainsi les modèles scikit-learn, LightGBM et XGBoost dans le même format. Des outils de visualisation comme Netron affichent le graphe nœud par nœud. En pratique, ONNX fait le lien entre de nombreux frameworks d’entraînement et environnements d’exécution :
Exécuter des modèles ONNX#
ONNX Runtime, le moteur d’inférence libre de Microsoft, exécute les fichiers ONNX sur des serveurs, des ordinateurs de bureau, des téléphones et des navigateurs. Il optimise le graphe au chargement du modèle, par exemple en repliant les constantes et en fusionnant une convolution avec la normalisation par lots qui la suit, puis confie chaque partie du graphe à un fournisseur d’exécution adapté au matériel disponible : CUDA ou TensorRT sur les GPU NVIDIA, OpenVINO sur le matériel Intel, DirectML sur les GPU Windows, Core ML sur les appareils Apple, QNN sur les NPU Qualcomm et WebGPU dans les navigateurs. Windows ML, le cadre d’inférence locale de Microsoft, repose sur ONNX Runtime ; d’autres moteurs, comme TensorRT et OpenVINO, importent les fichiers ONNX et les compilent dans leurs propres formats.
Ultralytics YOLO26 exporte vers ONNX avec model.export(format="onnx"), et l'export TensorRT d'Ultralytics crée son moteur à partir de ce même fichier ONNX. Le fichier exporté s'exécute dans ONNX Runtime sans PyTorch :
import onnxruntime as ort
from ultralytics import YOLO
# Exporter YOLO26n vers ONNX avec des dimensions symboliques pour le lot, la hauteur et la largeur
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# Charger le graphe dans ONNX Runtime, qui n'a besoin ni de PyTorch ni d'Ultralytics
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)Il affiche l'entrée du graphe, images, avec des dimensions symboliques pour le lot, la hauteur et la largeur, ainsi que sa sortie de prédiction brute, output0, qui constitue la signature utilisée par tout moteur d'exécution ONNX pour transmettre les données au modèle et lire ses résultats.
ONNX et formats et outils connexes#
- ONNX Runtime : le moteur d'inférence qui exécute les fichiers ONNX, un projet distinct dirigé par Microsoft que l'on abrège souvent en « ONNX ».
- TensorRT : le compilateur de NVIDIA, qui transforme un fichier ONNX en un moteur optimisé pour un type de GPU et une version de TensorRT spécifiques ; les équipes conservent donc le fichier ONNX comme source portable et recréent les moteurs pour chaque cible.
- Formats PyTorch : les points de contrôle
.ptet les fichiers safetensors stockent les poids pour du code qui reconstruit le modèle, tandis que TorchScript ettorch.exportcapturent des graphes pour les propres moteurs d'exécution de PyTorch. - Autres formats de déploiement : l'IR OpenVINO, les fichiers
.tfliteLiteRT, les packages Core ML et les fichiers GGUF pour les LLM quantifiés ciblent chacun des moteurs d'exécution spécifiques. coremltools d'Apple convertit directement les modèles PyTorch et a abandonné la prise en charge des entrées ONNX dans la version 6.
Applications concrètes#
- Applications multiplateformes : un seul fichier ONNX sert aux serveurs Linux, aux applications Windows via Windows ML et aux applications Android et iOS via ONNX Runtime Mobile.
- Inférence dans le navigateur : ONNX Runtime Web exécute les modèles sur l'appareil de l'utilisateur avec WebGPU ou WebAssembly ; les images de caméra utilisées pour des fonctionnalités comme l'estimation de pose ne quittent donc jamais le navigateur.
- Accélérateurs en périphérie : les chaînes d'outils NPU de fournisseurs comme Hailo, Qualcomm et Rockchip acceptent des modèles ONNX en entrée et les compilent, souvent avec une quantification en INT8, pour leurs puces.
- Modèles classiques en production : les arbres de décision à gradient boosté et les pipelines scikit-learn convertis en ONNX s'exécutent dans des services C#, Java et C++ via ONNX Runtime, sans interpréteur Python dans le chemin de service.










