代码拉取完成,页面将自动刷新
一、问题现象(附报错日志上下文):
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计算得到)
单跑反向未复现,建议测试反向依赖正向输出的结果是否正确
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)
当前问题最新版本已经修复,可以使用下个版本进行验证
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论