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 рядом с проверенным артефактом. Тогда следующий экспорт можно сравнить с известной рабочей связкой, а не лечить очередную ошибку изменением цифры.
Комментарии
Войдите, чтобы оставить комментарий
Пока нет комментариев. Начните обсуждение.