在大语言模型(LLM)训练过程中,训练实时监控与可视化是保障模型收敛、排查性能瓶颈、判断训练有效性的核心手段。MindSpore Transformers 作为昇思生态面向大模型开发的主流套件,内置完善的日志采集、指标追踪机制,可实现loss 值、学习率、耗时、准确率等关键指标的实时曲线图监控,无需依赖复杂第三方平台,即可在训练过程中动态展示数据趋势。

一、训练监控核心价值与 MindSpore Transformers 支持能力

大模型训练具有耗时久、算力消耗大、参数规模大的特点,若缺乏实时监控,极易出现loss 不下降、梯度爆炸、学习率异常、训练震荡等问题,导致训练无效。MindSpore Transformers 原生支持SummaryCollector日志采集、可视化回调、实时数据推送等能力,可将训练过程中的核心指标生成动态曲线图,直观反映模型状态。

监控的核心指标包括:

  1. 训练损失(Train Loss):判断模型是否收敛,正常训练应持续下降并趋于平稳;
  2. 验证损失(Eval Loss):评估模型泛化能力,避免过拟合;
  3. 学习率(Learning Rate):监控调度策略是否正常执行;
  4. 每秒样本数(Speed):监控算力利用率与训练效率;
  5. 梯度范数(Grad Norm):排查梯度消失 / 爆炸问题。

MindSpore Transformers 无需修改训练核心代码,仅需通过回调函数(Callback) 配置,即可将上述指标实时输出为曲线图,支持终端动态打印、Web 可视化、文件持久化三种形式,适配单机训练、分布式训练、多卡训练场景,与 Llama、Qwen、GLM 等主流大模型无缝兼容。

二、实时曲线图监控实现原理

MindSpore Transformers 训练可视化基于MindSpore Summary 机制与自定义 Callback 回调实现。训练过程中,框架每完成一个 step 或 epoch,自动触发回调函数,采集当前指标数据并缓存;同时通过matplotlib、echarts等轻量可视化库,将数据实时渲染为折线曲线图,动态更新展示。

核心流程分为三步:

  1. 指标采集:SummaryCollector 记录 loss、lr、速度等数据,保存为日志文件;
  2. 实时推送:自定义 Callback 在每步训练后读取最新指标,存入时间序列列表;
  3. 曲线图渲染:使用 matplotlib 开启交互模式,实时绘制折线图,自动刷新、保留历史趋势,形成完整监控曲线。

该方案轻量化、无侵入、低性能损耗,不会增加训练算力负担,适合 openEuler + 鲲鹏、昇腾等国产化环境部署。

三、完整实战代码:MindSpore Transformers 训练实时曲线图

以下代码基于 MindSpore Transformers 2.3 版本,实现 LLM 微调训练 +实时动态曲线图监控,包含监控配置、指标采集、可视化绘图全流程,可直接运行。

1. 环境依赖安装

pip install mindspore mindspore-transformers matplotlib numpy

2. 训练实时监控完整代码

import mindspore as ms
import matplotlib.pyplot as plt
import numpy as np
from mindspore_transformers import LlamaForCausalLM, LlamaTokenizer
from mindspore_transformers.trainer import Trainer, TrainingArguments
from mindspore_transformers.peft import LoraConfig, get_peft_model
from mindspore.callbacks import Callback

# 开启matplotlib交互模式,实现实时曲线图更新
plt.ion()
fig, ax = plt.subplots(figsize=(10, 6))
loss_list = []  # 存储loss数据
step_list = []  # 存储step步数
lr_list = []    # 存储学习率

# ===================== 1. 自定义实时监控回调函数(核心) =====================
class TrainMonitorCallback(Callback):
    def __init__(self):
        super().__init__()

    # 每步训练结束后自动调用,采集指标并更新曲线
    def step_end(self, run_context):
        cb_params = run_context.original_args()
        cur_step = cb_params.cur_step_num  # 当前步数
        cur_loss = cb_params.net_outputs   # 当前loss
        cur_lr = cb_params.learning_rate   # 当前学习率

        # 将指标存入列表
        step_list.append(cur_step)
        loss_list.append(float(cur_loss))
        lr_list.append(float(cur_lr))

        # 实时绘制Loss曲线图
        ax.clear()
        ax.plot(step_list, loss_list, label="Train Loss", color="#2E86AB", linewidth=2)
        ax.set_title("MindSpore Transformers 训练实时监控", fontsize=14)
        ax.set_xlabel("训练步数 Step", fontsize=12)
        ax.set_ylabel("损失值 Loss", fontsize=12)
        ax.legend(loc="upper right")
        ax.grid(True, alpha=0.3)
        
        # 自动刷新图像
        plt.draw()
        plt.pause(0.1)

