1 系统环境
硬件环境(Ascend/GPU/CPU): Ascend/GPU/CPU
MindSpore版本: mindspore=2.6.0
执行模式(PyNative/ Graph): 不限
Python版本: Python=3.9
操作系统平台: Linux
2 报错信息
2.1 问题描述
使用MindSpore的混合精度训练一个模型时,遇到了Loss变为NaN的问题。在FP32模式下训练正常,但开启混合精度后几个epoch就会出现NaN。
AMP(自动混合精度)模式:训练初期正常,随后loss突变为NaN,梯度检查发现某些层出现极大值(1e+10级别)。
2.2 脚本信息
import mindspore as ms
from mindspore import nn, amp
# 模型定义
class LargeModel(nn.Cell):
def __init__(self):
super().__init__()
self.backbone = create_backbone() # 复杂骨干网络
self.head = create_head() # 分类头
def construct(self, x):
return self.head(self.backbone(x))
# 混合精度配置
model = LargeModel()
optimizer = nn.Adam(model.trainable_params(), learning_rate=0.001)
loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
# 启用混合精度
model = amp.auto_mixed_precision(model, level="O2") # O2级别
def train_step(data, label):
def forward_fn(data, label):
logits = model(data)
loss = loss_fn(logits, label)
return loss, logits
grad_fn = ms.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)
(loss, _), grads = grad_fn(data, label)
# 这里出现NaN
if ms.ops.isnan(loss).any():
print("Loss is NaN!")
optimizer(grads)
return loss
3 根因分析
此处由用户填写
4 解决方案
此处由用户填写
包含文字方案和最终脚本代码 请将正确的脚本打包并上传附件