# ONNX

> Открытый формат представления моделей машинного обучения и среда ONNX Runtime; позволяет обучить модель в одном фреймворке и запускать её на любом железе и языке.

Источник: https://llmdocs.ru/wiki/onnx/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Полное название**: 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](https://llmdocs.ru/wiki/pytorch.md) или [scikit-learn](https://llmdocs.ru/wiki/scikit-learn.md), можно экспортировать в файл `.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]

```python
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](https://llmdocs.ru/wiki/hugging-face.md) — библиотека Optimum (`optimum-cli export onnx`).[5]

Не каждая модель экспортируется гладко: динамический Python-код, нестандартные операции и управляющие конструкции, зависящие от данных, могут не иметь аналогов в ONNX. После экспорта модель проверяют: `onnx.checker.check_model` и сравнение выходов с исходной моделью на тестовых данных.

## ONNX Runtime

```python
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](https://llmdocs.ru/wiki/gpu-cuda.md), OpenVINO для Intel, DirectML в Windows, CoreML на устройствах Apple, NNAPI в Android, WebAssembly и WebGPU в браузере.[6] Есть привязки к C++, C#, Java, JavaScript и Rust (`ort`). Поддерживается [квантизация](https://llmdocs.ru/wiki/quantization.md) в 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 — один из стандартных путей в [сервинге](https://llmdocs.ru/wiki/model-serving.md): его поддерживают NVIDIA Triton, KServe и облачные платформы.

## Ограничения

ONNX хорошо подходит для моделей компьютерного зрения, классических моделей, энкодеров вроде BERT и моделей эмбеддингов. Для больших языковых моделей с генерацией по токенам, KV-кэшем и пакетной обработкой запросов обычно используют специализированные движки — [vLLM](https://llmdocs.ru/wiki/vllm.md), TensorRT-LLM или форматы вроде [GGUF](https://llmdocs.ru/wiki/gguf.md) для llama.cpp. ONNX Runtime GenAI закрывает часть этих сценариев, но экосистема там моложе.

## См. также

- [PyTorch](https://llmdocs.ru/wiki/pytorch.md)
- [Сервинг моделей](https://llmdocs.ru/wiki/model-serving.md)
- [Квантизация моделей](https://llmdocs.ru/wiki/quantization.md)
- [GGUF](https://llmdocs.ru/wiki/gguf.md)

## Источники

1. [ONNX — официальный сайт](https://onnx.ai/)
2. [ONNX — Operators specification](https://onnx.ai/onnx/operators/)
3. [ONNX Runtime Documentation](https://onnxruntime.ai/docs/)
4. [PyTorch — Exporting a model to ONNX](https://pytorch.org/docs/stable/onnx.html)
5. [sklearn-onnx Documentation](https://onnx.ai/sklearn-onnx/)
6. [ONNX Runtime — Execution Providers](https://onnxruntime.ai/docs/execution-providers/)
