【问题标题】:how to modify rnn cells in pytorch?如何修改pytorch中的rnn单元格?
【发布时间】:2019-07-21 01:47:56
【问题描述】:

如果我想更改 RNN 单元(例如 GRU 单元)中的计算规则,我应该怎么做?
考虑到效率问题,我不想通过 for 或 while 循环来实现它。
我查看了 pytorch 的源代码,但似乎 rnn 单元的主要组件是用我无法找到和修改的 c 代码实现的。 您可以通过一个例子来回答这个问题:在没有现有版本的情况下实现 GRU 单元。

谢谢~

【问题讨论】:

  • “你可以通过一个例子来回答这个问题:在没有现有版本的情况下实现GRU单元。” ¯\_(ツ)_/¯还有其他愿望吗?
  • ...并且没有“for”或“while”循环?这种香草方式将比标准 GRU 慢至少 10 倍。而且我使用的“GRU 单元”可能是模棱两可的。实际上,我想修改单元格以实现 GRU 层。

标签: neural-network pytorch recurrent-neural-network natural-language-processing


【解决方案1】:

是的,您“通过 for 或 while 循环”实现它。 自 Pytorch 1.0 以来,JIT https://pytorch.org/docs/stable/jit.html 运行良好(由于最近对 JIT 的改进,使用 PyTorch 的最新 git 版本可能更好),并且取决于您的网络和实现,其速度可以与原生 PyTorch C++ 实现一样快(但仍然比 CuDNN 慢)。

您可以在https://github.com/pytorch/benchmark/blob/master/rnns/fastrnns/custom_lstms.py查看示例实现

【讨论】:

  • 谢谢。我用 batchsize=64, timesteps=512, input_dim=1024, output_dim=128 测试了它。 rnntype=gru。在 1080-ti 上运行 10 次,只考虑前向程序。天真的 for 循环需要 516 毫秒,带有 for 循环的 jit 类需要 506 毫秒,gru api 需要 204 毫秒。并且 for 循环对时间步长非常敏感。如果我们有 2048 个时间步,for 循环慢 4 次,gru api 版本只慢 3 次。
  • 你没有禁用 CuDNN,对吧? nn.GRU Pytorch 类调用 CuDNN,这就是它如此之快的原因。尝试使用torch.backends.cudnn.enabled = False,nn.GRU 应该慢得多,接近使用 JIT 的 python 循环。
  • 不,我没有......这就是悲伤的故事~CuDNN真的很强大~谢谢~
猜你喜欢
  • 2016-12-26
  • 2019-08-09
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2020-11-22
相关资源
最近更新 更多