ONNX Runtime Web (ORT Web) предоставляет высокопроизводительное выполнение моделей машинного обучения прямо в браузере. Одним из ключевых компонентов является WebAssembly (WASM) бэкенд, обеспечивающий совместимость с различными платформами и высокую скорость работы без необходимости установки дополнительного программного обеспечения.
WASM бэкенд реализует вычисления путем компиляции ядра ONNX Runtime в WebAssembly. Это позволяет выполнять операции линейной алгебры, активации и другие операции нейросетей в среде JavaScript с почти нативной скоростью.
Основные этапы работы:
Загрузка и инициализация модели
import * as ort from 'onnxruntime-web';
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm']
});
В этот момент модель загружается в память, а WebAssembly модуль инициализируется.
Подготовка входных данных Входные данные
преобразуются в TypedArray (например,
Float32Array) для совместимости с WASM:
const inputTensor = new ort.Tensor('float32', new Float32Array(data), [1, 3, 224, 224]);Выполнение инференса
const output = await session.run({ input: inputTensor });
WebAssembly обеспечивает выполнение всех операций внутри безопасной виртуальной машины, минимизируя накладные расходы JavaScript.
SIMD (Single Instruction, Multiple Data) позволяет выполнять одну инструкцию сразу на нескольких элементах массива. В ONNX Runtime Web это особенно важно для операций свертки, матричных умножений и активаций. Использование SIMD ускоряет вычисления за счет параллельной обработки данных внутри одного потока.
Примеры операций с SIMD:
В браузерах, поддерживающих WebAssembly SIMD, включение этой оптимизации значительно повышает производительность. Для активации достаточно убедиться, что WASM модуль собирается с флагом SIMD, а ORT Web автоматически использует его при доступности.
Для больших моделей и сложных вычислений критически важна многопоточность. WASM бэкенд ONNX Runtime Web использует Web Workers для распределения задач между потоками.
Принцип работы:
SharedArrayBuffer) позволяет потокам
обмениваться данными без копирования, что снижает задержки.Пример инициализации с многопоточностью:
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'],
intraOpNumThreads: 4
});
Здесь intraOpNumThreads указывает количество потоков для
параллельного выполнения операций внутри модели. Для максимально
эффективного использования важно подбирать это значение в зависимости от
количества доступных ядер процессора.
Комбинация SIMD и многопоточности обеспечивает:
Float32Array или Int32Array
для входных тензоров — это оптимально для WASM.intraOpNumThreads с учетом
возможностей устройства и типа модели.WebAssembly бэкенд ONNX Runtime Web сочетает переносимость, высокую производительность и возможность масштабирования на многопроцессорных устройствах, делая браузерное выполнение моделей максимально эффективным.