Запуск инференса в основном потоке и его последствия

ONNX Runtime Web (ORT Web) предоставляет возможность выполнять инференс моделей машинного обучения непосредственно в браузере на JavaScript. Работа в основном потоке (main thread) браузера имеет принципиальные особенности, влияющие на производительность и отзывчивость интерфейса.

Основной объект для работы с ORT Web — InferenceSession. Он инкапсулирует модель ONNX и управляет процессом инференса. Создание сессии и выполнение предсказаний происходят синхронно, если не использовать специальные асинхронные методы. Важно понимать, что любые тяжёлые вычисления, выполняемые в основном потоке, блокируют обработку событий, рендеринг и взаимодействие пользователя с интерфейсом.

import * as ort from 'onnxruntime-web';

async function runInference() {
  const session = await ort.InferenceSession.create('model.onnx');
  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);
}

В приведённом примере загрузка модели и выполнение инференса происходят асинхронно, что позволяет избежать полной блокировки UI. Однако, если объём вычислений велик, основной поток всё равно может испытывать задержки, особенно при работе с большими тензорами.

Последствия выполнения инференса в основном потоке

  1. Блокировка интерфейса Все операции в основном потоке конкурируют с рендерингом страницы и обработкой событий пользователя. Длительные вычисления могут вызвать заметные задержки при скролле, кликах и анимациях.

  2. Рост времени отклика Даже при асинхронных вызовах await session.run(feeds) JavaScript остаётся однопоточным. Основные шаги внутри ORT Web, такие как вычисления на CPU или WebGL, всё равно выполняются в том же потоке, что увеличивает латентность отклика.

  3. Ограничения по ресурсам Модели, требующие большого объёма памяти, могут приводить к падению производительности, поскольку основной поток отвечает одновременно за DOM, анимации и выполнение вычислений. WebGL-ускорение помогает, но не полностью решает проблему.

  4. Проблемы масштабируемости Для веб-приложений с интенсивным инференсом одновременно для нескольких пользователей выполнение всех вычислений в основном потоке становится узким местом. В таких сценариях рекомендуется использование Web Workers или перенос части вычислений на сервер.

Методы оптимизации

  • Использование WebGL и WebAssembly (WASM) ORT Web поддерживает несколько бэкендов. WebGL позволяет ускорить операции на GPU, снижая нагрузку на CPU. WASM эффективен для однопоточных CPU-вычислений, но не исключает блокировку основного потока.

  • Разделение задач через Web Workers Перенос инференса в воркеры освобождает основной поток для рендеринга и обработки событий. Воркеры создают отдельный поток выполнения, в котором можно безопасно запускать InferenceSession.run.

// worker.js
importScripts('onnxruntime-web.js');

self.onmess age = async function(e) {
  const { modelUrl, inputData } = e.data;
  const session = await ort.InferenceSession.create(modelUrl);
  const inputTensor = new ort.Tensor('float32', inputData, [1, 3, 224, 224]);
  const results = await session.run({ input: inputTensor });
  postMessage(results.output.data);
};
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ modelUrl: 'model.onnx', inputData });
worker.onmess age = function(e) {
  console.log('Результат инференса:', e.data);
};
  • Минимизация размера модели и батчей Меньшие модели и меньшие батчи данных снижают нагрузку на основной поток. Практика включает использование квантованных моделей или сокращение числа входных элементов при инференсе в реальном времени.

  • Lazy loading моделей Модели загружаются только при необходимости, чтобы не блокировать основной поток во время начальной загрузки страницы.

Влияние на UX

При работе в основном потоке медленные модели создают ощущение «залипания» интерфейса. Даже при использовании асинхронного await пользователь может заметить задержки в ответах UI. Это особенно критично для интерактивных приложений: графические редакторы, игры с дополненной реальностью, чат-боты с распознаванием речи и изображений.

Рекомендации по архитектуре

  • Использовать отдельные Web Workers для тяжелых моделей.
  • Выбирать бэкенд ORT Web с учётом платформы: WebGL для браузеров с поддержкой GPU, WASM для CPU.
  • Ограничивать размеры тензоров и сложность модели для инференса в основном потоке.
  • Разделять загрузку и инференс: сначала подготовка и валидация модели, затем запуск вычислений.

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