【问题标题】:Extracting Meaningful Error Message from 'RuntimeError: CUDA error: device-side assert triggered' on Google Colab in Pytorch从 Pytorch 中 Google Colab 上的“RuntimeError:CUDA 错误:设备端断言触发”中提取有意义的错误消息
【发布时间】:2021-09-17 12:19:53
【问题描述】:

我在通过 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 在子外壳中运行这些行。在 CPU 上运行时不会出现该错误,并且除了 Colab 上的 GPU 之外,我无法访问 GPU 设备。虽然已经以多种不同的形式提出了这个问题,但没有任何答案对我特别有帮助,因为他们要么建议通过上述行,要么是关于与我自己根本不同的情况(例如训练具有不适当数量的类的分类器),或者推荐一个我已经尝试过的解决方案,例如重置运行时或切换到 CPU。

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

  1. 有没有办法让我获得更具体的错误消息?设置启动阻止变量的努力没有成功。
  2. 我怎么会在两条看似完全不同的线路上出现此错误?怎么可能我的网络训练了 3 个批次(始终是 3 个),但在第四个批次却失败了?
  3. 这种情况是否会提醒任何人他们之前遇到的错误,并且鉴于我可以提取的信息有限,是否有可能的途径来改善它?

【问题讨论】:

    标签: pytorch google-colaboratory


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这主要有两个原因:

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

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

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

      criterion=nn.BCEWithLogitsLoss()
      

      代替:

      criterion=nn.BCELoss()
      

      哦,是的,我也用过:

      CUDA_LAUNCH_BLOCKING = "1"
      

      在代码的开头。

      【讨论】:

        猜你喜欢
        • 2019-04-15
        • 2019-09-10
        • 2020-02-03
        • 1970-01-01
        • 2021-10-14
        • 2023-01-13
        • 2020-04-07
        • 2021-09-10
        • 2022-09-24
        相关资源
        最近更新 更多