Extracting Meaningful Error Message from 'RuntimeError: CUDA error: device-side assert triggered' on Google Colab in Pytorch

Extracting Meaningful Error Message from 'RuntimeError: CUDA error: device-side assert triggered' on Google Colab in Pytorch

我在通过 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')

但是,这两行都没有更改错误消息。根据不同的 post,这是因为 colab 运行 在子 shell 中设置了这些行。在 CPU 上 运行ning 时不会发生错误,并且除了 Colab 上的 GPU 之外,我无法访问 GPU 设备。虽然这个问题已经以许多不同的形式被问到,但没有答案对我特别有帮助,因为他们要么建议通过上述行,要么是关于与我自己的情况根本不同的情况(例如训练分类器的数量不适当 类), 或推荐一个我已经尝试过的解决方案,例如重置 运行time 或切换到 CPU.

我希望深入了解以下问题:

  1. 有没有办法让我得到更具体的错误信息?设置启动阻止变量的努力没有成功。
  2. 我怎么会在两条看似截然不同的线路上收到此错误?为什么我的网络训练了 3 个批次(总是 3 个批次),但在第四个批次时失败了?
  3. 这种情况是否提醒任何人他们之前遇到过的错误,并且鉴于我能提取的信息有限,是否有可能的改进方法?

我通过执行以下命令成功获得了有关错误的更多信息:

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

在导入手电筒之前。这使我能够获得更详细的回溯,并最终将问题诊断为不合适的损失函数。

这主要有两个原因:

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

如果是第一个,那么当您将运行时更改回 CPU 时,您会看到同样的错误。

就我而言,它是第二个。我用过BCE loss,它的输入应该在0到1之间。如果是其他值,可能会出现这个错误。所以我通过使用解决了这个问题:

criterion=nn.BCEWithLogitsLoss()

而不是:

criterion=nn.BCELoss()

哦对了,我也用过:

CUDA_LAUNCH_BLOCKING = "1"

在代码开头。