Работа с моделями в формате ONNX-ML

ONNX Runtime Web (ORT Web) предоставляет возможность запускать модели ONNX непосредственно в браузере с использованием JavaScript. Для начала работы достаточно подключить пакет через npm или использовать CDN.

Установка через npm:

npm install onnxruntime-web

Подключение через ES6 модули:

import * as ort from 'onnxruntime-web';

Использование через CDN:

<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web/dist/ort.min.js"></script>

После подключения доступен объект ort, предоставляющий все необходимые методы для загрузки и выполнения моделей.


Инициализация сессии и выбор бэкенда

ORT Web поддерживает несколько вычислительных бэкендов: WebAssembly (WASM) и WebGL. Выбор бэкенда влияет на производительность и совместимость.

const session = await ort.InferenceSession.create('model.onnx', {
    executionProviders: ['wasm'], // или ['webgl']
});

Особенности бэкендов:

  • WASM: универсальный вариант, работает на всех современных браузерах, но скорость ниже, чем WebGL.
  • WebGL: использует графический процессор, обеспечивает ускорение для больших моделей, но зависит от поддержки WebGL в браузере.

Для оптимизации времени загрузки можно заранее инициализировать WASM-модули:

await ort.env.wasm.init();

Загрузка и подготовка модели

ONNX Runtime Web загружает модель в формате ONNX напрямую из URL или локального файла. Формат ONNX-ML поддерживает структуры данных для классических алгоритмов машинного обучения.

const session = await ort.InferenceSession.create('model.onnx');

После создания сессии можно получить информацию о входах и выходах модели:

console.log(session.inputNames);  // массив имен входных тензоров
console.log(session.outputNames); // массив имен выходных тензоров

Для моделей ONNX-ML часто используются одномерные массивы чисел (векторные представления признаков), а не многомерные тензоры изображений.


Подготовка входных данных

Входные данные должны соответствовать типам, определённым в модели. ONNX-ML чаще всего использует тип float32 или int64 для признаков. ORT Web работает с объектом вида:

const input = {
    input_name: new Float32Array([5.1, 3.5, 1.4, 0.2])
};

Где input_name — имя входного тензора, полученное через session.inputNames.

Для категориальных признаков необходимо преобразовать данные в числовой формат заранее, поскольку ONNX Runtime не выполняет автоматическое кодирование категорий.


Выполнение инференса

Инференс выполняется методом run(), который принимает объект с входными данными и возвращает объект с результатами.

const output = await session.run(input);
console.log(output.output_name.data); // результат модели

Особенности работы с ONNX-ML:

  • Результаты часто представляют собой одномерные массивы вероятностей или меток классов.
  • Если модель многовыходная, объект output содержит все выходные тензоры по именам.

Оптимизация производительности

Для работы с крупными моделями рекомендуется:

  1. Выбор правильного бэкенда. WebGL ускоряет матричные операции и многомерные вычисления.
  2. Повторное использование сессии. Инициализация сессии занимает время, поэтому повторный вызов session.run() с разными входными данными быстрее, чем создание новой сессии.
  3. Минимизация копирования данных. Преобразование JavaScript-массивов в Float32Array или Int32Array перед вызовом run() уменьшает накладные расходы.

Работа с несколькими входами и выходами

Модели ONNX-ML могут иметь несколько признаков на входе и несколько выходов. В таком случае входные данные формируются как объект с несколькими ключами:

const input = {
    feature1: new Float32Array([1.0]),
    feature2: new Float32Array([0.0])
};

Результаты также возвращаются в виде объекта с именованными массивами:

const output = await session.run(input);
console.log(output.label.data);
console.log(output.probabilities.data);

Применение в веб-приложениях

ORT Web интегрируется с фронтенд-фреймворками (React, Vue, Angular) без необходимости установки серверной инфраструктуры. Это позволяет выполнять инференс непосредственно в браузере, защищая данные пользователей и снижая задержку.

Пример интеграции с React:

import { useEffect, useState } from 'react';
import * as ort from 'onnxruntime-web';

export default function Predict({ features }) {
    const [prediction, setPrediction] = useState(null);

    useEffect(() => {
        async function runModel() {
            const session = await ort.InferenceSession.create('/model.onnx');
            const input = { input: new Float32Array(features) };
            const output = await session.run(input);
            setPrediction(output.output.data[0]);
        }
        runModel();
    }, [features]);

    return <div>Prediction: {prediction}</div>;
}

В этом примере модель загружается один раз, а затем повторно используется для новых данных, что повышает производительность приложения.


Особенности работы с форматами ONNX-ML

  • Поддержка алгоритмов: деревья решений, линейные модели, ансамбли.
  • Входные данные обычно одномерные массивы чисел, без сложной многомерной структуры.
  • Выходные данные: метки классов, вероятности, регрессионные значения.
  • Нет необходимости в нормализации признаков внутри ONNX Runtime; преобразование выполняется заранее.

Отладка и диагностика

Для диагностики ошибок загрузки и выполнения модели ORT Web предоставляет методы логирования:

ort.env.loggingLevel = 'verbose';

Ошибки могут возникать из-за:

  • Несоответствия типов входных данных.
  • Некорректной формы тензоров.
  • Использования неподдерживаемых операторов ONNX в выбранном бэкенде (особенно WebGL).

Выводы по организации работы

Эффективное использование ONNX Runtime Web требует:

  • Продуманного выбора бэкенда для конкретного браузера.
  • Корректного формирования входных данных.
  • Оптимизации повторного использования сессий.
  • Предварительной подготовки признаков и категориальных данных.

Такой подход позволяет создавать высокопроизводительные веб-приложения, использующие модели ONNX-ML без серверной нагрузки.