大模型预训练、SFT 训练周期长,loss 损失是判断训练收敛、稳定性、是否发生梯度爆炸 / 溢出最核心指标。MindSpore‑Transformers(MindFormers)基于 Callback 回调机制,提供 MFLossMonitor 日志打印、TensorBoard 可视化、梯度范数观测、NaN/INF 异常检测整套 loss 在线监控能力,适配昇腾 NPU 单卡 / 多机多卡混合并行场景。本文从昇腾硬件监控底座、loss 监控核心原理、代码与 yaml 配置示例、训练启动运行、关键调优手段、监控指标对比、常见问题、总结八大维度,讲解大模型训练 loss 全链路在线监控实践,帮助开发者及时识别 loss 抖动、跑飞、不收敛等训练异常。

一、昇腾 loss 监控硬件基础

昇腾 DaVinci AI 处理器与 CANN 为训练监控提供底层支撑,loss 监控指标来源于 Host 侧日志采集与 NPU 设备侧张量回传:

  1. NPU 张量回传:loss、梯度范数 grad‑norm 从 AI Core 计算后回传到 Host 内存,用于指标统计;大模型多并行场景下 loss 经过 HCCL 集合通信做跨 rank 归约得到全局 loss。

  2. 混合精度硬件特性:FP16/BF16 训练存在梯度下溢、溢出风险,loss 容易出现 NaN/INF;监控同时支持 loss‑scale 缩放因子观测。

  3. 多 rank 分布式日志:多机多卡每个 rank 独立输出训练日志,loss 全局值由各 rank 本地 loss 归约得到。

  4. MindSpore Insight 可视化底座:接收 summary 标量数据,在 TensorBoard 看板绘制 loss、lr、grad‑norm 时序曲线。

大模型训练 loss 监控核心观测对象:训练 loss、验证集 loss、梯度范数 grad‑norm、loss‑scale、学习率 lr。 正常训练表现:训练 loss 整体平稳下降;验证 loss 先下降后平稳;grad‑norm 维持合理区间,无持续 NaN。

二、核心监控原理

2.1 监控组件分工

组件

作用

MFLossMonitor

内置回调,控制台打印 step、loss、lr、grad‑norm、吞吐,支持 NaN 检测

SummaryMonitor

收集标量,输出 summary 文件,对接 TensorBoard 可视化看板

monitor_config

细粒度监控开关,开启 local_loss、device_loss、梯度范数采集,适合排错调试

2.2 分布式 loss 计算原理

多卡 DP 数据并行:每个 rank 计算本地 micro‑batch loss,通过 AllReduce 做全局归约,得到全局平均 loss。

注意:张量并行 TP 场景,loss 只在 dp 维度做归约,TP 维度不归约,框架内部已经封装该逻辑,业务无需额外编写通信代码。

2.3 loss 监控完整链路

NPU完成前向‑反向计算 → 回传loss、梯度张量到Host → MFLossMonitor回调on_step_end阶段采集指标 → 控制台打印日志;同时SummaryMonitor写入summary文件 → TensorBoard读取summary绘制loss时序曲线;检测是否出现NaN/INF,触发告警提示。

2.4 loss 异常分类

  1. loss NaN / INF 跑飞:梯度爆炸、数值溢出、loss‑scale 异常;训练直接失效。

  2. loss 剧烈抖动:batch 过小、学习率过大、数据质量差、梯度累积配置不合理。

  3. loss 居高不下不下降:模型、数据集、超参配置错误。

  4. 训练 loss 下降,验证 loss 持续上升:模型过拟合。

三、代码与 yaml 配置实现示例

3.1 训练 yaml 配置(主流方式,MindFormers 推荐)

# llama7b_pretrain.yaml
callbacks:
  - type: MFLossMonitor
    per_print_times: 10          # 每10 step打印一次loss日志
    check_for_nan_in_loss_and_grad: True   # 开启loss、梯度NaN检测
    calculate_per_token_loss: True

tensorboard:
  tensorboard_dir: "./output/tensorboard"
  tensorboard_queue_size: 10
  log_loss_scale_to_tensorboard: True
  log_timers_to_tensorboard: True

monitor_config:
  monitor_on: True
  train_state:
    local_loss: True        # 采集单卡本地loss,用于调试排错
    device_loss: True
    device_norm: True       # 采集梯度范数grad‑norm

3.2 Python 脚本方式,手动注册 loss 监控回调

from mindspore import context
from mindformers import MindFormerConfig, build_trainer
from mindformers.core.callback import MFLossMonitor, SummaryMonitor

def main():
    config = MindFormerConfig("./llama7b_pretrain.yaml")
    context.set_context(device_target="Ascend")

    # 实例化loss打印回调
    loss_monitor = MFLossMonitor(
        per_print_times=10,
        check_for_nan_in_loss_and_grad=True
    )
    summary_monitor = SummaryMonitor(summary_dir="./output/tensorboard")

    # 构建训练器,注入回调
    trainer = build_trainer(config, callbacks=[loss_monitor, summary_monitor])
    trainer.train()

if __name__ == "__main__":
    main()

3.3 简单读取 summary,查看 loss 曲线(调试脚本)

from mindinsight.summary import SummaryReader

def read_loss_from_summary(summary_path):
    reader = SummaryReader(summary_path)
    for event in reader:
        if event.tag == "loss":
            print(f"step:{event.step}, loss:{event.value}")

if __name__ == "__main__":
    read_loss_from_summary("./output/tensorboard")

四、编译与运行

4.1 环境依赖

pip install mindspore mindformers mindinsight
source /usr/local/Ascend/ascend‑toolkit/latest/set_env.sh

