女娲修坑记录

本文记录了在使用PyTorch进行深度学习训练时遇到的CUDA错误,包括RuntimeError: CUDA error: device-side assert triggered,多GPU训练时的维度错误,以及debug过程中出现的其他问题。解决方案包括检查batch的形状,避免维度不匹配,以及理解CUDA错误的异步报告特性。此外,文章提到了在多GPU训练时,由于复数Tensor导致的维度问题及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、RuntimeError: CUDA error: device-side assert triggered

错误描述:

RuntimeError: CUDA error: device-side assert triggered
CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1

报错图片如下:
在这里插入图片描述
在这里插入图片描述
由图片可得是batch:19752出错,于是用debug看看这个batch,详细报错如下:

在这里插入图片描述
可知是embedding的size不对
或者是以下这样
在这里插入图片描述

在这里插入图片描述
1.问题如下:
RuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

二、多gpu训练问题,出现维度错误

在这里插入图片描述
定位到代码中的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原因:
在对单卡和多卡下的self.weights打印形状发现,多卡时此参数多了一个维度。self.weights的定义如下,nn.parameter是可学习的参数,大意是创建一个此形状的tensor,然后将其转换为可学习的参数。
我们怀疑是torch.nn.DataParrell或者torch.rand或者cfloat有问题,尝试过把cfloat换成其他的类型,最后发现维度出错的原因是cfloat表示复数tensor,pytorch在将参数从单gpu复制到多gpu上时,会把实部和虚部拆开,因此维度加倍,无法进行后面的复数计算。

解决办法:
去掉这个参数,重新定义实部和虚部参数,加载至gpu后,分别复制到其他gpu上,在每块gpu上都把实部和虚部结合成复数参数,从而进行复数运算。

代码:
运行指令:
python test.py 0,1
注意:device_ids表示的是虚拟的卡号,必须得有0号,如0,1或者0, 2,3。0号表示的是你填的物理卡的第一个
gpus表示物理的卡号。
pytorch之多GPU使用#CUDA_VISIBLE_DEVICES使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值