Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered

Faster rcnn 训练coco2017数据报错 RuntimeError: CUDA error: device-side assert triggered


这篇博客始于老板给我配了新机子希望提升运行速度以及运行效果

使用faster rcnn训练自己的数据

参考了很多博客,这里放上自己参考的博客链接: 利用Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解.
按照上面博客里提到的步骤一步一步地进行
使用命令行进行训练

 # python -m torch.distributed.launch --nproc_per_node=$gpus --use_env train.py --world-size $gpus --b 4
 # 2个gpu 每张卡跑3张图
python -m torch.distributed.launch --nproc_per_node=2 --use_env train.py --world-size 2 --b 3

然后就出现了下面的错误:
在这里插入图片描述
这里我的各个包的版本为:
在这里插入图片描述然后我就开始各种查查查
首先搜

RuntimeError: CUDA error: device-side assert triggered

然后出来了各种完美解决这个问题的博客,我心一喜,然后点了进去,大多提及的都是数组下标越界,也有一些提到可能会是其他问题,然而都没有解决我的问题。
我一开始以为会不会是显卡爆了导致出现了稀奇古怪的问题,然后各种运行查看显存占用情况,结果没有2张12g的卡都还有一半显存没用。

# 终端上 每隔1s查看一次显存
watch -n 1 -d nvidia-smi  

然后我又以为会不会是nccl的问题(因为它在后面有报nccl有关的问题,忘截图了>-< !)差点就要卸载掉原来的然后重装nccl,还好我机智地在动手之前问了下师兄师姐,他们表示多卡训练都没有遇到过nccl相关的问题,所以直觉告诉我应该不是这个问题。还好没有重装不然又要出啥么蛾子!
已经过去了三天,我拦住了路过我的位置正要回去的大佬师姐,向她求助,师姐使用图形界面上的debug进行调试(由于我一直不知道咋用这个所以都是用的命令行然后打log的形式进行调试,我还是太菜了,很多工具还不知道咋用>-<,所以我又去学了怎么使用图形界面上的debug调试带有参数的程序,依然放上学习的链接: Pycharm:运行、调试pytorch分布式训练代码.)然后,师姐得出的结论是显存爆了,直呼让我老板给加卡,唉,然后我在周末跟老板进行了沟通,跟老板一起分析,觉得还是代码的问题,跟卡无关,哈哈哈。
然后我又在搜博客的时候看见博主门说gpu训练报错稀奇古怪可以切到cpu上看看,一般是代码的问题的话,报错更加清楚,然后我又去看看这代码如何使用cpu进行训练,嗯,我太菜了,😢,结果cpu稳稳当当地跑起来了,没一点错误,我丢,到底是啥问题啊!!!

然后我又以为是不是单机多卡分布式训练的问题,所以又去学习了单机多卡如何分布式训练,为此老板还专门找了个分布式训练的教程给我,在学习了老板给的教程和参考了网上的博客之后,我运行了测试代码,结果显示没问题。下面为测试的代码:(参考博客链接: link

import torch
import torch.nn as nn
from torch.autograd import Variable
import os
from pycocotools.coco import COCO
from torch.utils.data import Dataset, DataLoader
import torchvision
import os
from torch.utils.data.distributed import DistributedSampler
# 1) 初始化
torch.distributed.init_process_group(backend="nccl")

input_size = 5
output_size = 2
batch_size = 30
data_size = 90

# 2) 配置每个进程的gpu
local_rank = torch.distributed.get_rank()
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)

class RandomDataset(Dataset):
    def __init__(self, size, length):
        self.len = length
        self.data = torch.randn(length, size).to('cuda')

    def __getitem__(self, index):
        return self.data[index]

    def __len__(self):
        return self.len

dataset = RandomDataset(input_size, data_size)
# 3)使用DistributedSampler
rand_loader = DataLoader(dataset=dataset,
                         batch_size=batch_size,
                         sampler=DistributedSampler(dataset))

class Model(nn.Module):
    def __init__(self, input_size, output_size):
        super(Model, self).__init__()
        self.fc = nn.Linear(input_size, output_size)

    def forward(self, input):
        output = self.fc(input)
        print("  In Model: input size", input.size(),
              "output size", output.size())
        return output

