RuntimeError: cuda runtime error (77)

本文详细描述了一位开发者在使用Python和GPU环境训练Pix2PixHDModel时遇到的RuntimeError: CUDA运行时错误(77)。通过分析可能的原因,如形状匹配、设备一致性、数据类型和非法值,一步步排查并提供了针对性的解决方案。最终确定是scatter_操作导致的问题,并给出了定位和修复建议。

项目场景:

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),具体原因是:
在这里插入图片描述
关于scatter_,可以参考此blog
5)以上都没有排查到你的代码具体问题,或没有解决问题。只能尝试换高版本的框架了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏常青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值