ONNX

Материал из llmdocs — справочник разработчика
Портал: ML и MLOps
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 закрывает часть этих сценариев, но экосистема там моложе.

См. также

Источники

  1. ONNX — официальный сайт
  2. ONNX — Operators specification
  3. ONNX Runtime Documentation
  4. PyTorch — Exporting a model to ONNX
  5. sklearn-onnx Documentation
  6. ONNX Runtime — Execution Providers