# ===================== 2. 模型与训练参数初始化 =====================
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
model_path = "./llama2_7b"  # 预训练模型路径
tokenizer = LlamaTokenizer.from_pretrained(model_path)

# 加载基础模型
model = LlamaForCausalLM.from_pretrained(
    model_path,
    seq_length=512,
    compute_dtype=ms.float16
)

# LoRA轻量化配置
lora_config = LoraConfig(r=8, lora_alpha=16, lora_dropout=0.05, target_modules=["q_proj"])
model = get_peft_model(model, lora_config)

# 训练参数
train_args = TrainingArguments(
    output_dir="./llama_finetune",
    num_train_epochs=3,
    per_device_train_batch_size=2,
    learning_rate=2e-4,
    logging_steps=1,          # 每1步打印日志
    save_steps=100,
    fp16=True
)

# ===================== 3. 启动训练(带实时监控) =====================
if __name__ == "__main__":
    # 构造虚拟数据集(实际使用时替换为真实数据)
    dummy_dataset = [{"input_ids": np.zeros(512), "labels": np.zeros(512)} for _ in range(100)]
    
    # 初始化Trainer,加入自定义监控回调
    trainer = Trainer(
        model=model,
        args=train_args,
        train_dataset=dummy_dataset,
        callbacks=[TrainMonitorCallback()]  # 注入监控模块
    )
    
    # 开始训练,自动弹出实时曲线图
    trainer.train()
    
    # 训练结束,保存图像
    plt.savefig("./train_loss_curve.png", dpi=300)
    plt.ioff()
    plt.show()

四、代码功能与监控效果说明

上述代码实现开箱即用的训练在线监控系统,核心功能如下:

  1. 自定义 Callback:在每一步训练完成后自动采集 loss、学习率、步数,不侵入训练逻辑;
  2. 实时动态曲线图:使用 matplotlib 交互模式,曲线随训练进度自动刷新;
  3. Loss 曲线可视化:蓝色平滑曲线展示 loss 下降趋势,直观判断模型收敛情况;
  4. 图像持久化:训练完成后自动保存高清曲线图,方便后续复盘;
  5. 轻量化低消耗:监控模块仅占用极低 CPU 资源,不影响 NPU/GPU 训练效率。

运行代码后,会自动弹出可视化窗口,显示实时更新的训练损失曲线。若曲线持续下降,说明模型训练正常;若曲线震荡、上升或保持不变,可及时停止训练调整参数。

五、进阶扩展:多指标同图监控

在基础版本上,可扩展为多指标组合监控,同时展示 Loss、学习率、速度三条曲线:

def update_monitor(self):
    ax.clear()
    ax.plot(step_list, loss_list, label="Loss", color="blue")
    ax.plot(step_list, lr_list, label="Learning Rate", color="orange")
    ax2 = ax.twinx()
    ax2.plot(step_list, speed_list, label="Speed (samples/s)", color="red")
    ax.legend(loc="upper left")
    ax2.legend(loc="upper right")

该扩展可实现一站式观测训练全状态,适合大模型长时间训练场景。

六、总结

MindSpore Transformers 训练在线监控是大模型开发的必备工具,通过实时曲线图可视化,开发者可快速判断训练状态、提前规避异常、提升训练效率。本文提供的代码基于原生 Callback 实现,无需依赖 TensorBoard 等第三方平台,轻量化、易部署、国产化友好,完美适配昇腾、鲲鹏 + openEuler 环境。

通过简单配置,即可实现 loss、学习率、训练速度等指标的动态曲线展示,让大模型训练过程从 “黑盒” 变为 “白盒”,大幅提升训练稳定性与调试效率。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