4.2 启动大模型训练(msrun 多机多卡)

msrun --worker_num=8 --local_worker_num=8 --master_port=29500 \
llama_pretrain_run.py --config ./llama7b_pretrain.yaml

训练日志样例输出:

step:[  10/10000], loss: 2.4312, grad_norm:1.8621, lr:1.25e‑04, per_step_time:720ms, throughput:8640 tokens/s

4.3 启动 TensorBoard 可视化看板

mindinsight start --summary‑base‑dir ./output/tensorboard --port 8080

浏览器访问 http://127.0.0.1:8080,查看 loss、grad‑norm、lr 时序曲线。

五、关键调优手段

5.1 打印频率 per_print_times 调优

  • 小规模调试:per_print_times=1,每 step 打印;

  • 大规模长周期预训练:设置 10‑50,打印太频繁会增加 Host 侧日志 IO 开销。

5.2 NaN 异常监控与溢出防护

  • 开启check_for_nan_in_loss_and_grad: True,loss / 梯度出现 NaN 时日志告警;

  • FP16 混合精度场景关注loss‑scale指标,scale 持续下降代表频繁发生梯度溢出;

  • 出现 NaN 配合 dump 工具导出张量,定位第一个溢出算子。BF16 训练下溢风险更低,优先大模型使用 BF16。

5.3 分布式 loss 观测调优

  • 多卡异常排查开启local_loss: True,对比各 rank 本地 loss,定位是否单 rank 异常;

  • DP 并行看全局归约 loss;TP 并行 loss 不归约,不要直接对比不同 TP rank 原始 loss。

5.4 TensorBoard 可视化调优

  • 生产训练不要把tensorboard_queue_size设置过大,避免内存堆积;

  • 长周期训练定期备份 summary 目录,防止文件过大;

  • 同时观测训练 loss 与验证 eval_loss,只看训练 loss 无法判断过拟合。

5.5 梯度范数 grad‑norm 指标使用

  • grad‑norm 过大:梯度爆炸,调小学习率,开启梯度裁剪;

  • grad‑norm 持续接近 0:梯度消失,检查激活函数、模型结构、学习率。

5.6 告警与故障排查配合

loss 出现异常,配套使用:

  1. msprof 看 NPU 执行状态;

  2. dump 导出中间张量,定位 NaN 产生算子;

  3. 查看各个 rank 独立 worker 日志,区分全局异常还是单 rank 硬件问题。

六、监控指标对比

测试条件:Llama‑7B 预训练,昇腾 910B 8 卡 DP+TP,BF16

监控配置

效果说明

仅控制台 MFLossMonitor(per_print_times=50)

输出 loss/lr/grad‑norm;无可视化,适合生产长时间训练,IO 开销最小

MFLossMonitor + SummaryMonitor TensorBoard

日志 + 可视化曲线,可回看历史 loss 趋势;会产生 summary 磁盘开销,调试阶段推荐

开启 monitor_config local_loss + device_norm

打印单 rank 本地 loss 与梯度;用于排查多 rank 不一致问题,调试阶段,生产关闭降低开销

说明:生产环境长周期预训练,不建议每 step 打印,避免大量日志占用磁盘 IO;调试阶段完整开启全部监控项定位问题。

七、常见问题与优化建议

  1. loss 出现 NaN / INF 跑飞

    1. 原因:FP16 梯度溢出,学习率过大,输入数据异常,loss‑scale 动态缩放异常。

    2. 方案:切换 BF16;调小学习率;开启梯度裁剪;开启 NaN 检测;使用 dump 定位第一个溢出算子,检查数据集输入。

  2. loss 剧烈来回抖动,不平稳下降

    1. 原因:全局 batch 过小,学习率偏大;数据样本噪声大;梯度累积配置错误。

    2. 方案:调大全局 batch;降低学习率;检查数据集质量;核对 gradient_accumulation_steps 配置。

  3. 控制台可以打印 loss,TensorBoard 看不到 loss 曲线

    1. 原因:summary 目录路径错误;SummaryMonitor 未注册;多进程写 summary 权限问题。

    2. 方案:确认 tensorboard_dir 路径;确认 callback 列表包含 SummaryMonitor;仅 rank0 写 summary 文件。

  4. 多机多卡不同 rank 日志 loss 数值不一致

    1. 原因:打印了 TP 维度本地未归约 loss,不是全局 DP loss;数据分片异常,样本泄露。

    2. 方案:以归约后的全局 loss 为准;排查数据集 num_shards/shard_id 分片逻辑。

  5. 训练 loss 持续下降,但验证集 loss 不降反升

    1. 原因:模型发生过拟合;训练集验证集划分不合理。

    2. 方案:增加验证集评估频率;增加数据集多样性;调整正则、dropout 超参。

八、总结

MindSpore‑Transformers loss 在线监控是一套完整体系:依靠MFLossMonitor做控制台实时日志输出,SummaryMonitor输出 summary 对接 TensorBoard 可视化,配合monitor_config细粒度开关采集本地 loss、梯度范数,支持 NaN/INF 异常告警,适配昇腾 NPU 单卡与 DP+TP+PP 混合并行大模型训练场景。

实际开发建议:调试阶段开启完整监控,观测 loss、grad‑norm、loss‑scale、验证 loss 多维度指标;生产长周期预训练适度降低打印频率,减少日志 IO 开销。loss 出现异常不要只看 loss 本身,结合梯度范数、loss‑scale、各 rank 本地 loss 综合定位溢出、超参、数据集、并行逻辑问题,保障大模型训练收敛稳定。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