ONNX Runtime Web (ORT Web) представляет собой JavaScript-библиотеку для выполнения моделей ONNX непосредственно в браузере или в Node.js. Основное преимущество заключается в возможности использовать аппаратное ускорение через WebAssembly (WASM) или WebGL, что обеспечивает высокую производительность при инференсе нейросетевых моделей.
Для подключения библиотеки в проект можно использовать пакет из npm:
npm install onnxruntime-web
Импорт библиотеки в модуль JavaScript осуществляется через:
import * as ort from 'onnxruntime-web';
Сессия модели в ONNX Runtime Web создается с использованием объекта
InferenceSession. Основные параметры инициализации включают
путь к файлу модели и предпочтительный бэкэнд (webgl или
wasm):
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['webgl'] // или 'wasm'
});
Важно: webgl обеспечивает ускорение на
GPU, но требует поддержки браузером WebGL 2.0. wasm
работает на всех современных браузерах и подходит для CPU-инференса.
Для передачи данных в модель используется объект
ort.Tensor. ONNX Runtime Web поддерживает типы
float32, int32, bool и другие.
Пример создания тензора:
const input = new ort.Tensor('float32', new Float32Array([1.0, 2.0, 3.0, 4.0]), [2, 2]);
float32,
int32 и др.).Инференс выполняется через метод run объекта сессии.
Входные данные передаются в виде словаря, где ключи соответствуют именам
входных тензоров модели:
const feeds = { input_name: input };
const results = await session.run(feeds);
Выходные данные доступны по ключам, соответствующим именам выходных тензоров модели:
const outputTensor = results['output_name'];
console.log(outputTensor.data);
Для ускорения вычислений и использования многопоточности ONNX Runtime
Web применяет SharedArrayBuffer. Для его работы необходимо,
чтобы сервер возвращал правильные HTTP-заголовки.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Эти заголовки позволяют браузеру безопасно использовать
SharedArrayBuffer для многопоточных
WebAssembly-операций.
В конфигурации nginx необходимо убедиться, что заголовки добавляются для всех нужных ресурсов, включая JavaScript-файлы и модельные файлы. Пример конфигурации:
server {
listen 80;
server_name example.com;
root /var/www/html;
location / {
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
try_files $uri $uri/ =404;
}
location /models/ {
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
}
location /static/ {
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
}
}
Особенности настройки:
try_files гарантирует корректную отдачу
файлов без перенаправлений, которые могут сбросить заголовки.SharedArrayBuffer
многопоточный WASM значительно снижает время выполнения больших
моделей.ONNX Runtime Web может быть использован совместно с React, Vue или другими фреймворками. Основная схема работы:
InferenceSession.create.session.run с подготовленными входными
данными.Важным моментом является обеспечение, чтобы заголовки COOP и COEP
были правильно настроены, иначе SharedArrayBuffer будет
недоступен, что приведет к падению многопоточного режима и замедлению
работы модели.
<canvas>, преобразование в массив
Float32Array, создание тензора и передача в модель для
классификации.SharedArrayBuffer.Эти методы позволяют максимально эффективно использовать возможности ONNX Runtime Web при работе с нейросетевыми моделями в браузере.