ONNX — открытый формат представления нейросети: граф вычислений плюс веса, записанные так, чтобы модель можно было обучить в одном фреймворке и запустить в другом. Рядом с форматом существует ONNX Runtime — движок, который этот граф исполняет на процессоре, видеокарте, а на части платформ и на нейропроцессоре.
Проще всего понять его роль через вопрос «почему тогда языковые модели раздают не в ONNX».
#Где вы встречаете ONNX, даже не зная об этом
Формат доминирует там, где модель небольшая, задача узкая, а запускать надо на любом железе без плясок:
- модели-эмбеддеры для векторного поиска — разбор семейств в обзоре embed-моделей;
- распознавание речи и детекторы речевой активности;
- распознавание текста на изображениях;
- определение говорящего, классификаторы, детекторы объектов.
Общее у них одно: десятки-сотни мегабайт весов, стабильный граф, потребность работать на пользовательской машине без установки тяжёлого стека.
#ONNX и GGUF: разные ниши
| ONNX | GGUF | |
|---|---|---|
| Типичная модель | эмбеддер, ASR, OCR, классификатор | языковая модель-собеседник |
| Квантизация | целочисленная, простые схемы | десятки специализированных схем |
| Основной движок | ONNX Runtime | llama.cpp и всё, что на нём |
| Сильная сторона | переносимость между платформами | агрессивное сжатие крупных моделей |
| Раздача модели | набор файлов | один файл целиком |
Ключевая строка — квантизация. Экосистема GGUF выросла вокруг задачи «уместить очень большую модель в потребительскую память», и там накоплены схемы сжатия, которых в общем формате нет. Плюс однофайловая раздача: один .gguf содержит и веса, и токенизатор, и метаданные — подробности в разборе формата GGUF. Языковые модели в ONNX существуют, но новые модели сообщество публикует в GGUF, поэтому практический выбор обычно сделан за вас.
#Где путают
Заблуждение первое: ONNX — это движок. ONNX — формат, ONNX Runtime — движок. Формат сам по себе не выполняется и не имеет скорости. Утверждение «ONNX быстрее» бессмысленно без указания, на каком рантайме и на каком железе.
Заблуждение второе: конвертация в ONNX ускоряет модель. Иногда даёт выигрыш за счёт оптимизации графа, иногда наоборот — часть операций разворачивается в набор более медленных. Проверяется замером.
Заблуждение третье: ONNX безопаснее любых других весов. Формат основан на protobuf и при загрузке не выполняет произвольный код — в отличие от старых сериализаций на pickle. Это действительно преимущество, но такое же есть у современных форматов весов; сравнение — в справке про safetensors.
Заблуждение четвёртое: если модель в ONNX, она пойдёт на любом ускорителе. Переносимость обеспечивается наличием подходящего исполнителя. Если для вашего железа его нет, модель просто посчитается на процессоре.
#Частые вопросы
#Нужно ли мне вообще знать про ONNX?
Явно — редко. Косвенно вы им пользуетесь, если в вашем ассистенте есть распознавание речи, распознавание текста с экрана или векторный поиск: под капотом там с большой вероятностью ONNX Runtime.
#Можно ли конвертировать GGUF в ONNX и обратно?
Прямой конвертации между ними нет: это форматы с разной идеологией квантизации. Общий путь — от исходных весов, и обычно в одну сторону. Как это делается для GGUF, описано в разборе конвертации в GGUF и запуска в Ollama.
#ONNX Runtime использует видеокарту?
Использует, при наличии соответствующего исполнителя — для видеокарт разных вендоров они разные, и их надо ставить отдельно. По умолчанию сборка чаще всего считает на процессоре, и для маленьких моделей этого достаточно.
#Почему модель в ONNX состоит из нескольких файлов?
Крупные модели разбивают на файл графа и отдельные файлы весов из-за ограничения protobuf на размер сообщения. У эмбеддеров обычно всё лежит в одном файле. Что происходит при запуске такой модели — в справке про инференс.
Остальные термины — в глоссарии терминов ИИ.