Lasagne dropoutlayer 没有有效地利用 GPU

Lasagne dropoutlayer does not utilize GPU efficiently

我正在使用 theano 和 lasagne 进行 DNN 语音增强项目。我使用的前馈网络与 lasagne 文档 (/github.com/Lasagne/Lasagne/blob/master/examples/mnist.py) 中的 mnist 示例非常相似。这个网络使用了几个 dropout 层。我在 Nvidia Titan X GPU 上训练我的网络。但是,当我不使用 dropout 时,我的 GPU 利用率大约为 60%,一个 epoch 大约需要 60 秒,但是当我使用 dropout 时,我的 GPU 利用率下降到 8%,每个 epoch 大约需要 600 秒。这与辍学率设置为 20% 或 0.1% 无关。

最初我认为这是由于用于生成 dropout mask 的随机数生成器 (RNG) 在 GPU 上没有 运行。但是,在代码中 (https://github.com/Lasagne/Lasagne/blob/master/lasagne/layers/noise.py) it seems like rng_mrg is used, which should be running on the GPU based on this link: http://deeplearning.net/software/theano/tutorial/examples.html#other-implementations

运行 theano 分析器显示 "theano.sandbox.rng_mrg.mrg_uniform" 占用了 86.7% 的执行时间,我不明白。

如果有人知道是什么降低了我的 GPU 利用率,我将不胜感激。

如果您查看同一生成器的 code for mrg_uniform, you can see that it is a pure python CPU implementation of the random generator. You can also see that there is a GPU version,但您的代码 运行 显然没有使用它。

所以答案不是您的 GPU 利用率下降太多,而是您的 CPU 利用率大大增加,因为您使用的是纯 Python 随机生成器。解决方案显然是找出如何切换到 GPU 加速随机生成器。

正如 talonmies 所指出的,问题是千层面使用的是 CPU 版本的 RNG (mrg_uniform) 而不是 GPU 版本 (GPU_mrg_uniform)。 我还没有找到一个优雅的解决方案,但以下两个 hack 解决了这个问题。

中的第 93 行 cuda_enabled = False 更改为 cuda_enabled = True
https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/__init__.py

更改第 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) 来完成同样的操作。但是,由于某些原因这对我不起作用。