ONNX Runtime Web предоставляет механизмы для эффективного выполнения нейронных сетей в браузере и Node.js, включая поддержку параллельного выполнения на уровне операций и потоков. Понимание inter- и intra-op parallelism является ключевым для оптимизации производительности моделей.
Intra-op parallelism отвечает за параллельное выполнение вычислений внутри одной операции (op), например, матричных умножений, свёрток или редукций. Этот уровень параллелизма особенно полезен для операций, которые обрабатывают большие массивы данных и могут быть разделены на независимые подзадачи.
Основные аспекты:
intraOpNumThreads задаётся количество потоков для
выполнения одной операции. Например, при установке
intraOpNumThreads: 4 операция будет использовать до четырёх
параллельных потоков.Пример конфигурации с intra-op parallelism:
const session = await ort.InferenceSession.create(modelUrl, {
executionProviders: ['wasm'],
intraOpNumThreads: 4
});
Эффект: увеличение intraOpNumThreads
ускоряет тяжёлые вычисления на крупных тензорах, но для небольших
операций может привести к излишним накладным расходам на управление
потоками.
Inter-op parallelism организует параллельное выполнение разных операций модели. Если модель содержит несколько независимых или частично независимых узлов графа, их вычисления могут выполняться одновременно.
Особенности inter-op parallelism:
interOpNumThreads: Позволяет задать количество
потоков, используемых для одновременного выполнения независимых
операций.Пример использования:
const session = await ort.InferenceSession.create(modelUrl, {
executionProviders: ['wasm'],
interOpNumThreads: 2
});
Примечание: Повышение числа inter-op потоков может улучшить общую производительность на многоядерных устройствах, но одновременно увеличивает конкуренцию за ресурсы между потоками.
Эффективность выполнения модели определяется балансом между этими двумя типами параллелизма. Рекомендуется учитывать:
Тип модели и размер операций:
Аппаратные ресурсы:
Тестирование и профилирование:
Пример комбинированной настройки:
const session = await ort.InferenceSession.create(modelUrl, {
executionProviders: ['wasm'],
intraOpNumThreads: 4,
interOpNumThreads: 2
});
В этом случае каждая операция может использовать до четырёх потоков, а две независимые операции могут выполняться одновременно, используя два отдельных потока управления.
Понимание и правильная настройка inter- и intra-op parallelism позволяет оптимизировать работу ONNX Runtime Web как для браузеров, так и для Node.js, обеспечивая эффективное использование ресурсов и сокращение времени выполнения моделей.