PyTorch:用 GPU 训练比用 CPU 训练同样的东西错误更严重
Posted
技术标签:
【中文标题】PyTorch:用 GPU 训练比用 CPU 训练同样的东西错误更严重【英文标题】:PyTorch: training with GPU gives worse error than training the same thing with 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 相同的结果。 【参考方案1】:在尝试了很多事情之后,我想我找到了问题所在。显然,CUDNN 库在 PyTorch 中是次优的。我不知道这是 PyTorch 中的错误还是 CUDNN 中的错误,但正在做
torch.backends.cudnn.enabled = False
解决问题。使用上面的代码,使用 GPU 或 CPU 进行训练在同一时期会产生相同的损失。
编辑:
似乎是权重归一化和 CUDNN 的相互作用导致了问题的发生。如果我删除重量标准化,它会起作用。如果我删除 CUDNN,它会起作用。似乎只有在组合中它们才在 PyTorch 中不起作用。
【讨论】:
听起来是个严肃的发现。我建议先用 Pytorch 打开一个问题,然后可能用 cuDNN 谢谢。我会这样做的。 您是在程序上还是在其他地方设置了这个?您能否提供详细信息以便将来对其他人有所帮助? 是的。将此行添加到您的 Torch 代码的开头。以上是关于PyTorch:用 GPU 训练比用 CPU 训练同样的东西错误更严重的主要内容,如果未能解决你的问题,请参考以下文章
使用 cpu 与 gpu 进行训练的 pytorch 模型精度之间的巨大差异