项目场景:
python语言,GPU环境,定义神经网络后,初始化神经网络,训练模型前,cat数据,出现异常: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。
能够正常显示,没有报错,说明数据集没有问题。
在检查数据输入模型前的预处理,预处理后的值正常是否合法。
如果都没有问题,那么可能是报错时定位不准确。在运行前添加:CUDA_LAUNCH_BLOCKING = 1
,帮助cuda运行报错正确定位。之后再次排查,正确定位:masked_label = masked_label.scatter_(1, (label_map * (1 - clothes_mask)).data.long().cuda(), 1.0)
,具体原因是:
5)以上都没有排查到你的代码具体问题,或没有解决问题。只能尝试换高版本的框架了。
排查bug出现的可能情况,借助问题分析1,2,3,4,5找到问题的原因,对应解决方法,修改bug。