ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели ONNX в браузере, используя WebAssembly (WASM) или WebGL для вычислений. Для начала работы библиотеку можно подключить через npm:
npm install onnxruntime-web
В ES-модулях импорт осуществляется следующим образом:
import * as ort from 'onnxruntime-web';
Для сценариев с классическим <script> можно
использовать CDN:
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>
Библиотека поставляется в нескольких вариантах, включая версии с поддержкой WebAssembly SIMD и WebGL. Выбор зависит от требований к производительности и поддержке браузеров.
Основной объект для работы — InferenceSession. Его
создание включает указание пути к ONNX модели и выбор бэкенда:
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'] // или 'webgl'
});
Ключевые моменты:
executionProviders позволяет выбирать движок
вычислений. Для браузеров чаще всего используются wasm или
webgl.Пример асинхронной подготовки с загрузкой WASM:
await ort.env.wasm.wasmPaths.set('https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/wasm/');
Модели ONNX ожидают данные в формате ort.Tensor. Для
числовых входов используется тип float32:
const inputTensor = new ort.Tensor('float32', new Float32Array([1.0, 2.0, 3.0]), [3]);
Важные моменты:
dims) обязательно указывается,
иначе инференс завершится ошибкой.float32, int32,
bool, string.Инференс выполняется методом run, который принимает
объект с входными тензорами:
const feeds = { input: inputTensor };
const results = await session.run(feeds);
const outputTensor = results.output;
Особенности:
run возвращает объект, где ключи соответствуют
именам выходов модели.await, так
как WebAssembly выполняется в отдельном потоке.При бандлинге ONNX Runtime Web возникают специфические нюансы:
ort.wasm — отдельный бинарный файл, который нужно
правильно подключать. Rollup и esbuild не включают его в основной JS
бандл автоматически.file или asset
плагин, чтобы WASM копировался в dist и путь к нему можно
было указать через wasmPaths.set.Пример конфигурации esbuild:
import wasm from 'esbuild-plugin-wasm';
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outdir: 'dist',
plugins: [wasm()],
});
Для Rollup используется плагин rollup-plugin-copy или
rollup-plugin-url, чтобы WASM-файл оказался в конечной
сборке.
Для оптимизации размера бандла рекомендуется загружать WASM динамически:
const ortModule = await import('onnxruntime-web');
await ortModule.env.wasm.wasmPaths.set('/dist/ort-wasm.wasm');
Это позволяет:
InferenceSession и Tensor.onnxruntime-web частично:import { InferenceSession, Tensor } from 'onnxruntime-web';
session.sessionOptions.executionProviders.performance.now()).const t0 = performance.now();
await session.run(feeds);
const t1 = performance.now();
console.log(`Inference time: ${t1 - t0} ms`);
run.onnx-simplifier) перед использованием в
браузере.import() вместо включения всего в один
бандл.