概述
MindSpore Transformers(MindFormers)大模型训练场景中,超长时预训练、分布式微调任务需要实时采集 loss、学习率、算力利用率、梯度、显存 / 昇腾 NPU 内存指标。原生日志打印方式信息分散、无法可视化、难以实时告警。
monitor_config 是 MindFormers 内置统一监控配置模块,无需侵入训练主网络代码,通过配置文件声明监控项,自动实现指标采集、本地日志落盘、推送到可视化平台、异常早停告警,支持单机与昇腾集群分布式训练。
本文围绕config.monitor_config完整落地,提供 yaml 配置、训练启动代码、监控回调扩展、可视化对接示例。
环境:MindSpore 2.3、MindFormers、昇腾 910B、Ascend Toolkit,支持 TensorBoard / 本地 JSON 日志输出。
一、完整训练 yaml 配置(核心 monitor_config)
model: model_type: llama2 model_config: vocab_size: 32000 hidden_size: 4096 num_layers: 32 seq_length: 2048 trainer: epochs: 3 batch_size: 4 learning_rate: 1e-4 sink_size: 2 # ========= 核心监控配置 monitor_config ========= monitor_config: enable: True # 采集间隔:每多少step采集一次指标 interval: 10 # 输出目标:tensorboard / file / stdout 自由组合 output_type: ["stdout", "tensorboard", "json_file"] tensorboard_path: "./output/tensorboard_log" json_log_path: "./output/train_metric.json" # 需要监控的基础指标 monitored_metrics: - loss - learning_rate - grad_norm - train_per_step_time - overflow # 梯度监控开关 grad_monitor: True # NPU硬件指标采集(昇腾平台) device_monitor: True # 异常监控配置:loss爆炸、梯度溢出告警 alert_config: enable_alert: True loss_threshold: 8.0 alert_interval: 50 # 自定义监控回调注册入口 custom_monitor_callback: "custom_monitor.CustomMetricMonitor" runner_config: run_mode: graph device_target: Ascend二、训练启动主代码,加载 monitor_config
import os import mindspore as ms from mindformers import Trainer, MindFormerConfig ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend") def main(): # 加载yaml总配置 config_path = "./train_config.yaml" config = MindFormerConfig(config_path) # 读取monitor配置,可代码动态覆写参数 monitor_cfg = config.monitor_config if monitor_cfg.enable: print(f"训练监控已开启,采集间隔={monitor_cfg.interval} step") # 动态修改监控参数示例:动态关闭梯度监控 # monitor_cfg.grad_monitor = False # 初始化训练器,自动加载monitor回调 trainer = Trainer( config=config, ) # 启动训练,内部自动根据monitor_config构建监控管线 trainer.train() if __name__ == "__main__": os.makedirs("./output", exist_ok=True) main()三、自定义监控回调扩展(对接 monitor_config 注册)
custom_monitor.py
基于 MindFormers 监控基类扩展,实现自定义指标、告警上报、集群日志推送,在 yaml 中通过custom_monitor_callback自动加载。
from mindformers.monitor import BaseMonitor import json import time class CustomMetricMonitor(BaseMonitor): def __init__(self, monitor_config): super().__init__(monitor_config) self.alert_threshold = monitor_config.alert_config.loss_threshold self.log_file = open(monitor_config.json_log_path, "a", encoding="utf-8") def on_train_step_end(self, run_context): """每个step结束触发""" cb_params = run_context.original_args() cur_step = cb_params.cur_step_num loss = float(cb_params.train_loss.asnumpy()) lr = float(cb_params.learning_rate.asnumpy()) metric_data = { "time_stamp": time.time(), "step": cur_step, "loss": loss, "lr": lr } # 写入日志 self.log_file.write(json.dumps(metric_data, ensure_ascii=False)+"\n") self.log_file.flush() # 实现告警逻辑 if loss > self.alert_threshold: print(f"【监控告警】step {cur_step} loss超过阈值!loss={loss:.4f}") # 可扩展:http推送告警到监控平台 def on_train_end(self, run_context): self.log_file.close()四、分布式训练适配(昇腾集群 msrun 启动脚本)
#!/bin/bash export RANK_SIZE=8 export HCCL_CONNECT_TIMEOUT=600 # 分布式场景:每个rank独立监控日志,tensorboard自动聚合 msrun --worker_num=${RANK_SIZE} \ --local_worker_num=${RANK_SIZE} \ python train_main.py重要:分布式训练时monitor_config会自动区分 rank,rank0 汇总主指标,其他 rank 采集硬件负载,避免重复日志刷屏。
五、监控指标读取与离线分析脚本
import json import matplotlib.pyplot as plt def load_metric_log(log_path): steps = [] loss_list = [] with open(log_path,"r",encoding="utf-8") as f: for line in f: data = json.loads(line) steps.append(data["step"]) loss_list.append(data["loss"]) return steps, loss_list if __name__ == "__main__": s, loss = load_metric_log("./output/train_metric.json") plt.plot(s, loss) plt.xlabel("step") plt.ylabel("train loss") plt.savefig("loss_curve.png")六、monitor_config 底层运行机制
MindFormers 初始化 Trainer 时,自动解析monitor_config;
根据output_type自动实例化 StdoutMonitor、TensorBoardMonitor、FileMonitor;
训练回调链路嵌入 StepEnd 钩子,按照interval间隔采集网络输出;
若配置custom_monitor_callback,动态反射加载自定义监控类;
昇腾设备开启device_monitor,周期性调用 Ascend Runtime 接口采集 NPU 利用率、内存占用。
七、工程调优与避坑要点
采集间隔平衡性能
interval不宜过小(如 1),高频指标采集会抢占昇腾算力;预训练推荐 interval=10~20。
大模型梯度监控开销
grad_monitor=True会全局收集梯度范数,超大模型训练有开销,调试阶段开启,正式预训练可按需关闭。
分布式日志冲突
json_file 输出场景,配置中自动为不同 rank 生成metric_rank_x.json,禁止多进程覆盖同一个文件。
TensorBoard 磁盘占用
长期训练定期清理 tensorboard 日志;可在 monitor_config 增加日志滚动策略。
告警机制拓展
原生 alert 仅打印日志,可在自定义 Monitor 中对接 Prometheus、企业微信 / 钉钉告警 webhook。
示例 webhook 扩展片段(嵌入 on_train_step_end):
import requests def send_alert(msg): webhook = "https://xxx/robot/webhook" requests.post(webhook, json={"msg":msg})八、常见问题
监控指标不输出:确认monitor_config.enable: True,yaml 缩进规范;
分布式只有 rank0 打印指标:属于设计策略,如需所有 rank 指标,修改自定义监控逻辑;
TensorBoard 无数据:检查路径权限,确认output_type包含tensorboard;
训练性能下降:调大 interval,关闭不必要的 grad_monitor。
九、总结
MindSpore Transformers 依靠monitor_config实现可配置、非侵入式训练在线监控,统一管控 loss、学习率、梯度、昇腾硬件指标采集、日志输出与告警。相比手动编写 Callback,集中式配置易于维护,单机、昇腾分布式集群无缝兼容。
本文提供完整 yaml 监控配置、训练启动代码、自定义监控回调、集群启动脚本、指标离线分析代码。在 LLaMA、Qwen 等大模型预训练与微调场景,通过标准化 monitor_config 部署,实现训练过程可观测、异常可及时感知,是大模型工程化落地必备组件。