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 模型精度之间的巨大差异

[深度学习] Pytorch学习—— torch.nn 实践:训练分类器(含多GPU训练CPU加载预测的使用方法)

在GPU上训练PyTorch代码

在GPU上训练PyTorch代码

在GPU上训练PyTorch代码

[深度学习] Pytorch—— 多/单GPUCPU,训练保存加载模型参数问题