76 Star 585 Fork 1.1K

Ascend/pytorch

【deeplink】torch_npu在输入为float16时,group_norm backward的计算结果错误

DONE
Bug-Report
创建于  
2024-05-08 15:03

一、问题现象(附报错日志上下文):
torch_npu在输入为float16时,group_norm backward的计算结果错误。

二、软件版本:
-- CANN 版本: cann 8.0.RC1
-- Pytorch版本: 2.1.0
-- torch_npu版本: 2.1.0.post3
-- Python 版本: 3.9.18

三、测试步骤:

import torch
import torch_npu
import torch.nn as nn

class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.group_norm = nn.GroupNorm(5, 10)

    def forward(self, x):
        x = self.group_norm(x)
        return x

net = SimpleNet().npu()
net.to(torch.float16)

input_tensor = torch.arange(0, 320).reshape(32, 10).to(dtype=torch.float16, device='npu')
target_tensor = torch.arange(0, 320).reshape(32, 10).to(dtype=torch.float16, device='npu')

output_tensor = net(input_tensor)

criterion = nn.MSELoss().npu()
criterion.to(torch.float16)
loss = criterion(output_tensor, target_tensor)

loss.backward()

print(net.group_norm.weight.grad)
print(net.group_norm.bias.grad)

torch_npu输出结果为
输入图片说明
参考的输出结果为(使用torch_cpu+float32计算得到)
输入图片说明

评论 (3)

deeplink_dev 创建了Bug-Report 1年前
deeplink_dev 修改了标题 1年前
deeplink_dev 修改了描述 1年前
deeplink_dev 修改了描述 1年前
deeplink_dev 修改了描述 1年前
展开全部操作日志

单跑反向未复现,建议测试反向依赖正向输出的结果是否正确

npu_float16和cpu_float32的前向结果确认没有问题,反向结果不一致
可以用这个脚本直接验证

import torch
import torch_npu
import torch.nn as nn

class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        self.group_norm = nn.GroupNorm(5, 10)

    def forward(self, x):
        x = self.group_norm(x)
        return x

# 在每次计算梯度之前清零梯度
def zero_grad(model):
    for param in model.parameters():
        if param.grad is not None:
            param.grad.detach_()
            param.grad.zero_()

net = SimpleNet()
zero_grad(net)
input_tensor = torch.arange(0, 320).reshape(32, 10).to(dtype=torch.float16, device='npu')
output_tensor = net.to(device='npu', dtype=torch.float16)(input_tensor)
output_tensor.backward(torch.ones_like(output_tensor))

npu_weight_grad = net.group_norm.weight.grad.clone()
npu_bias_grad = net.group_norm.bias.grad.clone()


net_cpu = net.to(device='cpu', dtype=torch.float32)
zero_grad(net_cpu)
input_cpu = torch.arange(0, 320).reshape(32, 10).to(dtype=torch.float32, device='cpu')
output_cpu = net_cpu(input_cpu)
output_cpu.backward(torch.ones_like(output_cpu))

cpu_weight_grad = net_cpu.group_norm.weight.grad
cpu_bias_grad = net_cpu.group_norm.bias.grad

# 前向结果可以allclose
assert torch.allclose(output_tensor.cpu().to(torch.float32), output_cpu, atol=1e-4, rtol=1e-4)

# npu结果和cpu结果不同
print(npu_weight_grad)
print(cpu_weight_grad)

输入图片说明

当前问题最新版本已经修复,可以使用下个版本进行验证

huangyunlong 任务状态TODO 修改为WIP 1年前
huangyunlong 任务状态WIP 修改为DONE 10个月前

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(3)
weinachuan-weinachuan deeplink_dev-deeplink-dev huangyunlong-huangyunlong2022
Python
1
https://gitee.com/ascend/pytorch.git
git@gitee.com:ascend/pytorch.git
ascend
pytorch
pytorch

搜索帮助