ONNX (Open Neural Network Exchange)
ONNX — это открытый формат, в котором обученная модель хранится в виде графа стандартных операторов, поэтому модель, обученная в PyTorch, может запускаться во многих средах выполнения.
ONNX (Open Neural Network Exchange) — открытый стандарт формата файлов для моделей машинного обучения. Файл .onnx хранит обученную модель в виде графа вычислений из стандартных операторов вместе с её весами, поэтому модель, обученная в одном фреймворке, например PyTorch, может работать в других средах и на оборудовании разных типов. Facebook и Microsoft представили ONNX в сентябре 2017 года; с ноября 2019 года он стал зрелым проектом LF AI & Data — подразделения Linux Foundation, занимающегося ИИ. ONNX обычно служит промежуточным форматом между обучением и развёртыванием модели: один экспортированный файл можно использовать в ONNX Runtime, TensorRT, OpenVINO и компиляторах многих ускорителей периферийного ИИ.
Что содержит файл ONNX#
Модель ONNX сериализуется с помощью Protocol Buffers и состоит из четырёх частей:
- Граф: Узлы, вызывающие операторы, например
Conv,MatMulиRelu, которые соединены именованными тензорами. Для входных и выходных данных графа заданы типы данных и формы, а размер каждой оси может быть фиксированным или символическим, например для переменного размера батча. - Инициализаторы: Обученные веса. Protocol Buffers ограничивает размер одного файла 2 ГБ, поэтому более крупные модели хранят веса во внешних файлах данных рядом с файлом
.onnx. - Версия набора операторов: Версии операторов задаются наборами операторов, и среда выполнения должна поддерживать тот набор, с которым экспортировали модель. Новые наборы добавляют операторы, не меняя старые, например оператор
Attention, добавленный в набор версии 23. - Метаданные: Название производителя, версия модели и пользовательские пары «ключ — значение», например названия классов.
Вторая область операторов, ONNX-ML, охватывает классические модели, например древовидные ансамбли и линейные классификаторы. Поэтому конвертеры, такие как skl2onnx и onnxmltools, экспортируют модели scikit-learn, LightGBM и XGBoost в тот же формат. Средства просмотра, например Netron, отображают граф по узлам. На практике ONNX служит связующим звеном между множеством фреймворков обучения и сред выполнения:
Запуск моделей ONNX#
ONNX Runtime — разработанный Microsoft движок инференса с открытым исходным кодом, который запускает файлы ONNX на серверах, настольных компьютерах, телефонах и в браузерах. При загрузке модели он оптимизирует граф, например сворачивает константы и объединяет свёртку со следующей за ней пакетной нормализацией, а затем передаёт каждую часть графа провайдеру выполнения, соответствующему имеющемуся оборудованию: CUDA или TensorRT на GPU NVIDIA, OpenVINO на оборудовании Intel, DirectML на GPU под Windows, Core ML на устройствах Apple, QNN на NPU Qualcomm и WebGPU в браузерах. Windows ML, локальный фреймворк инференса от Microsoft, работает на ONNX Runtime; другие движки, например TensorRT и OpenVINO, импортируют файлы ONNX и компилируют их в собственные форматы.
Ultralytics YOLO26 экспортирует модель в ONNX с помощью model.export(format="onnx"), а экспорт Ultralytics в TensorRT собирает движок на основе того же файла ONNX. Экспортированный файл запускается в ONNX Runtime без PyTorch:
import onnxruntime as ort
from ultralytics import YOLO
# Экспортировать YOLO26n в ONNX с символическими размерами batch, height и width
model = YOLO("yolo26n.pt")
onnx_path = model.export(format="onnx", dynamic=True)
# Загрузить граф в ONNX Runtime, которому не нужны ни PyTorch, ни Ultralytics
session = ort.InferenceSession(onnx_path, providers=["CPUExecutionProvider"])
for tensor in session.get_inputs() + session.get_outputs():
print(tensor.name, tensor.shape)Выводятся входные данные графа — images с символическими размерами batch, height и width — и необработанный выход с предсказаниями — output0. Это сигнатура, которую использует любая среда выполнения ONNX, чтобы передать данные модели и получить результаты.
ONNX и связанные форматы и инструменты#
- ONNX Runtime: движок инференса, выполняющий файлы ONNX. Это отдельный проект под руководством Microsoft, который часто сокращённо называют «ONNX».
- TensorRT: компилятор NVIDIA, который преобразует файл ONNX в движок, оптимизированный для определённого типа GPU и версии TensorRT. Поэтому команды хранят файл ONNX как переносимый исходник и заново собирают движки для каждой целевой платформы.
- Форматы PyTorch: контрольные точки
.ptи файлы safetensors хранят веса для кода, который заново собирает модель, а TorchScript иtorch.exportсохраняют графы для собственных сред выполнения PyTorch. - Другие форматы развёртывания: OpenVINO IR, файлы LiteRT
.tflite, пакеты Core ML и файлы GGUF для квантованных LLM — каждый из этих форматов предназначен для конкретной среды выполнения. Инструмент coremltools от Apple напрямую преобразует модели PyTorch и в версии 6 перестал принимать ONNX в качестве входных данных.
Примеры применения в реальных условиях#
- Кроссплатформенные приложения: один файл ONNX подходит для серверов Linux, приложений Windows через Windows ML, а также приложений Android и iOS через ONNX Runtime Mobile.
- Инференс в браузере: ONNX Runtime Web запускает модели на устройстве пользователя с помощью WebGPU или WebAssembly, поэтому кадры с камеры для таких функций, как оценка позы, не покидают браузер.
- Периферийные ускорители: комплекты инструментов для NPU от таких производителей, как Hailo, Qualcomm и Rockchip, принимают модели ONNX и компилируют их, часто с квантованием до INT8, для своих чипов.
- Классические модели в продакшене: деревья градиентного бустинга и конвейеры scikit-learn, преобразованные в ONNX, запускаются в сервисах на C#, Java и C++ через ONNX Runtime, без интерпретатора Python в контуре обслуживания.










