ONNX Runtime Web (ORT Web) представляет собой высокопроизводительную библиотеку для выполнения моделей ONNX непосредственно в браузере или в среде Node.js. Основным преимуществом является возможность интеграции моделей машинного обучения без необходимости серверной обработки, что снижает задержки и повышает отзывчивость приложений.
Библиотека обеспечивает работу с различными аппаратными бэкендами: WebAssembly (WASM), WebGPU и CPU, автоматически выбирая наиболее подходящий для текущей среды исполнения.
Многие модели машинного обучения требуют возможности работы с входами переменной размерности. Типичные сценарии включают обработку последовательностей текста, изображений различного разрешения или пакетов данных (batch) переменной длины. В ONNX для обозначения таких возможностей используются динамические оси.
Динамическая ось — это параметр, обозначенный в модели ONNX как переменный размер входного или выходного тензора. Вместо фиксированного числа элементов, оно может принимать любое положительное целое значение в пределах ограничений модели.
Пример: модель обработки текста может иметь входной тензор с формой
[batch_size, sequence_length], где batch_size
и sequence_length обозначены как динамические оси.
При загрузке модели через ORT Web необходимо правильно указать динамические оси для обеспечения корректной работы с переменной размерностью входных данных.
import * as ort from 'onnxruntime-web';
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'] // Возможны: ['wasm', 'webgpu', 'cpu']
});
Здесь создается сессия выполнения модели, а выбор провайдера влияет на производительность и совместимость с текущей платформой.
Входные данные должны соответствовать динамическим осям, определённым в модели:
const inputTensor = new ort.Tensor('float32', new Float32Array([/* данные */]), [batchSize, sequenceLength]);
float32 — тип данных тензора.Float32Array — одномерный массив данных, автоматически
преобразуемый в многомерный тензор.[batchSize, sequenceLength] — форма тензора, где
batchSize и sequenceLength могут изменяться в
зависимости от конкретного вызова.Важно, чтобы размерность массива данных точно соответствовала произведению размеров, указанных в форме тензора. Несоответствие приведет к ошибкам выполнения.
Некоторые модели могут принимать пакеты данных различной длины или последовательности различного размера без изменения кода. Для этого в ORT Web используется гибкая подготовка данных:
function createTensor(data, batch, seqLength) {
return new ort.Tensor('float32', new Float32Array(data), [batch, seqLength]);
}
Использование функций генерации тензоров позволяет легко адаптировать модель под входы разной длины, обеспечивая:
session.inputNames и
session.outputNames.Для безопасной работы рекомендуется проверять форму входного тензора перед запуском модели:
const expectedShape = session.inputMetadata['input_0'].dims;
if (inputTensor.dims.length !== expectedShape.length) {
throw new Error('Несоответствие размерностей входного тензора');
}
inputMetadata содержит информацию о каждой входной
переменной, включая фиксированные и динамические оси, что позволяет
гибко адаптировать данные перед вызовом инференса.
const feeds = { 'input_0': inputTensor };
const results = await session.run(feeds);
console.log(results['output_0'].data);
Тензоры с динамическими осевыми размерами автоматически обрабатываются ORT Web, позволяя получать корректный выход без ручного изменения модели.
Использование динамических осей делает приложения гибкими и масштабируемыми, позволяя работать с разнообразными наборами данных без необходимости предварительной нормализации всех входов к одной фиксированной форме.