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.
我希望深入了解以下问题:
- 有没有办法让我得到更具体的错误信息?设置启动阻止变量的努力没有成功。
- 我怎么会在两条看似截然不同的线路上收到此错误?为什么我的网络训练了 3 个批次(总是 3 个批次),但在第四个批次时失败了?
- 这种情况是否提醒任何人他们之前遇到过的错误,并且鉴于我能提取的信息有限,是否有可能的改进方法?
我通过执行以下命令成功获得了有关错误的更多信息:
os.environ['CUDA_LAUNCH_BLOCKING'] = "1"
在导入手电筒之前。这使我能够获得更详细的回溯,并最终将问题诊断为不合适的损失函数。
这主要有两个原因:
- 数量不一致类
- 损失函数输入错误
如果是第一个,那么当您将运行时更改回 CPU 时,您会看到同样的错误。
就我而言,它是第二个。我用过BCE loss,它的输入应该在0到1之间。如果是其他值,可能会出现这个错误。所以我通过使用解决了这个问题:
criterion=nn.BCEWithLogitsLoss()
而不是:
criterion=nn.BCELoss()
哦对了,我也用过:
CUDA_LAUNCH_BLOCKING = "1"
在代码开头。
我在通过 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.
我希望深入了解以下问题:
- 有没有办法让我得到更具体的错误信息?设置启动阻止变量的努力没有成功。
- 我怎么会在两条看似截然不同的线路上收到此错误?为什么我的网络训练了 3 个批次(总是 3 个批次),但在第四个批次时失败了?
- 这种情况是否提醒任何人他们之前遇到过的错误,并且鉴于我能提取的信息有限,是否有可能的改进方法?
我通过执行以下命令成功获得了有关错误的更多信息:
os.environ['CUDA_LAUNCH_BLOCKING'] = "1"
在导入手电筒之前。这使我能够获得更详细的回溯,并最终将问题诊断为不合适的损失函数。
这主要有两个原因:
- 数量不一致类
- 损失函数输入错误
如果是第一个,那么当您将运行时更改回 CPU 时,您会看到同样的错误。
就我而言,它是第二个。我用过BCE loss,它的输入应该在0到1之间。如果是其他值,可能会出现这个错误。所以我通过使用解决了这个问题:
criterion=nn.BCEWithLogitsLoss()
而不是:
criterion=nn.BCELoss()
哦对了,我也用过:
CUDA_LAUNCH_BLOCKING = "1"
在代码开头。