长稳训练loss不一致,前期对齐,后期差异变大
案例:某搜索模型从fp32转bf16之后,前期loss差异不大后期loss跑飞。
图1 loss跑飞


定位方法:由于前期对齐后期跑飞,且跑飞时步数已较大,全程dump数据量多且步数不确定,因此优先采用monitor状态监控工具进行采集。
- 查看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工具代码插入方式 - 采集后可得到每张卡上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收敛正常无跑飞
父主题: msprobe工具定位案例