Типичные ошибки при загрузке модели и их причины

Несовпадение версии ONNX модели и ONNX Runtime Web

ONNX Runtime Web (ORT Web) поддерживает определённые версии формата ONNX. Попытка загрузить модель, созданную в более новой версии ONNX, может вызвать ошибки типа:

  • onnxruntime.InferenceSession error: unsupported opset version
  • onnxruntime.InferenceSession error: operator not implemented.

Причины:

  • Модель была экспортирована из PyTorch или TensorFlow с использованием последней версии ONNX, несовместимой с текущей версией ORT Web.
  • Использование кастомных операторов без регистрации через customOp API ORT Web.

Решение:

  • Проверка версии модели с помощью утилиты onnx.checker.check_model().
  • Экспорт модели с указанным opset_version, совместимым с ORT Web.
  • При необходимости реализовать и зарегистрировать кастомные операторы.

Ошибки при работе с путями и загрузкой файла модели

Частая проблема — неправильная передача пути к файлу модели. Ошибки выглядят следующим образом:

  • Failed to fetch
  • NetworkError when attempting to fetch resource

Причины:

  • Попытка загрузить локальный файл через file:// в браузере, где требуется HTTP/HTTPS.
  • Отсутствие поддержки CORS на сервере, откуда загружается модель.
  • Неправильный синтаксис при использовании fetch() или ort.InferenceSession.create().

Решение:

  • Разместить модель на сервере с поддержкой HTTP/HTTPS.
  • Убедиться, что сервер возвращает заголовок Access-Control-Allow-Origin: *.
  • Использовать относительные или абсолютные пути, доступные браузеру.

Несоответствие формата данных входного тензора

ORT Web строго проверяет типы и размеры входных данных. Ошибки включают:

  • Input tensor has unexpected shape
  • Input tensor data type mismatch

Причины:

  • Передача JavaScript массивов вместо Float32Array, Int32Array и т. д.
  • Размерность тензора не совпадает с определённой в модели. Например, модель ожидает [1, 3, 224, 224], а передаётся [224, 224, 3].
  • Ошибки при нормализации данных или изменении формата изображений.

Решение:

  • Проверять описание модели с помощью session.inputNames и session.inputMetadata.
  • Преобразовывать данные в нужный тип с помощью TypedArray.
  • Переставлять оси, если вход имеет другой порядок (например, HWC → CHW для изображений).

Проблемы с асинхронной загрузкой и инициализацией сессии

ORT Web работает асинхронно, и ошибки появляются, если попытаться использовать сессию до её готовности:

  • Cannot run inference before session is initialized
  • Session not yet created

Причины:

  • Использование session.run() до завершения промиса ort.InferenceSession.create().
  • Попытка повторного запуска сессии до полной инициализации.

Решение:

  • Всегда дожидаться завершения промиса:
const session = await ort.InferenceSession.create('model.onnx');
const feeds = { input: inputTensor };
const results = await session.run(feeds);
  • Не выполнять операции сессии в глобальном контексте без асинхронной обёртки.

Ошибки при работе с WebAssembly и WebGPU бэкэндами

ORT Web поддерживает несколько бэкэндов, и каждая платформа имеет свои ограничения:

  • WebAssembly backend initialization failed
  • WebGPU backend is not supported in this browser

Причины:

  • Браузер не поддерживает WebGPU или WebAssembly SIMD.
  • Попытка загрузки модели, использующей операторы, не оптимизированные для выбранного бэкэнда.
  • Конфликт версий ORT Web с используемым бэкэндом.

Решение:

  • Проверять поддержку бэкэндов через ort.env.wasm.simd и ort.env.wasm.thread.
  • При необходимости использовать полифиллы или fallback на WebAssembly.
  • Обновлять браузер до последней версии для корректной работы WebGPU.

Ошибки при работе с кастомными опциями сессии

Некорректная настройка sessionOptions может приводить к сбоям:

  • Invalid session options
  • Failed to initialize session with given options

Причины:

  • Использование неподдерживаемых опций для Web-версии, например, опций GPU, доступных только для Node.js.
  • Некорректная передача объектов в опции, например, executionProviders или graphOptimizationLevel.

Решение:

  • Проверять документацию ORT Web для допустимых параметров.
  • Использовать простые опции, например:
const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['wasm'],
  graphOptimizationLevel: 'all'
});

Ошибки памяти и большие модели

При загрузке крупных моделей возможны ошибки:

  • Out of memory
  • Failed to allocate tensor

Причины:

  • Браузер ограничен по памяти.
  • Размер модели превышает допустимый объём для выбранного бэкэнда.
  • Одновременное создание нескольких сессий с большими моделями.

Решение:

  • Разделять модели на части или использовать более компактные варианты (quantized модели).
  • Освобождать сессии после использования: session = null; + gc() при возможности.
  • Тестировать модель на разных бэкэндах для выявления наиболее экономного использования памяти.

Эти категории ошибок покрывают большую часть проблем, возникающих при загрузке и инициализации моделей в ONNX Runtime Web. Структурированный анализ каждой ошибки и её причин позволяет существенно снизить вероятность сбоев и ускоряет процесс интеграции моделей в веб-приложения.