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