Является ли рабочее пространство свертки cudnn многоразовым?

#deep-learning #gpu #caffe #convolution #cudnn

Вопрос:

Мне нужно найти ссылку или описание рабочего пространства, предоставляемого для cudnnConvolutionForward , cudnnConvolutionBackwardData , cudnnConvolutionBackwardFilter семейства функций.

Могу ли я повторно использовать рабочую область для следующих вызовов/слоев, предполагая, что разные слои не выполняются параллельно на графическом процессоре?

Я изучаю реализацию caffe в cudnn_conv_layer.cpp и экземпляр слоя выделяет свое собственное и отдельное пространство для каждой из 3 функций. Что кажется расточительным, так как по логике я должен иметь возможность повторно использовать память для нескольких слоев/функций.

Однако я не могу найти ссылку, которая разрешает или запрещает это явно, и Caffe сохраняет отдельное рабочее пространство для каждого слоя, и я подозреваю, что в целом это может «потратить» много памяти.

Ответ №1:

Да, вы можете повторно использовать рабочую область для вызовов с разных уровней. Рабочее пространство-это просто память, необходимая алгоритму для работы, а не своего рода контекст, который необходимо инициализировать или поддерживать в определенном состоянии, вы можете увидеть его в руководстве пользователя cuDNN, например, здесь или здесь (см., например, документацию для cudnnGetConvolutionForwardWorkspaceSize ). Также именно поэтому внутри одного слоя размер рабочего пространства вычисляется как максимальное из всех возможных рабочих пространств, необходимых для любого из применяемых алгоритмов (ну, умноженное на CUDNN_STREAMS_PER_GROUP , а также на количество групп, если несколько групп могут выполняться параллельно).

Тем не менее, в caffe вполне возможно параллельное вычисление 2 экземпляров любого слоя, и я не думаю, что рабочие пространства настолько велики по сравнению с фактическими данными, которые нужно хранить для одной партии (хотя я не уверен в этой части, так как это зависит от используемой архитектуры NN и алгоритмов), но у меня есть сомнения, что вы можете много выиграть, повторно используя рабочее пространство в обычных случаях.

Теоретически вы всегда можете выделить рабочее пространство непосредственно перед соответствующим вызовом библиотеки и освободить его после, что сэкономит еще больше памяти, но, вероятно, в некоторой степени снизит производительность.

Комментарии:

1. Я не смог найти описание повторного использования в документах… И если я не ограничу рабочее пространство в кафе, оно вырастет до 1,5 г на resnet50

2. Документы содержат описание того, как именно рабочее пространство используется различными алгоритмами, например, для прямой свертки, см. Здесь: docs.nvidia.com/deeplearning/cudnn/api/… . Возможно, вы уже пробовали это, но вы можете получить некоторое представление о том, какие алгоритмы использует ваша сеть, установив env vars CUDNN_LOGINFO_DBG в 1 и CUDNN_LOGDEST_DBG в некоторый путь перед инициализацией caffe и получите журналы, которые сообщат вам, какие алгоритмы выбираются (см. docs.nvidia.com/deeplearning/cudnn/developer-guide/… ).