ONNX Runtime Web (ORT Web) предоставляет возможность выполнять инференс моделей формата ONNX в браузере с использованием JavaScript. При работе с моделями, имеющими несколько входов и выходов, требуется особое внимание к организации данных, типам и именам тензоров.
Для начала необходимо подключить библиотеку через 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 для удобного преобразования форматов и манипуляций с матрицами.
session.inputNames и session.outputNames для
гарантии соответствия.Float32Array
или Int32Array.Модели с несколькими выходами могут возвращать как однотипные тензоры, так и тензоры разного типа или размерности. Важно обрабатывать каждый выход отдельно, ориентируясь на спецификацию модели. Для сложных моделей, например, детекторов объектов или моделей сегментации, часто используется комбинация тензоров: один для координат, другой для вероятностей или масок.
Поскольку 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 };
}
ORT Web поддерживает несколько провайдеров исполнения. Для больших
моделей с несколькими входами и выходами рекомендуется использовать
webgl, что позволяет ускорить вычисления на GPU. В случае
ограничений браузера можно использовать wasm:
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['webgl', 'wasm']
});
Это гарантирует, что модель будет выполнена на наиболее подходящем устройстве.
При работе с несколькими входами и выходами важно проверять корректность данных на каждом шаге. Для этого можно использовать:
console.table() для визуализации небольших
тензоров;reduce, map) для
проверки диапазона значений;plotly.js.Такой подход позволяет убедиться, что данные правильно подаются на модель и корректно интерпретируются на выходе.