ONNX
| Полное название | Open Neural Network Exchange |
|---|---|
| Создатели | Microsoft и Facebook (2017) |
| Управление | LF AI & Data Foundation (с 2019) |
| Формат | Protocol Buffers, расширение .onnx |
| Среда выполнения | ONNX Runtime (C++, Python, C#, Java, JS) |
| Экспорт из | PyTorch, TensorFlow, scikit-learn, XGBoost, LightGBM |
| Ускорители | CUDA, TensorRT, OpenVINO, DirectML, CoreML, WebGPU |
ONNX (Open Neural Network Exchange) — открытый формат описания моделей машинного обучения в виде вычислительного графа из стандартных операторов. Модель, обученную в PyTorch или scikit-learn, можно экспортировать в файл .onnx и затем выполнять без исходного фреймворка: на сервере, в мобильном приложении, в браузере или на специализированном ускорителе. Чаще всего модели запускают через ONNX Runtime — высокопроизводительную среду выполнения от Microsoft.
История
Формат представили Microsoft и Facebook в 2017 году, чтобы разорвать привязку моделей к фреймворку, в котором их обучили. Вскоре к проекту присоединились AWS, NVIDIA, Intel, AMD и другие. В 2019 году ONNX перешёл под управление LF AI & Data Foundation.[1] ONNX Runtime открыт в 2018 году и используется в продуктах Microsoft — Office, Bing, Windows.
Устройство формата
Файл ONNX — сериализованная в Protocol Buffers структура, содержащая:[2]
- граф — узлы-операторы (
Conv,MatMul,Relu,Attention…) и связи между ними; - инициализаторы — веса модели;
- описание входов и выходов с типами и формами тензоров, включая динамические измерения (например, размер батча);
- opset — версию набора операторов; новые версии добавляют операторы и меняют их семантику.
Помимо нейросетевых операторов, есть домен ai.onnx.ml для классических моделей — деревьев решений, линейных моделей, предобработки. Модели больше 2 ГБ хранят веса во внешних файлах.
Экспорт
Из PyTorch:[4]
import torch
model.eval()
dummy = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model, dummy, "resnet.onnx",
input_names=["image"], output_names=["logits"],
dynamic_axes={"image": {0: "batch"}, "logits": {0: "batch"}},
opset_version=17,
)
Новый экспортёр torch.onnx.export(..., dynamo=True) строит граф через torch.export и лучше справляется с современными моделями. Для scikit-learn используется sklearn-onnx, для XGBoost и LightGBM — onnxmltools, для моделей Hugging Face — библиотека Optimum (optimum-cli export onnx).[5]
Не каждая модель экспортируется гладко: динамический Python-код, нестандартные операции и управляющие конструкции, зависящие от данных, могут не иметь аналогов в ONNX. После экспорта модель проверяют: onnx.checker.check_model и сравнение выходов с исходной моделью на тестовых данных.
ONNX Runtime
import numpy as np
import onnxruntime as ort
session = ort.InferenceSession("resnet.onnx",
providers=["CUDAExecutionProvider", "CPUExecutionProvider"])
logits = session.run(None, {"image": np.random.rand(1, 3, 224, 224).astype(np.float32)})[0]
ONNX Runtime оптимизирует граф — сливает операторы, удаляет лишние узлы, подбирает раскладку памяти — и выполняет его через execution providers: CUDA и TensorRT для NVIDIA, OpenVINO для Intel, DirectML в Windows, CoreML на устройствах Apple, NNAPI в Android, WebAssembly и WebGPU в браузере.[6] Есть привязки к C++, C#, Java, JavaScript и Rust (ort). Поддерживается квантизация в INT8 — статическая и динамическая — для ускорения на процессоре.
Зачем использовать
| Задача | Как помогает ONNX |
|---|---|
| Сервинг без Python | модель запускается из Java, C#, Go или Rust-сервиса |
| Ускорение на CPU | часто в 1,5–3 раза быстрее исходного фреймворка с оптимизациями и INT8 |
| Edge и мобильные | один файл для Android, iOS, Windows и встраиваемых систем |
| Браузер | ONNX Runtime Web выполняет модель на клиенте |
| Ускорители | TensorRT и OpenVINO принимают ONNX как входной формат |
| Классический ML | деревья и пайплайны scikit-learn без зависимости от Python |
ONNX — один из стандартных путей в сервинге: его поддерживают NVIDIA Triton, KServe и облачные платформы.
Ограничения
ONNX хорошо подходит для моделей компьютерного зрения, классических моделей, энкодеров вроде BERT и моделей эмбеддингов. Для больших языковых моделей с генерацией по токенам, KV-кэшем и пакетной обработкой запросов обычно используют специализированные движки — vLLM, TensorRT-LLM или форматы вроде GGUF для llama.cpp. ONNX Runtime GenAI закрывает часть этих сценариев, но экосистема там моложе.