解决报错“RuntimeError: CUDA error: device-side assert triggered ”

这是一个比较通用的错误,通常发生在以下几种情况下:

  1. 索引超出范围:在某些情况下,操作涉及的张量索引超出了允许的范围。例如,使用 index_selectgather 时,索引可能超出张量的范围。
  2. 非法操作:例如对负数取对数、零除法,或对概率分布应用 log 函数时存在无效值(例如 0)。
  3. 数据类型或维度不匹配:操作的输入张量可能在维度或数据类型上不匹配,这会触发设备端的断言。
  4. 类别标签非法:如果使用了分类损失函数(例如 CrossEntropyLoss),类别标签可能超出了预定义类别的范围。

这里我的下面一段代码出现了报错:

return (torch.pow(((input_embed * output_embed).sum(1) + input_bias + output_bias).squeeze(1) - torch.log(co_num).to(device), 2) * weights).sum()

解决步骤:

1、将代码放在cpu上运行

这是因为gpu给出的报错信息很笼统,一般来说,cpu会给出更为详细的报错信息。

记录一下把数据和模型放到不同设备上的方法:

device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
model = model.to(device)

这里就直接把cuda:1替换成cpu可以

进行到这一步,报错信息应该很明朗了,我这里是由于维度不匹配。

2、确保co_num没有0值

确保 co_num 没有任何 0 或负值,因为这会导致 log(co_num) 触发非法操作。

if torch.any(co_num <= 0):
    raise ValueError("co_num contains zero or negative values, which would cause log(co_num) to be undefined.")

3、检测各个张量的维度

直接print各个张量的维度,然后去查看,在矩阵乘法和加法中,哪些不匹配。

print("input_embed size:", input_embed.size())
print("output_embed size:", output_embed.size())
print("sum result size:", (input_embed * output_embed).sum(1).size())
print("input_bias size:", input_bias.size())
print("output_bias size:", output_bias.size())
print("log_co_num size:", torch.log(co_num).size())

基本上到这里就能解决这个报错,维度不匹配就要看函数传入的数据维度是从哪里来的,也许就是一个embedding_size导致维度不匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值