Настройка webgl-бэкенда: contextId, powerPreference

ONNX Runtime Web (ORT Web) предоставляет возможность выполнять инференс моделей ONNX прямо в браузере с использованием различных бэкендов. Наиболее производительный из них — WebGL, позволяющий задействовать графический процессор устройства. Настройка WebGL-бэкенда требует понимания параметров contextId и powerPreference, которые определяют создание контекста и выбор уровня производительности GPU.


WebGLContext и contextId

При инициализации бэкенда WebGL в ORT Web создаётся контекст для работы с GPU. Этот контекст представляет собой объект, через который библиотека отправляет команды на графический процессор. contextId служит уникальным идентификатором контекста, что позволяет:

  • Использовать несколько контекстов на одной странице.
  • Избежать конфликта с другими WebGL-приложениями.
  • Повторно инициализировать контекст без полного пересоздания движка.

Пример инициализации с указанием contextId:

import * as ort from 'onnxruntime-web';

const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['webgl'],
  webgl: {
    contextId: 'myWebGLContext'
  }
});

В этом примере создаётся отдельный контекст с идентификатором "myWebGLContext". Повторное создание с тем же contextId позволит библиотеке использовать уже существующий контекст, что экономит ресурсы и уменьшает время загрузки.


Управление энергопотреблением: powerPreference

Параметр powerPreference используется для указания браузеру, какой тип GPU предпочтителен:

  • “high-performance” — акцент на производительность. Использует дискретный GPU, если он доступен. Подходит для моделей с высокой вычислительной нагрузкой.
  • “low-power” — экономия энергии. Чаще используется встроенный GPU или интегрированная графика. Минимизирует потребление энергии, но снижает скорость инференса.
  • “default” — браузер сам выбирает оптимальный вариант в зависимости от устройства.

Пример настройки с powerPreference:

const session = await ort.InferenceSession.create('model.onnx', {
  executionProviders: ['webgl'],
  webgl: {
    contextId: 'myWebGLContext',
    powerPreference: 'high-performance'
  }
});

Использование high-performance рекомендуется для моделей глубокого обучения, где время отклика критично. Low-power может быть полезно на мобильных устройствах для экономии батареи.


Влияние настроек на производительность

  • Множественные контексты: создание нескольких контекстов с разными contextId позволяет параллельно запускать несколько моделей, но каждый контекст потребляет память GPU.
  • powerPreference и выбор GPU: браузеры на разных платформах интерпретируют этот параметр по-разному. Например, на десктопах с дискретной графикой high-performance часто приводит к значительному ускорению, тогда как на ноутбуках с интегрированным GPU разница может быть минимальной.
  • Совместимость с WebGL 2: ORT Web автоматически выбирает версию WebGL. Использование контекста с WebGL 2 обеспечивает доступ к расширенным функциям шейдеров и более быструю обработку тензоров.

Рекомендации по организации кода

  1. Явное задание contextId помогает избежать конфликтов с другими библиотеками, использующими WebGL.
  2. Использование powerPreference повышает предсказуемость производительности на разных устройствах.
  3. Повторное использование контекста уменьшает накладные расходы на создание объектов GPU и ускоряет повторные инференсы.
  4. Очистка контекста после завершения работы сессии важна для освобождения видеопамяти:
session.dispose();
  1. Проверка доступности WebGL перед инициализацией позволяет безопасно переключаться на CPU-режим при старых устройствах или браузерах с ограниченной поддержкой:
if (!ort.env.webgl.isSupported) {
  console.warn('WebGL не поддерживается, переключение на CPU');
}

Пример комплексной конфигурации

const options = {
  executionProviders: ['webgl'],
  webgl: {
    contextId: 'sharedContext',
    powerPreference: 'high-performance'
  }
};

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

// Использование сессии для инференса
const inputTensor = new ort.Tensor('float32', inputData, [1, 3, 224, 224]);
const feeds = { input: inputTensor };
const results = await session.run(feeds);

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


Настройка contextId и powerPreference является ключевым элементом оптимизации WebGL-бэкенда в ONNX Runtime Web, позволяя управлять ресурсами GPU, ускорять инференс и обеспечивать стабильную работу моделей на различных устройствах.