model = Model(input_size, output_size)

# 4) 封装之前要把模型移到对应的gpu
model.to(device)

if torch.cuda.device_count() > 1:
    print("Let's use", torch.cuda.device_count(), "GPUs!")
    # 5) 封装
    model = torch.nn.parallel.DistributedDataParallel(model,
                                                      device_ids=[local_rank],
                                                      output_device=local_rank)

for data in rand_loader:
    if torch.cuda.is_available():
        input_var = data
    else:
        input_var = data

    output = model(input_var)
    print("Outside: input size", input_var.size(), "output_size", output.size())

然后我又以为是不是我的torch版本太高了,然后又各种换torch、cuda,还是会报错,所以排除了torch和cuda版本的问题。
然后在看了好多博客之后,我又觉得是不是真的是数据集的问题,但是我是直接下的coco数据集啊!应该不存在这个问题的,而且我看那篇博客下面的评论里也有跑coco跑成功的,但是又毫无头绪,干脆试一下,于是我把cocoapi的各个函数都过了一遍,使用起来得心应手!结果输出的数据并没啥问题。此时我在此问题上已经耗费了一个多星期了,同组的师兄师姐也已经求助了遍,还是没有解决,点一首凉凉送给自己!
今天中午回去午休的时候还在想到底是啥出了问题,整个中午都没睡着,下午去实验室的路上还在跟同实验室的同学说到这个,同学还打趣我说要不换方向吧,哈哈哈哈!不行,我已经耗费这么多时间在这上面了换是不可能换的,我还就不信整不出来了!
然而,在我坚持不懈地搜索下,搜索下面这个:

File “./maskrcnn_benchmark/modeling/balanced_positive_negative_sampler.py”, line 53, in call
neg_idx_per_image = negative[perm2]
RuntimeError: CUDA error: device-side assert triggered

终于找到一篇大佬的博客,里面的训练的数据和运行的报错都跟我十分相似,在此贴上大佬的博客链接: Maskrcnn Code Understanding.
终于解决了这个问题,我的代码也跑了起来,太开心了,坐我对面的同学都说闻到了显卡运行的那股胶味,哈哈哈哈哈哈哈哈

使用cpu训练不会运行这段代码,这也是为啥cpu跑程序不会报错的原因。

class BalancedPositiveNegativeSampler(object):
	...
 def __call__(self, matched_idxs):
 		...	
        for matched_idxs_per_image in matched_idxs:
        	...
            # 取出图片中目标边框和背景边框的索引
            ### 这里报错!!!
            positive = torch.nonzero(matched_idxs_per_image >= 1).squeeze(1)
            negative = torch.nonzero(matched_idxs_per_image == 0).squeeze(1)
 
            ...
 
            # randomly select positive and negative examples
            # 将下面2句注释掉,然后改成后面4句,就能运行辣    
            # perm1 = torch.randperm(positive.numel(), device=positive.device)[:num_pos]
            # perm2 = torch.randperm(negative.numel(), device=negative.device)[:num_neg]
            
            perm1 = torch.randperm(positive.numel())[:num_pos]
            perm2 = torch.randperm(negative.numel())[:num_neg] ################# the elments inside the perm2 are too large
            perm1.cuda()
            perm2.cuda()
 

anyway,终于是跑起来了,这一两个星期,没一点纵向的进度,不过横向上学习了蛮多的东西,还是没有白白浪费光阴,十分感谢我的老板、师姐、师兄、同学,愿意帮助我这个菜鸡,激动的我在实验室里写下了这篇博客来记录一下自己的踩坑记录以自勉!每天都要加油鸭~

=分割线==
开开心心地跑着代码去吃晚饭,回来一看电脑崩了,电源键的灯灭了,然后重启一直卡在logo进不去系统,报错说风扇速度过低,按照官网的指南进行操作没效果,打电话给维修人员,维修人员第二天来了一看被告知需要重装系统,我丢!一朝回到解放前,真就开开心心地吃了一顿饭。。。每天还是都要加油鸭~在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值