概述

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 部署,实现训练过程可观测、异常可及时感知,是大模型工程化落地必备组件。

Logo

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

更多推荐