Выпадающий слой Lasagne неэффективно использует GPU

Я использую теано и лазанью для проекта улучшения речи DNN. Я использую сеть с прямой связью, очень похожую на пример mnist в документации по лазанье (/github.com/Lasagne/Lasagne/blob/master/examples/mnist.py). В этой сети используется несколько слоев отсева. Я обучаю свою сеть на графическом процессоре Nvidia Titan X. Однако, когда я не использую отсев, загрузка моего графического процессора составляет примерно 60%, а одна эпоха занимает около 60 с, но когда я использую отсев, загрузка моего графического процессора падает до 8%, и каждая эпоха занимает примерно 600 с. Это независимо от коэффициента отсева, установленного на 20% или 0,1%.

Первоначально я думал, что это связано с генератором случайных чисел (ГСЧ), используемым для создания маски исключения, который не работал на графическом процессоре. Однако в коде (https://github.com/Lasagne/Lasagne/blob/master/lasagne/layers/noise.py) похоже, что используется rng_mrg, который должен работать на GPU по этой ссылке: http://deeplearning.net/software/theano/tutorial/examples.html#other-implementations

Запуск профилировщика theano показывает, что "theano.sandbox.rng_mrg.mrg_uniform" занимает 86,7% времени выполнения, чего я не понимаю.

Если у кого-нибудь есть идея, что убивает использование моего графического процессора, я был бы признателен.


person Morten Kolbæk    schedule 08.11.2015    source источник


Ответы (2)


Если вы посмотрите на код для mrg_uniform, вы можете видеть, что это чистая реализация процессора Python для генератора случайных чисел. Вы также можете увидеть, что существует версия GPU того же генератора, но код, который вы запускаете, по-видимому, не использует его.

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

person Community    schedule 08.11.2015
comment
Огромное спасибо. Это решило мою проблему. Я написал свой хак/решение ниже - person Morten Kolbæk; 08.11.2015

Как указал talonmies, проблема заключалась в том, что лазанья использовала версию процессора RNG (mrg_uniform), а не версию GPU (GPU_mrg_uniform). Я еще не нашел элегантного решения, но следующие два хака решают проблему.

Либо измените строку 93 cuda_enabled = False на cuda_enabled = True в

https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/__init__.py

or

Изменить строку 57
self._srng = RandomStreams(get_rng().randint(1, 2147462579))
на
self._srng = "RandomStreams(get_rng().randint(1, 2147462579),use_cuda = True) в https://github.com/Lasagne/Lasagne/blob/master/lasagne/layers/noise.py

Я также считаю, что вы сможете сделать то же самое, просто набрав theano.sandbox.cuda.use(enable_cuda=True) непосредственно в основном скрипте. Однако у меня это по каким-то причинам не сработало.

person Morten Kolbæk    schedule 08.11.2015