我正在使用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利用率,我会很感激。
答案 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
即可。但是,由于某些原因,这不适合我。