Модели с несколькими входами и несколькими выходами

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

Подключение ONNX Runtime Web

Для начала необходимо подключить библиотеку через npm или CDN:

import * as ort from 'onnxruntime-web';
// или через CDN
// <script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>

После подключения создается сессия для модели:

const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['wasm'], // можно использовать 'webgl' для ускорения на GPU
});

Формирование входных данных

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

console.log(session.inputNames); // ['input1', 'input2']

Входные данные создаются как тензоры:

const input1 = new ort.Tensor('float32', new Float32Array([1, 2, 3, 4]), [2, 2]);
const input2 = new ort.Tensor('float32', new Float32Array([5, 6, 7, 8]), [2, 2]);

const feeds = {
  input1: input1,
  input2: input2
};

Важно соблюдать тип данных и размерность тензоров, иначе ORT Web выбросит ошибку.

Запуск инференса

Для моделей с несколькими выходами используется стандартный метод run:

const results = await session.run(feeds);

results представляет собой объект, где ключи — это имена выходов модели:

console.log(Object.keys(results)); // ['output1', 'output2']
console.log(results.output1.data); // Float32Array с данными первого выхода
console.log(results.output2.data); // Float32Array с данными второго выхода

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

const results = await session.run(feeds, ['output2']);
console.log(results.output2.data);

Обработка тензоров

Тензоры, возвращаемые моделью, содержат три ключевых свойства:

  • data — одномерный массив с элементами тензора;
  • dims — массив размерностей тензора;
  • type — тип данных элементов (float32, int32 и т.д.).

Для дальнейшей работы с многомерными данными можно использовать библиотеки вроде ndarray или TensorFlow.js для удобного преобразования форматов и манипуляций с матрицами.

Оптимизация работы с несколькими входами

  1. Проверка имен входов и выходов: использовать session.inputNames и session.outputNames для гарантии соответствия.
  2. Согласованность размеров: входные тензоры должны иметь согласованные размерности, если модель ожидает их одинаковыми.
  3. Предобработка данных: часто требуется нормализация, изменение порядка осей или типизация данных в Float32Array или Int32Array.
  4. Минимизация копирования данных: по возможности создавать тензоры один раз и переиспользовать их при многократных вызовах модели.

Особенности нескольких выходов

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

Асинхронная обработка

Поскольку run возвращает промис, при работе с несколькими входами и выходами рекомендуется использовать await или цепочки промисов. Это позволяет выполнять инференс в фоновом режиме без блокировки основного потока:

async function inferMultipleInputs(feeds) {
  const results = await session.run(feeds);
  const output1 = results.output1.data;
  const output2 = results.output2.data;
  return { output1, output2 };
}

Совместимость с WebAssembly и WebGL

ORT Web поддерживает несколько провайдеров исполнения. Для больших моделей с несколькими входами и выходами рекомендуется использовать webgl, что позволяет ускорить вычисления на GPU. В случае ограничений браузера можно использовать wasm:

const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['webgl', 'wasm']
});

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

Отладка и визуализация данных

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

  • console.table() для визуализации небольших тензоров;
  • функции агрегации (reduce, map) для проверки диапазона значений;
  • графические библиотеки для визуализации больших массивов, например plotly.js.

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