RuntimeError: cuda runtime error (77)

项目场景:

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。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用中提到的错误"RuntimeError: CUDA error: misaligned address"是由于CUDA内核错误引起的。该错误可能会在其他API调用时异步报告,导致下面的堆栈跟踪可能是不正确的。为了调试,可以考虑在CUDA_LAUNCH_BLOCKING=1的情况下运行程序。 引用中提到的解决方法是通过设置CUDA_LAUNCH_BLOCKING=1来进行调试,以便在错误发生时阻塞程序并获得准确的堆栈跟踪。这样可以更容易地定位错误并解决问题。 引用中提到的错误"RuntimeError: CUDA out of memory"是由于GPU显存不足引起的。为了解决这个问题,可以尝试以下方法: 1. 将batch_size改小,以减小每次运算所需的显存占用量。 2. 当需要取torch变量的标量值时,使用item()属性而不是保留整个变量。 3. 在测试阶段,可以尝试添加代码以释放不必要的显存资源。 引用中提到的警告"UserWarning: NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation"表示当前的PyTorch版本不支持您的显卡。如果想要使用NVIDIA GeForce RTX 3090 GPU进行PyTorch开发,请参考提供的链接,按照指引进行安装和配置。 综上所述,"RuntimeError: CUDA error: misaligned address"是由CUDA内核错误引起的,可以使用CUDA_LAUNCH_BLOCKING=1进行调试。而"RuntimeError: CUDA out of memory"则是由于GPU显存不足引起的,可以通过减小batch_size、使用item()属性和释放不必要的显存资源来解决问题。同时,如果要使用NVIDIA GeForce RTX 3090 GPU进行PyTorch开发,请确保PyTorch版本与显卡兼容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CUDA Error: no kernel image is available for execution on device](https://blog.csdn.net/qq_34845880/article/details/126460123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [pytorch模型提示超出内存RuntimeError: CUDA out of memory.](https://download.csdn.net/download/weixin_38552305/14884908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柏常青

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

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

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

打赏作者

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

抵扣说明:

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

余额充值