ONNX Runtime Web (ORT Web) предоставляет возможность выполнять инференс моделей ONNX прямо в браузере с использованием JavaScript или TypeScript. Для начала работы требуется установка пакета через npm или yarn:
npm install onnxruntime-web
После установки библиотека импортируется стандартным способом:
import * as ort from 'onnxruntime-web';
Создание сессии для модели происходит с использованием
InferenceSession.create, где указывается путь к файлу
модели и опции сессии:
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'], // Возможные значения: 'wasm', 'webgl', 'cpu'
});
Ключевые моменты:
wasm, затем при необходимости переходить на
webgl для ускорения вычислений на GPU.Данные для модели в ORT Web передаются в формате
ort.Tensor. Создание тензора требует указания типа данных,
формы и массива значений:
const input = new ort.Tensor('float32', new Float32Array([1, 2, 3, 4]), [2, 2]);
Запуск инференса осуществляется через метод session.run,
который принимает объект с именами входов:
const feeds = { input_name: input };
const results = await session.run(feeds);
Особенности работы:
{ output_name: ort.Tensor }.Vite требует правильной конфигурации для работы с WASM и WebGL
модулями, которые использует ONNX Runtime Web. В
vite.config.js следует включить поддержку ассетов и
настроить плагины для правильной обработки файлов
.wasm.
import { defineConfig } from 'vite';
export default defineConfig({
build: {
target: 'esnext',
assetsInclude: ['**/*.wasm']
}
});
Важно:
.wasm должны попадать в сборку как ассеты, иначе
при загрузке сессии возникнет ошибка.target: 'esnext' позволяет избежать
проблем с асинхронной загрузкой WASM в старых сборках.Для корректной работы WebAssembly и модулей WebGL необходимо включить заголовки Cross-Origin-Opener-Policy (COOP) и Cross-Origin-Embedder-Policy (COEP). Это обеспечивает безопасное взаимодействие с памятью и доступ к SharedArrayBuffer.
Пример конфигурации плагина для Vite:
import { defineConfig } from 'vite';
import vitePluginHeaders from 'vite-plugin-headers';
export default defineConfig({
plugins: [
vitePluginHeaders({
'/**': {
'Cross-Origin-Opener-Policy': 'same-origin',
'Cross-Origin-Embedder-Policy': 'require-corp'
}
})
]
});
Особенности:
'/**'),
чтобы SharedArrayBuffer был доступен в любом скрипте.same-origin изолирует контекст окна,
предотвращая утечки данных между сайтами.require-corp гарантирует, что встраиваемые
ресурсы приходят с заголовком
Cross-Origin-Resource-Policy: same-origin или
Cross-Origin-Resource-Policy: cross-origin.Модели ONNX могут быть крупными, поэтому для уменьшения времени загрузки и снижения потребления памяти рекомендуется:
const sessionPromise = ort.InferenceSession.create('model.onnx', { executionProviders: ['wasm'] });
// инференс выполняется позже
Кэширование сессий:
Lazy загрузка ресурсов:
Для моделей с большим количеством операций и слоев рекомендуется WebGL:
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['webgl']
});
Преимущества:
Ограничения:
Если модель имеет несколько входов:
const input1 = new ort.Tensor('float32', new Float32Array([1,2,3]), [3]);
const input2 = new ort.Tensor('float32', new Float32Array([4,5,6]), [3]);
const results = await session.run({
'input1_name': input1,
'input2_name': input2
});
Результаты можно использовать сразу по именам выходов:
const output1 = results['output1_name'].data;
const output2 = results['output2_name'].data;
Типичные ошибки:
.wasm в сборке Vite.Рекомендуется выводить ошибки в консоль и проверять структуру входных и выходных тензоров для отладки инференса.