MindSpore‑Transformers 训练在线监控
大模型预训练、SFT 训练周期长,loss 损失是判断训练收敛、稳定性、是否发生梯度爆炸 / 溢出最核心指标。MindSpore‑Transformers(MindFormers)基于 Callback 回调机制,提供 MFLossMonitor 日志打印、TensorBoard 可视化、梯度范数观测、NaN/INF 异常检测整套 loss 在线监控能力,适配昇腾 NPU 单卡 / 多机多卡混合并行场景。本文从昇腾硬件监控底座、loss 监控核心原理、代码与 yaml 配置示例、训练启动运行、关键调优手段、监控指标对比、常见问题、总结八大维度,讲解大模型训练 loss 全链路在线监控实践,帮助开发者及时识别 loss 抖动、跑飞、不收敛等训练异常。
一、昇腾 loss 监控硬件基础
昇腾 DaVinci AI 处理器与 CANN 为训练监控提供底层支撑,loss 监控指标来源于 Host 侧日志采集与 NPU 设备侧张量回传:
-
NPU 张量回传:loss、梯度范数 grad‑norm 从 AI Core 计算后回传到 Host 内存,用于指标统计;大模型多并行场景下 loss 经过 HCCL 集合通信做跨 rank 归约得到全局 loss。
-
混合精度硬件特性:FP16/BF16 训练存在梯度下溢、溢出风险,loss 容易出现 NaN/INF;监控同时支持 loss‑scale 缩放因子观测。
-
多 rank 分布式日志:多机多卡每个 rank 独立输出训练日志,loss 全局值由各 rank 本地 loss 归约得到。
-
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 异常分类
-
loss NaN / INF 跑飞:梯度爆炸、数值溢出、loss‑scale 异常;训练直接失效。
-
loss 剧烈抖动:batch 过小、学习率过大、数据质量差、梯度累积配置不合理。
-
loss 居高不下不下降:模型、数据集、超参配置错误。
-
训练 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 出现异常,配套使用:
-
msprof 看 NPU 执行状态;
-
dump 导出中间张量,定位 NaN 产生算子;
-
查看各个 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;调试阶段完整开启全部监控项定位问题。
七、常见问题与优化建议
-
loss 出现 NaN / INF 跑飞
-
原因:FP16 梯度溢出,学习率过大,输入数据异常,loss‑scale 动态缩放异常。
-
方案:切换 BF16;调小学习率;开启梯度裁剪;开启 NaN 检测;使用 dump 定位第一个溢出算子,检查数据集输入。
-
-
loss 剧烈来回抖动,不平稳下降
-
原因:全局 batch 过小,学习率偏大;数据样本噪声大;梯度累积配置错误。
-
方案:调大全局 batch;降低学习率;检查数据集质量;核对 gradient_accumulation_steps 配置。
-
-
控制台可以打印 loss,TensorBoard 看不到 loss 曲线
-
原因:summary 目录路径错误;SummaryMonitor 未注册;多进程写 summary 权限问题。
-
方案:确认 tensorboard_dir 路径;确认 callback 列表包含 SummaryMonitor;仅 rank0 写 summary 文件。
-
-
多机多卡不同 rank 日志 loss 数值不一致
-
原因:打印了 TP 维度本地未归约 loss,不是全局 DP loss;数据分片异常,样本泄露。
-
方案:以归约后的全局 loss 为准;排查数据集 num_shards/shard_id 分片逻辑。
-
-
训练 loss 持续下降,但验证集 loss 不降反升
-
原因:模型发生过拟合;训练集验证集划分不合理。
-
方案:增加验证集评估频率;增加数据集多样性;调整正则、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 综合定位溢出、超参、数据集、并行逻辑问题,保障大模型训练收敛稳定。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)