在Google Colab中使用Pytorch时出现“RuntimeError: CUDA错误:设备端触发了assert”错误消息,如何提取有意义的错误消息?

3

我在使用 Pytorch 1.9.0+cu102 训练生成网络时遇到以下错误:

RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

在使用 Google Colaboratory GPU 会话时,此段代码将在以下两行之一触发:
running_loss += loss.item()

或者
target = target.to(device)

当我第一次运行笔记本时,第一行就会出现错误,每次运行该代码块时,第二行都会出现错误。第一个错误发生在训练3个批次后。第二个错误发生在第一批次中。我可以确认设备为cuda0,该设备可用,并且target是一个pytorch张量。自然地,我尝试按照错误的建议运行:

!CUDA_LAUNCH_BLOCKING=1

并且

os.system('CUDA_LAUNCH_BLOCKING=1')

然而,这两行代码都没有改变错误信息。根据另一个帖子的说法,这是因为 colab 在子shell中运行这些行。当在CPU上运行时,错误不会发生,而且我除了Colab上的GPU之外,没有访问GPU设备。虽然这个问题以许多不同形式被问过,但对我来说没有一个答案特别有帮助,因为它们要么建议传递上述行,要么涉及到与我的情况根本不同的情况(比如用不恰当的类别数量训练分类器),或者建议我已经尝试过的解决方案,比如重置运行时或切换到CPU。

我希望能够从以下问题中获得一些见解:

  1. 是否有办法让我获得更具体的错误消息?设置启动阻止变量的尝试都失败了。
  2. 为什么我在两个看似非常不同的行上都会出现这个错误?我的网络如何在训练3批次后(始终为3)失败第四批次?
  3. 这种情况是否使任何人想起他们以前遇到过的错误,并且可以从有限的信息中提取出可能的缓解措施?
2个回答

10

我成功地执行了以下命令,从而获得有关错误的更多信息:

os.environ['CUDA_LAUNCH_BLOCKING'] = "1"

在导入torch之前,这使我获得了更详细的回溯信息,并最终诊断问题为不合适的损失函数。

4

这可能主要有两个原因:

  1. 类别数量不一致
  2. 损失函数的输入错误

如果是第一个原因,则在将运行时更改回 CPU 时应该会得到相同的错误。

在我的情况下,是第二种情况。我使用了 BCE 损失函数,它的输入应该介于0和1之间。如果是其他值,可能会出现此错误。所以我通过使用以下内容进行修复:

criterion=nn.BCEWithLogitsLoss()

替换为:

criterion=nn.BCELoss()

哦,对了,我还使用了:

CUDA_LAUNCH_BLOCKING = "1"

在代码开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接