【问题标题】:Lasagne dropoutlayer does not utilize GPU efficientlyLasagne dropoutlayer 没有有效利用 GPU
【发布时间】:2015-11-08 10:03:56
【问题描述】:

我正在将 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 掩码的随机数生成器 (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 profiler 显示“theano.sandbox.rng_mrg.mrg_uniform”占用了 86.7% 的执行时间,我不明白。

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

【问题讨论】:

    标签: python gpgpu theano deep-learning lasagne


    【解决方案1】:

    如果您查看codemrg_uniform,您可以看到它是随机生成器的纯python CPU 实现。您还可以看到同一生成器有一个GPU version,但您正在运行的代码显然没有使用它。

    因此,答案并不是因为您使用的是纯 Python 随机生成器,因此您的 GPU 利用率下降得如此之多,而是您的 CPU 利用率大大增加。显然,解决方案是弄清楚如何切换到 GPU 加速的随机生成器。

    【讨论】:

    • 非常感谢。这解决了我的问题。我在下面写了我的黑客/解决方案
    【解决方案2】:

    正如 talonmies 所指出的,问题在于千层面使用的是 RNG 的 CPU 版本 (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) in https://github.com/Lasagne/Lasagne/blob/master/lasagne/layers/noise.py

    我也相信您应该能够通过直接在主脚本中输入theano.sandbox.cuda.use(enable_cuda=True) 来做到这一点。但是,由于某些原因,这对我不起作用。

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 2012-09-20
      • 2013-05-13
      • 2020-06-20
      • 2012-04-17
      相关资源
      最近更新 更多