使用MindSpore混合精度模式训练出现Loss NaN

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 解决方案

此处由用户填写
包含文字方案和最终脚本代码 请将正确的脚本打包并上传附件

干货地址:论坛报错活动第三十八期-使用MindSpore混合精度模式训练出现Loss NaN