Запуск инференса: run() и его опции

Метод run() является центральным инструментом для выполнения инференса моделей в ONNX Runtime Web. Он обеспечивает запуск предобученных моделей на входных данных с поддержкой как синхронного, так и асинхронного подхода, позволяя работать с различными типами данных: тензорами, изображениями и массивами чисел.

Синтаксис и базовое использование

Базовый вызов метода имеет вид:

const results = await session.run(feeds, options);
  • session — объект сессии ONNX Runtime Web (InferenceSession), который хранит загруженную модель.
  • feeds — объект, где ключи соответствуют именам входных узлов модели, а значения — данные, которые нужно подать на вход модели. Значения могут быть TypedArray, Tensor, ImageData или обычные массивы.
  • options — объект с дополнительными настройками выполнения инференса.

Метод возвращает объект, где ключи — имена выходных узлов модели, а значения — объекты типа Tensor, содержащие результат инференса.

Формат объекта feeds

Объект feeds должен соответствовать структуре входных узлов модели. Например:

const feeds = {
    input1: new ort.Tensor('float32', inputData, [1, 3, 224, 224]),
    input2: new Float32Array([0.1, 0.2, 0.3])
};
  • Первый аргумент конструктора Tensor — тип данных (float32, int32, bool и т.д.).
  • Второй — одномерный массив с элементами.
  • Третий — массив, описывающий форму тензора.

При несоответствии формы или типа данных модель выбросит ошибку, поэтому важно точно соответствовать спецификации модели.

Параметры options

run() поддерживает объект options с несколькими ключевыми параметрами:

  1. executionProviders — массив провайдеров вычислений, которые будут использоваться для инференса. Например:
options: {
    executionProviders: ['wasm', 'webgl']
}
  • 'wasm' — WebAssembly, обеспечивает кроссплатформенный запуск.
  • 'webgl' — использование GPU через WebGL, повышает производительность для больших моделей.
  • 'webgpu' — экспериментальный вариант для современных браузеров с поддержкой WebGPU.
  1. logSeverityLevel — уровень логирования, принимает числовые значения от 0 (ошибки) до 4 (отладочная информация).

  2. disableMemPattern и enableCpuMemArena — управление внутренними оптимизациями памяти. Полезны при работе с ограниченной памятью на устройстве.

Асинхронность и производительность

run() является асинхронным методом. Это критически важно для браузерного контекста, чтобы не блокировать основной поток. Для оптимизации производительности следует учитывать:

  • Использование webgl или webgpu при работе с большими моделями.
  • Подготовка всех входных данных заранее в виде TypedArray.
  • Минимизация пересоздания объектов Tensor внутри циклов инференса.

Пример асинхронного вызова:

async function infer(session, inputData) {
    const feeds = { input: new ort.Tensor('float32', inputData, [1, 3, 224, 224]) };
    const results = await session.run(feeds, { executionProviders: ['webgl'] });
    return results.output;
}

Работа с несколькими выходами

Модели могут иметь несколько выходных узлов. run() возвращает объект с именами всех выходов:

const results = await session.run(feeds);
const output1 = results.output1;
const output2 = results.output2;

Каждое значение — объект Tensor, с методами .data (доступ к массиву чисел) и .dims (форма тензора). Это позволяет обрабатывать сложные модели с несколькими параллельными потоками данных.

Ошибки и их обработка

Чаще всего ошибки при вызове run() связаны с:

  • Несоответствием формы или типа данных входного тензора.
  • Попыткой использовать неподдерживаемый провайдер выполнения.
  • Превышением лимитов памяти при больших моделях.

Рекомендуется оборачивать вызов run() в блок try/catch:

try {
    const results = await session.run(feeds);
} catch (err) {
    console.error('Ошибка инференса:', err);
}

Это позволяет корректно обрабатывать исключения и не блокировать выполнение других скриптов.

Ключевые рекомендации по оптимизации

  • Минимизировать создание новых тензоров при многократном инференсе. Можно переиспользовать буферы.
  • Выбирать провайдер, соответствующий устройству пользователя.
  • Использовать батчи входных данных для уменьшения количества вызовов run() при обработке потоков данных.
  • Проверять соответствие типов и форм входов документации модели.

Метод run() в ONNX Runtime Web обеспечивает гибкий и высокопроизводительный запуск моделей в браузере. Глубокое понимание параметров и структуры входных данных позволяет эффективно интегрировать предобученные нейросети в веб-приложения и обеспечивать стабильный и быстрый инференс.