Lasagne dropoutlayer不能有效利用GPU

时间:2015-11-08 10:03:56

标签: python gpgpu theano deep-learning lasagne

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

最初我认为这是由于用于生成丢失掩码的随机数生成器(RNG),而不是在GPU上运行。但是,在代码(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%的执行时间,我不明白。

如果有人知道什么会杀死我的GPU利用率,我会很感激。

2 个答案:

答案 0 :(得分:1)

如果查看mrg_uniform的{​​{3}},可以看到它是随机生成器的纯python CPU实现。您还可以看到同一个生成器有一个code,但您运行的代码显然没有使用它。

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

答案 1 :(得分:1)

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

中更改第93行<div class='diamond'> <svg viewBox='0 0 100 100' preserveAspectRatio='none'> <filter id="dropshadow" height="125%"> <feGaussianBlur in="SourceAlpha" stdDeviation="1" /> <feOffset dx="0" dy="0" result="offsetblur" /> <feMerge> <feMergeNode/> <feMergeNode in="SourceGraphic" /> </feMerge> </filter> <path d='M2,50 50,2 98,50 50,98z' class='outer' /> <path d='M8,50 50,8 92,50 50,92z' class='inner' /> </svg> Text Here </div> <!-- Filter Code Adopted from http://stackoverflow.com/questions/6088409/svg-drop-shadow-using-css3 -->cuda_enabled = False
cuda_enabled = True

更改第57行 https://github.com/Theano/Theano/blob/master/theano/sandbox/cuda/__init__.py
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即可。但是,由于某些原因,这不适合我。