解决RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors…CUDA_LAUNCH_BLOCKING=1

完整报错

RuntimeError: CUDA error: device-side assert triggeredCUDA 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.

其实出现这种情况的原因,(由于我本人遇见bug比较多)我踩得坑分为两种 ,不知道还会不会有更多原因也是报如上错误!!!!

第一种情况(常见,通常不能完整训练1轮数据)

如果您已经查到过本方法,并且未解决的话,可以直接看第二种情况~~~
相信大家也查阅了很多如上述错误的帖子了,大部分都是说大家的标签设置不对!简单来说:拿VOC格式数据举例子: 假设您需要要做一个2分类,数据信息呢又都在VOC种类数据集中的 “Annotations” 文件夹之中的 “.xml” 文件中,但是数据不干净,不小心掺杂了其他数据集的 “.xml” 文件,图片也放进对应文件夹的话,就会导致数据标签多了 1或者多类别, 所以再train数据集的时候,开始还能正常运行,当dataload加载到那个多余的 “.xml” 文件信息时就会在您提供的label.txt文件里面找不到这个分类,出现如上错误。在此给出一个检查所有 Annotations 文件夹之中一共有多少个label的代码:

import os
import xml.etree.ElementTree as ET

from tqdm import tqdm

def getClsTxt(xmlDir, cls_txt):
"""
    xmlDir  :xml地址
    cls_txt : 输出cls文件地址
"""

    for name in tqdm(os.listdir(xmlDir)):
        xmlFile = os.path.join(xmlDir, name)
        with open(xmlFile, "r+", encoding='utf-8') as fp:
            tree = ET.parse(fp)
            root = tree.getroot()
            for obj in root.iter('object'):
                cls = obj.find('name').text

                set_cls.add(cls)

    with open(cls_txt, "w+") as ft:
        for i in set_cls:
            ft.write(i + "\n")

if __name__ == '__main__':
    set_cls = set()

    xmlDir = "dataset/VOC/Annotations"

    cls_txt = "dataset/VOC/labels.txt"

    getClsTxt(xmlDir, cls_txt)

运行如下代码可以自动帮您生成所有 “.xml” 文件中出现过的label,并写入 labels.txt中!然后您可以对比一下和自己原来训练所用的标签能否对应上。
第一种情况的错误,如果您的数据加载代码没问题包含了所有的数据,一般会在第一轮训练不完就报此错误~~~

第二种情况(不常见,报错轮次随机)

下图可见,作者训练了41轮次快结束时候报错,前面40多轮都是正常训练的,有时候不到三轮就报这个错误了,采用第一种情况的解决方法,对照了我自己的label种类发现都是没有问题的!出现这种问题的原因在于作者在魔改网络模型结构不精所致,可以细心的发现下图最底下报错日志多了一行。如下
/pytorch/aten/src/ATen/native/cuda/Loss.cu:115: operator(): block: [19,0,0], thread: [0,0,0] Assertion input_val >= zero && input_val

assert targets.max() > 1 or targets.min() < 0, "label error max{} min{}".format(targets.max(), targets.min())

第三种情况(训练不报错,验证报错如上错误)

再次更新这篇博文,如果您上述两种情况都尝试过了,还是不行且每次训练不报错,都是在验证集上报错时,我这边有一个方法,对我是有效的,可以尝试一下,在读取数据时候将 num_workers改为0。

DataLoader(num_workers=0)

Original: https://blog.csdn.net/qq_37700257/article/details/124513572
Author: 锦鲤AI幸运
Title: 解决RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors…CUDA_LAUNCH_BLOCKING=1

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/646824/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球