InferenceSession: создание, опции, жизненный цикл

ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели машинного обучения непосредственно в браузере или в Node.js с использованием стандарта ONNX. Центральным элементом работы с ORT Web является класс InferenceSession, который управляет загрузкой модели, настройкой среды выполнения и выполнением инференса.


Создание 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

Сессия проходит несколько ключевых стадий: загрузка модели, подготовка к выполнению, выполнение инференса и очистка ресурсов.

  1. Загрузка модели При вызове InferenceSession.create() происходит загрузка и десериализация модели. Для WebAssembly-модели ORT загружает бинарники движка, подготавливает память и выполняет проверку совместимости графа.

  2. Подготовка к инференсу После создания сессии можно использовать методы:

    • session.inputNames – массив имен входов модели.
    • session.outputNames – массив имен выходов модели.
    • session.getInputType(name) – тип входного тензора.
    • session.getOutputType(name) – тип выходного тензора.

    Эти методы позволяют программно проверять модель перед подачей данных и избегать ошибок типа или формы тензора.

  3. Выполнение инференса Метод 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);
  1. Очистка ресурсов Сессия использует память под тензоры и движок. Для WebAssembly или WebGL ресурсы освобождаются автоматически при выходе объекта из области видимости, но для больших моделей или многократных запусков рекомендуется вручную сбрасывать сессию через 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] означает, что высота и ширина могут варьироваться. Перед инференсом необходимо обеспечить правильное выделение памяти под тензоры соответствующей формы.


Резюме ключевых возможностей InferenceSession

  • Создание сессии с загрузкой модели из URL или ArrayBuffer.
  • Настройка execution providers и уровня оптимизации графа.
  • Получение метаданных модели: входы, выходы, типы тензоров.
  • Асинхронное выполнение инференса с передачей данных в виде ort.Tensor.
  • Профайлинг и управление производительностью для WebAssembly и WebGL.
  • Поддержка динамических форм тензоров и масштабируемых моделей.