Проверка модели: onnx.checker и shape inference

ONNX Runtime Web предоставляет мощный инструмент для запуска и оптимизации моделей машинного обучения в браузере. Важной частью работы с моделями является их валидация и проверка корректности структуры перед использованием. Две ключевые возможности, которые позволяют обеспечить надежность модели, — это onnx.checker и shape inference.


onnx.checker: проверка корректности модели

onnx.checker — это утилита для проверки модели ONNX на соответствие стандарту ONNX. Она гарантирует, что структура графа модели, типы данных и связи между узлами не содержат ошибок, способных привести к сбоям при исполнении.

Основные функции onnx.checker:

  1. Проверка схемы и типов данных: Каждый узел графа проверяется на соответствие требованиям схемы. Например, если оператор ожидает float32 на входе, а получает int64, checker выбросит ошибку.

  2. Проверка связей между узлами: Проверяется, что все входы и выходы корректно подключены, и нет разрывов или лишних ссылок.

  3. Выявление недостающих атрибутов: Некоторые операторы ONNX требуют обязательные атрибуты. Отсутствие их приведет к ошибке.

Пример использования:

import * as onnx from 'onnxruntime-web';

// Загрузка модели (массив байт или URL)
const modelBuffer = await fetch('model.onnx').then(res => res.arrayBuffer());

// Проверка модели
try {
  onnx.checker.checkModel(modelBuffer);
  console.log('Модель корректна');
} catch (err) {
  console.error('Ошибка проверки модели:', err);
}

При этом checkModel выполняется синхронно и позволяет выявить большинство структурных ошибок до запуска модели.


Shape inference: вывод форм тензоров

После проверки модели важно знать размеры тензоров на каждом этапе вычислений. Shape inference позволяет автоматически вывести форму выходов каждого узла, даже если модель была сохранена без полной информации о формах.

Преимущества shape inference:

  • Предотвращение ошибок на этапе исполнения, связанных с несовпадением размерностей.
  • Возможность динамически подбирать параметры входных данных.
  • Улучшение понимания структуры модели и оптимизация производительности.

Пример использования shape inference:

import * as onnx from 'onnxruntime-web';
import { InferenceSession, Tensor } from 'onnxruntime-web';
import { inferShapes } from 'onnxruntime-web/shapeInference';

// Загрузка модели
const modelBuffer = await fetch('model.onnx').then(res => res.arrayBuffer());

// Инференс форм
const inferredModel = inferShapes(modelBuffer);

console.log('Выводы узлов с формами:');
inferredModel.graph.node.forEach(node => {
  console.log(node.output.map(output => ({
    name: output,
    shape: inferredModel.graph.valueInfo.find(info => info.name === output)?.type.tensorType.shape
  })));
});

Ключевые моменты работы с shape inference:

  • Shape inference можно применять к уже проверенной модели (onnx.checker), что минимизирует риск ошибок.
  • Инструмент поддерживает как статические, так и частично динамические формы (например, batch_size может быть ?).
  • Вывод информации позволяет заранее определить, какие тензоры требуют предварительной трансформации или ресайза.

Взаимодействие checker и shape inference

Использование onnx.checker и shape inference в связке обеспечивает комплексную проверку:

  1. Сначала выполняется проверка структуры модели через checker.
  2. Затем проводится вывод форм всех узлов через shape inference.
  3. После этого можно безопасно создавать InferenceSession и подавать данные, не опасаясь ошибок несовпадения типов или форм.

Эта последовательность особенно важна при работе с веб-приложениями, где модель может быть загружена из сети и должна корректно работать на разных устройствах.


Рекомендации по применению

  • Проверку модели стоит выполнять при каждом изменении или обновлении ONNX-модели.
  • Shape inference полезен при построении сложных пайплайнов, где размеры тензоров могут меняться динамически.
  • Для больших моделей рекомендуется комбинировать проверку и вывод форм перед оптимизацией с помощью onnxruntime-web execution providers, чтобы избежать лишних ошибок исполнения.

Использование onnx.checker и shape inference делает работу с ONNX Runtime Web более предсказуемой, снижает вероятность runtime ошибок и упрощает отладку сложных моделей.