Есть ли способ объединить полностью подключенный слой (gemm) и активационный слой (relu/sigmoid) на gpu в dnn?

Обычно один слой в dnn состоит из MatMul, BiasAdd, Relu, cuBlas предоставляет Gemm для MatMul, и мы можем сделать BiasAdd и Relu в другом ядре для GPU. Это два вызова GPU lanuch, есть ли способ объединить их всех и сделать их одним? Я заглянул в cuBlas, cudnn, но ничего не нашел. Я думаю, что это не сложно, потому что BiasAdd и Relu являются просто поэтапными операциями, а слияние делает его более эффективным.

Вот фон:

Я работаю над сервисом онлайн-прогнозирования, который представляет собой ансамбль с несколькими моделями. Профилируя мою программу, я обнаружил, что и мой процессор, и графический процессор используются не полностью, но запрашивают блоки при вызове функций, связанных с графическим процессором (например, lanuchKernel). Кажется , в libcuda есть большой замок. Я использую тензор потока, с поддержкой XLA, поэтому я использую nvprof и тензор потока HLO для визуализации вызова GPU, и есть только точечные и слитые (то есть смещения и смещения) операции. Хотя слияние ядра завершено, вызовов lanuchKernel по-прежнему слишком много, а загрузка графического процессора составляет всего 60%. Я попробовал многократный контекст cuda в одном процессе, улучшение тривиально.

Кстати, я использую один графический процессор, Tesla P100.

0 ответов

Другие вопросы по тегам