MindSpore Transformers 训练在线监控:config.monitor_config 部署实践
概述
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 部署,实现训练过程可观测、异常可及时感知,是大模型工程化落地必备组件。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)