【问题标题】:Very weird behaviour when running the same deep learning code in two different GPUs在两个不同的 GPU 中运行相同的深度学习代码时出现非常奇怪的行为
【发布时间】:2018-07-14 17:10:09
【问题描述】:

我正在使用 pytorch 框架训练网络。我的电脑里有 K40 GPU。上周,我在同一台计算机上添加了 1080。

在我的第一个实验中,我在两个 GPU 中观察到相同的结果。然后,我在两个 GPU 上尝试了我的第二个代码。在这种情况下,我在 K40 中“不断地”获得了不错的结果,而在“完全相同的代码”中,在 1080 中获得了“不断地”糟糕的结果。

首先,我认为获得如此多样化输出的唯一原因是代码中的随机种子。所以,我这样固定种子:

torch.manual_seed(3)
torch.cuda.manual_seed_all(3)
numpy.random.seed(3)

但是,这并没有解决问题。我相信问题不可能是随机性的,因为我在 K40 中“不断”获得好结果,而在 1080 中“不断”获得坏结果。此外,我在其他 2 台计算机和 4 台其他 1080 GPU 上尝试了完全相同的代码,并且总是取得很好的结果。所以,问题一定是我最近插的1080。

我怀疑问题可能与驱动程序或我安装 pytorch 的方式有关。但是,我只在“一些”实验中得到不好的结果仍然很奇怪。对于其他实验,我得到了相同的结果。

谁能帮我解决这个问题?

【问题讨论】:

  • 重新安装pytorch后问题似乎解决了!

标签: gpu pytorch


【解决方案1】:

问:你能告诉我这是什么类型的实验......以及你使用的神经网络架构吗?

在以下提示中,我将假设您正在运行一个直接反向传播神经网络。

  • 你说你的测试实验的学习是“不稳定的”? NN 的训练应该是“不稳定的”。如果是这样,受数值精度和舍入误差的影响,不同的处理器最终可能会产生不同的结果。 饱和可能已经发生。检查您的体重值是否变得太大。在这种情况下 1)检查您的训练输入和输出是否在逻辑上一致,以及 2)在隐藏层中添加更多神经元并再次训练。

  • 检查 random() 调用是个好主意,但要考虑到在反向传播 NN 中有几个地方可以使用 random() 函数。一些反向传播 NN 还会在训练模式中添加动态噪声,以防止权重过早饱和。当这种训练噪声被错误地缩放时,你可能会得到奇怪的结果。如果没有添加噪点或噪点太小,最终可能会出现饱和。

【讨论】:

  • 训练非常不稳定。您正在对一个非常高维的表面进行优化。击中山脊(在任何维度)可能导致一次训练跑向单向,而另一次跑步可能会跑到山脊的另一侧。这可能是由像融合或不融合乘加这样简单的事情引起的。
  • “稳定性”一词可能令人困惑,这是我的错。您唯一应该记住的是,我在 K40 和其他计算机中的“1080s”中不断取得好成绩。但是,我最近插入的 1080 总是得到不好的结果。问题不在于随机性、输入输出一致性或网络结构。因为我在所有其他 GPU 上都取得了不错的成绩。
  • 很遗憾,我无法分享我的代码。但是,在两个 GPU 中都可以使用的代码使用 ResNet,而对我的新 GPU 不起作用的代码使用了一个大型卷积网络。同样,问题必须与我的新 GPU 有关,因为相同的代码适用于其他任何地方。
【解决方案2】:

我遇到了同样的问题。我通过简单的改变解决了这个问题

总和

火炬.sum

。请尝试将所有内置功能更改为 GPU 1。

【讨论】:

  • 但是为什么会这样呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
相关资源
最近更新 更多