【问题标题】:PyTorch: training with GPU gives worse error than training the same thing with CPUPyTorch:用 GPU 训练比用 CPU 训练同样的东西错误更严重
【发布时间】:2018-07-04 21:11:52
【问题描述】:

我有一个关于时间序列的下一步预测模型,它只是一个 GRU,上面有一个全连接层。当我在 50 个 epoch 后使用 CPU 训练它时,我得到 0.10 的损失,但是当我用 GPU 训练它时,50 个 epoch 后的损失是 0.15。在这两种情况下,做更多的 epoch 并不能真正降低损失。

为什么在 CPU 上训练后的性能优于 GPU?

我尝试更改数据和模型的随机种子,这些结果与随机种子无关。

我有:

Python 3.6.2

PyTorch 0.3.0

CUDNN_MAJOR 7

CUDNN_MINOR 0

CUDNN_PATCHLEVEL 5

编辑:

我还在 GRU 和全连接层上使用 PyTorch 的权重归一化 torch.nn.utils.weight_norm

【问题讨论】:

  • 您正在进行基于小批量的培训吗?那么由于小批量,权重初始化等发生变化,后续运行之间的损失当然会发生变化......请详细说明
  • @kmario 正如问题中提到的那样,使用不同种子的多次运行都使用 CPU 给出相同的结果,并且它们都使用 GPU 给出相同的结果(这与 CPU 不同)。如果您在下面查看我的答案,您会发现如果我关闭 CUDNN,GPU 现在会给出与 CPU 相同的结果。

标签: python neural-network gpu pytorch cudnn


【解决方案1】:

在尝试了很多事情之后,我想我找到了问题所在。显然,CUDNN 库在 PyTorch 中是次优的。我不知道这是 PyTorch 中的错误还是 CUDNN 中的错误,但正在做

torch.backends.cudnn.enabled = False

解决问题。使用上面的代码,使用 GPU 或 CPU 进行训练在同一时期会产生相同的损失。

编辑:

似乎是权重归一化和 CUDNN 的相互作用导致了问题的发生。如果我删除重量标准化,它会起作用。如果我删除 CUDNN,它会起作用。似乎只有在组合中它们才在 PyTorch 中不起作用。

【讨论】:

  • 听起来是个严肃的发现。我建议先用 Pytorch 打开一个问题,然后可能用 cuDNN
  • 谢谢。我会这样做的。
  • 您是在程序上还是在其他地方设置了这个?您能否提供详细信息以便将来对其他人有所帮助?
  • 是的。将此行添加到您的 Torch 代码的开头。
猜你喜欢
  • 2017-03-30
  • 2022-12-11
  • 2020-12-06
  • 2019-09-01
  • 1970-01-01
  • 2018-05-28
  • 2019-06-20
  • 2021-05-03
  • 2019-07-15
相关资源
最近更新 更多