项目场景:

python语言,GPU环境,定义神经网络后,初始化神经网络,训练模型前,cat数据,出现异常:RuntimeError: cuda runtime error (77)

RuntimeError: cuda runtime error (77)_问题分析


问题描述:

虚拟试衣项目中,此处外层模型名称:Pix2PixHDModel,嵌套模型:G1,G2,U-net,G3。所以在最外层模型Pix2PixHDModel的forward函数,在处理前向传播过程中,难免会根据嵌套模型或最开始的输入数据,组织内层模型的输入,就像:​​G1_in = torch.cat([pre_clothes_mask, clothes, all_clothes_label, pose, noise], dim=1)​​,然后遇到非法内存访问的问题。

​RuntimeError: cuda runtime error (77) : an illegal memory access was encountered at XXXX​​:RuntimeError:CUDA运行时错误(77):在以下位置遇到了非法的内存访问.


原因分析与解决方案:

1)问题的分析一:可能是输入cat中进行拼接的各个对象的shape不匹配。

解决方式:查看各个对象的shape:​​print(248, pre_clothes_mask.shape, clothes.shape, all_clothes_label.shape, pose.shape, noise.shape, )​​,打印输出:​​248 torch.Size([1, 1, 256, 192]) torch.Size([1, 3, 256, 192]) torch.Size([1, 14, 256, 192]) torch.Size([1, 18, 256, 192]) torch.Size([1, 1, 256, 192])​​,发现size没有问题。排除问题一。

2) 问题分析二:可能是拼接的各个对象不再同一类设备上,比如有的数据存在cpu内存上,有的在gpu的内存上。

解决方式:查看各对象的设备:​​print(248, pre_clothes_mask.device, clothes.device, all_clothes_label.device, pose.device, noise.device, )​​,打印输出:​​248 cuda:0 cuda:0 cuda:0 cuda:0 cuda:0​​,发现device正常,没有问题。排除问题二。

3)问题分析三:可能拼接的各个对象的数据类型不一致。

解决方式:检查各个对象的数据的数据类型:​​print(248, pre_clothes_mask.type(), clothes.type(), all_clothes_label.type(), pose.type(), noise.type(), )​​,打印输出:​​248 torch.cuda.FloatTensor torch.cuda.FloatTensor torch.cuda.FloatTensor torch.cuda.FloatTensor torch.cuda.FloatTensor​​,发现数据类型一致,没有问题。排除问题三。

4)问题分析四:基于前面三种问题都排除了,那么,还有可能是拼接的各个对象中,有对象的数据元素出现非法值。

解决方法:梳理对象的数据元素,看看是否有非法元素。

首先查看了数据集的正确性:能够正常显示输入如下:人体解析标签label,人物模特image,关键点热图pose,待穿裤子color,该裤子的轮廓数据edge。

RuntimeError: cuda runtime error (77)_问题分析_02

能够正常显示,没有报错,说明数据集没有问题。

在检查数据输入模型前的预处理,预处理后的值正常是否合法。

如果都没有问题,那么可能是报错时定位不准确。在运行前添加:​​CUDA_LAUNCH_BLOCKING = 1​​,帮助cuda运行报错正确定位。之后再次排查,正确定位:​​masked_label = masked_label.scatter_(1, (label_map * (1 - clothes_mask)).data.long().cuda(), 1.0)​​,具体原因是:

RuntimeError: cuda runtime error (77)_问题分析_03

​关于scatter_,可以参考此blog​​。

5)以上都没有排查到你的代码具体问题,或没有解决问题。只能尝试换高版本的框架了。

排查bug出现的可能情况,借助问题分析1,2,3,4,5找到问题的原因,对应解决方法,修改bug。