昇腾社区首页
中文
注册

长稳训练loss不一致,前期对齐,后期差异变大

在进行工具定位前,请优先排除Checklist检查中的配置项问题和问题复现中的随机性问题。

案例:某搜索模型从fp32转bf16之后,前期loss差异不大后期loss跑飞。

图1 loss跑飞

定位方法:由于前期对齐后期跑飞,且跑飞时步数已较大,全程dump数据量多且步数不确定,因此优先采用monitor状态监控工具进行采集。

  1. 查看grad_norm,跟loss趋势一致。
    倾向于由梯度导致的loss突变,因此用如下配置采集梯度数据,monitor_config.json内容如下:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    {
        "targets": {},
        "wg_distribution": true, 
        "format": "csv",
        "ops": [
            "norm",
            "mean",
            "min",
            "max"
        ]
    }
    

    代码中插入方式如下:

    图2 monitor工具代码插入方式
  2. 采集后可得到每张卡上grad_unreduced-xx-xx.csv和grad_reduced-xx-xx.csv,其中xx为步数。

    查看在360步之后的开始上扬位置的reduce前各层梯度数据,结果如下:

    图3 异常训练用monitor采集的梯度数据

    其中横坐标为反向的层顺序,左边为output,右边为embedding,可看到梯度norm大值在embedding附近,而对比fp32的梯度数据在embedding层上也相对稳定。

    图4 正常训练用monitor采集的梯度数据

    因此重点怀疑embedding层梯度在bf16上相较于fp32存在数值不稳定现象。

解决方案:对embedding的梯度做梯度裁剪

结果:loss收敛正常无跑飞