Перейти к содержимому
НейроКуб
Открытый материал · 3 мин
Вера Скептик

ONNX не загружается: почему уменьшить opset бывает недостаточно

IR и opset задают разные требования к модели. Как снять её паспорт, выбрать исправление и проверить результат, не маскируя несовместимость ручной заменой номера.

Ошибка Unsupported model IR version соблазняет уменьшить одно число в файле и попробовать снова. Такой ремонт может скрыть несовместимость: версия формата ONNX и версия набора операций — разные ограничения. Сначала нужно выяснить, какое из них нарушено.

Два номера вместо одного

По правилам версионирования ONNX, IR описывает представление графа и его формат, а opset — договор о смысле операций. Отдельно существует пользовательская версия самой модели. Эти номера развиваются независимо; меньший opset не означает автоматически более старый IR.

Допустим, после обновления экспортёра ваш сервис перестал загружать модель. В таблице совместимости ONNX Runtime есть отдельные столбцы для IR и opset. Сопоставлять нужно именно установленный runtime и полученный файл. Не считайте последнюю видимую строку таблицы доказательством того, какая версия библиотеки сейчас самая новая.

Снимите паспорт проблемного файла

В окружении с пакетами onnx и onnxruntime следующий фрагмент печатает метаданные, не изменяя модель. Подставьте путь к своему локальному файлу:

import onnx
import onnxruntime as ort

m = onnx.load("model.onnx", load_external_data=False)
print("runtime:", ort.__version__)
print("IR:", m.ir_version)
print("opsets:", [(o.domain, o.version) for o in m.opset_import])

Сохраните также точную ошибку загрузки и версию экспортёра. Список opsets содержит домены: стандартные операции и собственные расширения нельзя сводить к одному максимальному числу. Если веса лежат отдельно, их наличие при реальном запуске тоже необходимо; чтение метаданных без внешних данных не проверяет комплектность модели.

Выберите исправление по причине

  • Если runtime старше требуемого IR, проверьте возможность обновить runtime вместе с его зависимостями либо повторно экспортировать модель в поддерживаемое представление.

  • Если проблема в opset, сначала изучите настройки экспорта. Конвертация допустима только там, где нужные преобразования поддержаны.

  • Если не найдено ядро операции или собственное расширение, проверьте поддержку операции и выбранного провайдера: одних номеров версий недостаточно.

onnx.version_converter.convert_version преобразует opset и может завершиться ошибкой при неподдерживаемой конверсии. Это не универсальный конвертер IR. Ручная замена ir_version или opset_import меняет объявление, но не доказывает, что внутренние структуры и смысл операций стали совместимыми.

После исправления выполните onnx.checker.check_model, затем загрузите модель целевым runtime и сравните выходы с исходным вариантом на сохранённых контрольных входах. Заранее выберите допустимое расхождение под свою задачу. Checker проверяет согласованность модели; он не подтверждает точность предсказаний или наличие всех нужных ядер в вашем окружении.

Успех — это воспроизводимый запуск с проверенными выходами. Зафиксируйте версии экспортёра и runtime рядом с проверенным артефактом. Тогда следующий экспорт можно сравнить с известной рабочей связкой, а не лечить очередную ошибку изменением цифры.

Комментарии

Пока нет комментариев. Начните обсуждение.