ONNX Runtime Web (ORT Web) предоставляет возможность
запускать модели машинного обучения непосредственно в браузере или в
Node.js с использованием стандарта ONNX. Центральным элементом работы с
ORT Web является класс InferenceSession, который управляет
загрузкой модели, настройкой среды выполнения и выполнением
инференса.
Создание сессии начинается с импорта библиотеки и инициализации
объекта InferenceSession. Основной метод —
InferenceSession.create(modelPath, options).
import * as ort from 'onnxruntime-web';
const session = await ort.InferenceSession.create('model.onnx', {
executionProviders: ['wasm'],
graphOptimizationLevel: 'all',
enableProfiling: true,
});
Ключевые моменты при создании сессии:
modelPath) Может быть
локальным URL, бинарным файлом или ArrayBuffer. В случае использования
браузера чаще применяется загрузка через fetch:const response = await fetch('model.onnx');
const modelArrayBuffer = await response.arrayBuffer();
const session = await ort.InferenceSession.create(modelArrayBuffer);
Опции создания (options)
executionProviders – массив строк, определяющий, на
каком движке будет выполняться модель. Возможные значения:
'wasm', 'webgl', 'cpu' (Node.js)
и 'cuda' (Node.js с GPU).graphOptimizationLevel – оптимизация графа вычислений:
'disabled', 'basic', 'extended',
'all'. Полезно для ускорения инференса и уменьшения
использования памяти.enableProfiling – включает сбор профайлинговых данных,
полезно для анализа производительности.loggingLevel – определяет уровень логирования:
'verbose', 'info', 'warning',
'error'.Сессия проходит несколько ключевых стадий: загрузка модели, подготовка к выполнению, выполнение инференса и очистка ресурсов.
Загрузка модели При вызове
InferenceSession.create() происходит загрузка и
десериализация модели. Для WebAssembly-модели ORT загружает бинарники
движка, подготавливает память и выполняет проверку совместимости
графа.
Подготовка к инференсу После создания сессии можно использовать методы:
session.inputNames – массив имен входов модели.session.outputNames – массив имен выходов модели.session.getInputType(name) – тип входного тензора.session.getOutputType(name) – тип выходного
тензора.Эти методы позволяют программно проверять модель перед подачей данных и избегать ошибок типа или формы тензора.
Выполнение инференса Метод
session.run(feeds, options) выполняет инференс.
feeds – объект вида
{inputName: ort.Tensor}.options – необязательный объект с настройками
выполнения для конкретного вызова, например
executionProviders.Пример выполнения инференса:
const inputTensor = new ort.Tensor('float32', inputData, [1, 3, 224, 224]);
const feeds = { input: inputTensor };
const results = await session.run(feeds);
console.log(results.output.data);
session = null и принудительную очистку
тензоров.Execution Providers Выбор провайдера критичен для скорости. WebGL обеспечивает параллельные вычисления на GPU в браузере, WASM – кроссплатформенный вариант на CPU.
Graph Optimization Опции 'extended'
и 'all' могут значительно ускорять инференс, но увеличивают
время загрузки модели.
Memory Allocation Для WebGL можно управлять
размером выделяемой памяти через webgl.contextAttributes,
что полезно для крупных моделей.
Профайлинг Включение
enableProfiling позволяет собирать детальную информацию о
времени выполнения отдельных узлов графа, что облегчает поиск узких мест
в производительности.
Все ключевые методы, включая InferenceSession.create() и
session.run(), являются асинхронными и возвращают
Promise.
Обработка ошибок при загрузке модели:
try {
const session = await ort.InferenceSession.create('model.onnx');
} catch (e) {
console.error('Ошибка создания сессии:', e);
}
Ошибки могут возникать из-за несовместимости модели, неправильной формы входных данных или отсутствия поддержки выбранного execution provider.
ORT Web позволяет работать с динамическими размерами входов и
выходов, что важно для NLP и CV моделей. Форма тензора
[1, 3, null, null] означает, что высота и ширина могут
варьироваться. Перед инференсом необходимо обеспечить правильное
выделение памяти под тензоры соответствующей формы.
ort.Tensor.