在 Pytorch 中的 Google Colab 上从“RuntimeError: CUDA error: device-sideassert displayed”中提取有意义的错误消息

Bro*_*lip 4 pytorch google-colaboratory

我在通过 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.
Run Code Online (Sandbox Code Playgroud)

使用 Google Colaboratory GPU 会话时。该段在以下两行之一上触发:

running_loss += loss.item()
Run Code Online (Sandbox Code Playgroud)

或者

target = target.to(device)
Run Code Online (Sandbox Code Playgroud)

当我第一次运行笔记本时,它会在第一行产生错误,而随后每次尝试运行该块时,它都会在第二行产生错误。第一个错误发生在训练 3 个批次后。第二个错误发生在第一批上。我可以确认该设备是 cuda0,该设备可用,并且target是 pytorch 张量。当然,我尝试接受错误的建议并运行:

!CUDA_LAUNCH_BLOCKING=1
Run Code Online (Sandbox Code Playgroud)

os.system('CUDA_LAUNCH_BLOCKING=1')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bro*_*lip 10

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

os.environ['CUDA_LAUNCH_BLOCKING'] = "1"
Run Code Online (Sandbox Code Playgroud)

在进口火炬之前。这使我能够获得更详细的回溯,并最终将问题诊断为不适当的损失函数。