Опции сессии: graphOptimizationLevel, executionMode

ONNX Runtime Web предоставляет возможность запускать модели машинного обучения непосредственно в браузере или Node.js, обеспечивая высокую производительность и гибкость. Управление сессией модели осуществляется через объект InferenceSession, который позволяет настраивать параметры оптимизации графа и режим исполнения. Рассмотрим ключевые опции graphOptimizationLevel и executionMode более подробно.


graphOptimizationLevel

Параметр graphOptimizationLevel отвечает за оптимизацию вычислительного графа модели до её запуска. В ONNX Runtime Web доступно несколько уровней оптимизации:

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

  • ORT_ENABLE_BASIC Включает базовые оптимизации, такие как удаление неиспользуемых узлов и упрощение констант. Позволяет ускорить выполнение без значительного изменения структуры графа.

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

  • ORT_ENABLE_ALL Активирует все доступные оптимизации, включая агрессивный фузинг и перестановку операций. Может существенно ускорить выполнение модели, но иногда приводит к несовместимости с нестандартными операторами.

Пример использования:

import { InferenceSession, GraphOptimizationLevel } from "onnxruntime-web";

const session = await InferenceSession.create("model.onnx", {
  graphOptimizationLevel: GraphOptimizationLevel.ORT_ENABLE_EXTENDED
});

Ключевой момент: выбор уровня оптимизации напрямую влияет на производительность и совместимость модели. Для браузерных приложений оптимизация до EXTENDED чаще всего обеспечивает лучший баланс скорости и стабильности.


executionMode

Параметр executionMode определяет стратегию исполнения модели в сессии ONNX Runtime Web:

  • ORT_SEQUENTIAL Узлы графа выполняются последовательно. Обеспечивает минимальное потребление памяти и упрощает отладку. Рекомендуется для моделей с небольшим числом операций или ограниченными ресурсами браузера.

  • ORT_PARALLEL Узлы графа выполняются параллельно, если это возможно. Использует многопоточность JavaScript (Web Workers в браузере или Worker Threads в Node.js), что позволяет ускорить выполнение сложных моделей. Однако может увеличить потребление памяти.

Пример использования:

import { InferenceSession, ExecutionMode } from "onnxruntime-web";

const session = await InferenceSession.create("model.onnx", {
  executionMode: ExecutionMode.ORT_PARALLEL
});

Особенности:

  • SEQUENTIAL обеспечивает предсказуемость и низкое потребление ресурсов.
  • PARALLEL повышает производительность на многоядерных системах, но может потребовать больше памяти и влиять на время старта сессии.

Взаимодействие graphOptimizationLevel и executionMode

Опции graphOptimizationLevel и executionMode работают совместно, но затрагивают разные аспекты исполнения модели:

  1. Оптимизация графа (graphOptimizationLevel) сокращает количество операций и упрощает их последовательность, что позволяет любому режиму исполнения работать быстрее.
  2. Режим исполнения (executionMode) управляет тем, как эти операции будут выполняться: последовательно или параллельно.

Пример комбинированного использования:

const session = await InferenceSession.create("model.onnx", {
  graphOptimizationLevel: GraphOptimizationLevel.ORT_ENABLE_ALL,
  executionMode: ExecutionMode.ORT_PARALLEL
});

Такой подход позволяет максимально ускорить выполнение модели на современных устройствах с несколькими ядрами CPU.


Практические рекомендации

  • Для отладки использовать ORT_DISABLE_ALL и ORT_SEQUENTIAL — так проще отслеживать значения тензоров.
  • Для продакшена в браузере предпочтительно ORT_ENABLE_EXTENDED + ORT_PARALLEL.
  • При ограниченных ресурсах использовать SEQUENTIAL режим, чтобы избежать пикового потребления памяти.
  • Проверять совместимость модели с агрессивными оптимизациями (ORT_ENABLE_ALL), особенно если используются нестандартные или пользовательские операторы.

Подводные камни

  • Агрессивная оптимизация может изменить поведение модели, особенно если она содержит кастомные операторы.
  • Параллельное исполнение в браузере зависит от поддержки Web Workers, что может быть ограничено в старых версиях браузеров.
  • Изменение уровней оптимизации и режима исполнения требует тестирования на реальных данных, чтобы убедиться в корректности предсказаний.

Эти две опции сессии — основные инструменты для управления производительностью ONNX Runtime Web, позволяющие балансировать между скоростью, потреблением памяти и совместимостью модели.