ONNX (Open Neural Network Exchange)
ONNX es un formato abierto que almacena un modelo entrenado como un grafo de operadores estándar, de modo que un modelo entrenado en PyTorch puede ejecutarse en muchos entornos de ejecución.
ONNX (Open Neural Network Exchange) es un formato de archivo estándar abierto para modelos de aprendizaje automático. Un archivo .onnx almacena un modelo entrenado como un grafo de cálculo compuesto por operadores estándar junto con sus pesos, de modo que un modelo entrenado con un marco de trabajo, como PyTorch, pueda ejecutarse en otros entornos de ejecución y en muchos tipos de hardware. Facebook y Microsoft lanzaron ONNX en septiembre de 2017, y desde noviembre de 2019 es un proyecto graduado de LF AI & Data, la fundación de IA de Linux Foundation. ONNX suele ser el punto de transferencia entre el entrenamiento y el despliegue del modelo: un único archivo exportado puede alimentar ONNX Runtime, TensorRT, OpenVINO y los compiladores de muchos aceleradores de IA en el borde.
Qué contiene un archivo ONNX#
Un modelo ONNX se serializa con Protocol Buffers y contiene cuatro partes:
- Grafo: Nodos que llaman a operadores como
Conv,MatMulyRelu, conectados mediante tensores con nombre. Las entradas y salidas del grafo contienen tipos de datos y formas; cada dimensión puede ser fija o simbólica, como el tamaño variable del lote. - Inicializadores: Los pesos entrenados. Protocol Buffers limita los archivos individuales a 2 GB, por lo que los modelos más grandes almacenan sus pesos en archivos de datos externos junto al archivo
.onnx. - Versión de opset: Los operadores se versionan en opsets, y el entorno de ejecución debe ser compatible con el opset con el que se exportó el modelo. Los opsets nuevos añaden operadores sin modificar los anteriores, como el operador
Attention, añadido en el opset 23. - Metadatos: El nombre del productor, la versión del modelo y pares clave-valor personalizados, como los nombres de las clases.
Un segundo dominio de operadores, ONNX-ML, abarca modelos clásicos, como los conjuntos de árboles y los clasificadores lineales. Así, convertidores como skl2onnx y onnxmltools exportan modelos de scikit-learn, LightGBM y XGBoost al mismo formato. Visores como Netron muestran el grafo nodo por nodo. En la práctica, ONNX conecta muchos marcos de entrenamiento con muchos entornos de ejecución:
Ejecución de modelos ONNX#
ONNX Runtime, el motor de inferencia de código abierto de Microsoft, ejecuta archivos ONNX en servidores, ordenadores de sobremesa, teléfonos y navegadores. Optimiza el grafo al cargar un modelo, por ejemplo, plegando constantes y fusionando una convolución con la normalización por lotes que la sigue; después, asigna cada parte del grafo a un proveedor de ejecución adecuado para el hardware disponible: CUDA o TensorRT en GPU de NVIDIA, OpenVINO en hardware Intel, DirectML en GPU de Windows, Core ML en dispositivos Apple, QNN en NPU de Qualcomm y WebGPU en navegadores. Windows ML, el marco de inferencia local de Microsoft, se ejecuta sobre ONNX Runtime; otros motores, como TensorRT y OpenVINO, importan archivos ONNX y los compilan en sus propios formatos.
Ultralytics YOLO26 se exporta a ONNX con model.export(format="onnx"), y la exportación a TensorRT de Ultralytics crea su motor a partir de ese mismo archivo ONNX. El archivo exportado se ejecuta en ONNX Runtime sin PyTorch:
import onnxruntime as ort
from ultralytics import YOLO
# Exporta YOLO26n a ONNX con dimensiones simbólicas para el lote, la altura y la anchura
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# Carga el grafo en ONNX Runtime, que no necesita ni PyTorch ni Ultralytics
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)Imprime la entrada del grafo, images, con dimensiones simbólicas para el lote, la altura y la anchura, y su salida de predicción sin procesar, output0, que es la firma que cualquier entorno de ejecución ONNX utiliza para alimentar el modelo y leer sus resultados.
ONNX frente a formatos y herramientas relacionados#
- ONNX Runtime: El motor de inferencia que ejecuta archivos ONNX; es un proyecto independiente liderado por Microsoft al que a menudo se hace referencia simplemente como «ONNX».
- TensorRT: El compilador de NVIDIA convierte un archivo ONNX en un motor optimizado para un tipo de GPU y una versión de TensorRT concretos, por lo que los equipos conservan el archivo ONNX como fuente portátil y vuelven a crear los motores para cada destino.
- Formatos de PyTorch: Los puntos de control
.pty los archivos safetensors almacenan pesos para código que reconstruye el modelo, mientras que TorchScript ytorch.exportcapturan grafos para los propios entornos de ejecución de PyTorch. - Otros formatos de despliegue: IR de OpenVINO, archivos LiteRT
.tflite, paquetes de Core ML y archivos GGUF para LLM cuantizados se dirigen cada uno a entornos de ejecución específicos. coremltools convierte directamente modelos de PyTorch y dejó de admitir entradas ONNX en la versión 6.
Aplicaciones en el mundo real#
- Aplicaciones multiplataforma: Un solo archivo ONNX sirve para servidores Linux, aplicaciones de Windows mediante Windows ML y aplicaciones de Android e iOS mediante ONNX Runtime Mobile.
- Inferencia en el navegador: ONNX Runtime Web ejecuta modelos en el dispositivo del usuario con WebGPU o WebAssembly, por lo que los fotogramas de la cámara de funciones como la estimación de pose nunca salen del navegador.
- Aceleradores de borde: Las cadenas de herramientas NPU de fabricantes como Hailo, Qualcomm y Rockchip aceptan modelos ONNX como entrada y los compilan, a menudo con cuantización a INT8, para sus chips.
- Modelos clásicos en producción: Los árboles potenciados por gradiente y las canalizaciones de scikit-learn convertidos a ONNX se ejecutan en servicios C#, Java y C++ mediante ONNX Runtime, sin necesidad de un intérprete de Python en la ruta de servicio.










