Параллельное выполнение: inter- и intra-op parallelism

ONNX Runtime Web предоставляет механизмы для эффективного выполнения нейронных сетей в браузере и Node.js, включая поддержку параллельного выполнения на уровне операций и потоков. Понимание inter- и intra-op parallelism является ключевым для оптимизации производительности моделей.


Intra-op Parallelism

Intra-op parallelism отвечает за параллельное выполнение вычислений внутри одной операции (op), например, матричных умножений, свёрток или редукций. Этот уровень параллелизма особенно полезен для операций, которые обрабатывают большие массивы данных и могут быть разделены на независимые подзадачи.

Основные аспекты:

  • Разбиение данных: Большие тензоры делятся на блоки, которые вычисляются параллельно на доступных потоках.
  • Использование Web Workers и SIMD: В веб-версии ONNX Runtime может применяться многопоточность через Web Workers, а также оптимизация с помощью SIMD-инструкций (если поддерживается браузером).
  • Контроль числа потоков: Через параметры intraOpNumThreads задаётся количество потоков для выполнения одной операции. Например, при установке intraOpNumThreads: 4 операция будет использовать до четырёх параллельных потоков.

Пример конфигурации с intra-op parallelism:

const session = await ort.InferenceSession.create(modelUrl, {
  executionProviders: ['wasm'],
  intraOpNumThreads: 4
});

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


Inter-op Parallelism

Inter-op parallelism организует параллельное выполнение разных операций модели. Если модель содержит несколько независимых или частично независимых узлов графа, их вычисления могут выполняться одновременно.

Особенности inter-op parallelism:

  • Параллелизм на уровне графа: Разные операции (например, две независимые свёртки) запускаются одновременно на разных потоках.
  • Управление через параметр interOpNumThreads: Позволяет задать количество потоков, используемых для одновременного выполнения независимых операций.
  • Эффективность зависит от структуры модели: В моделях с линейным графом зависимостей эффект будет минимальным, в глубоко разветвлённых — значительным.

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

const session = await ort.InferenceSession.create(modelUrl, {
  executionProviders: ['wasm'],
  interOpNumThreads: 2
});

Примечание: Повышение числа inter-op потоков может улучшить общую производительность на многоядерных устройствах, но одновременно увеличивает конкуренцию за ресурсы между потоками.


Взаимодействие inter- и intra-op parallelism

Эффективность выполнения модели определяется балансом между этими двумя типами параллелизма. Рекомендуется учитывать:

  1. Тип модели и размер операций:

    • Большие операции с большими тензорами выгодно распараллеливать через intra-op.
    • Модели с множеством независимых ветвей лучше оптимизировать через inter-op.
  2. Аппаратные ресурсы:

    • На устройствах с ограниченным числом ядер избыточный inter-op может привести к падению производительности.
    • На мощных процессорах комбинация нескольких inter-op и intra-op потоков может дать наилучший результат.
  3. Тестирование и профилирование:

    • ONNX Runtime Web предоставляет средства для профилирования выполнения, позволяя определить узкие места графа и оптимально настроить параметры потоков.

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

const session = await ort.InferenceSession.create(modelUrl, {
  executionProviders: ['wasm'],
  intraOpNumThreads: 4,
  interOpNumThreads: 2
});

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


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

  • Для небольших моделей с малым числом операций увеличение inter-op и intra-op потоков незначительно влияет на производительность и может быть избыточным.
  • Для глубоких моделей с большими свёртками и полносвязными слоями основное ускорение достигается настройкой intra-op parallelism.
  • В сложных графах с большим количеством ветвлений полезно увеличивать inter-op parallelism, чтобы задействовать все доступные ядра.
  • Необходимо учитывать нагрузку на систему и браузер: слишком большое количество потоков может привести к деградации производительности из-за контекста переключения потоков.

Понимание и правильная настройка inter- и intra-op parallelism позволяет оптимизировать работу ONNX Runtime Web как для браузеров, так и для Node.js, обеспечивая эффективное использование ресурсов и сокращение времени выполнения моделей.