You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HuggingFace训练时保存训练与验证损失至列表?

保存训练与验证损失的方法

方法一:利用Trainer默认生成的TensorBoard日志

HuggingFace Trainer会自动在output_dir下的runs目录生成TensorBoard格式的日志文件,里面包含训练损失、验证损失等所有监控指标。你可以通过两种方式提取数据:

1. 直接用TensorBoard查看并导出数据

运行以下命令启动TensorBoard:

tensorboard --logdir codeparrot-ds/runs

在界面中找到损失曲线,点击右上角的下载按钮即可导出CSV格式的数据。

2. 用Python代码读取日志文件

使用tensorboard内置工具读取事件文件,提取损失数据:

import pandas as pd
from tensorboard.backend.event_processing.event_accumulator import EventAccumulator

# 加载日志文件(替换为实际生成的日志文件夹名,通常是日期时间命名)
event_acc = EventAccumulator("codeparrot-ds/runs/20240520-143000")
event_acc.Reload()

# 提取训练损失和验证损失
train_loss = pd.DataFrame(event_acc.Scalars("train_loss"), columns=["step", "wall_time", "value"])
eval_loss = pd.DataFrame(event_acc.Scalars("eval_loss"), columns=["step", "wall_time", "value"])

# 保存为CSV文件
train_loss.to_csv("train_loss.csv", index=False)
eval_loss.to_csv("eval_loss.csv", index=False)

方法二:自定义TrainerCallback手动保存损失

如果需要更灵活的控制(比如实时写入文件),可以自定义回调函数,在训练过程中记录并保存损失:

1. 定义回调类

from transformers import TrainerCallback
import csv

class SaveLossCallback(TrainerCallback):
    def __init__(self, save_path="loss_logs.csv"):
        self.save_path = save_path
        # 初始化CSV表头
        with open(self.save_path, "w", newline="") as f:
            writer = csv.writer(f)
            writer.writerow(["step", "train_loss", "eval_loss"])
        self.current_train_loss = None

    def on_log(self, args, state, control, logs=None, **kwargs):
        # 捕获训练损失(每次logging_steps触发)
        if logs and "loss" in logs:
            self.current_train_loss = logs["loss"]

    def on_evaluate(self, args, state, control, metrics=None, **kwargs):
        # 捕获验证损失并写入文件(每次eval_steps触发)
        if metrics and "eval_loss" in metrics:
            with open(self.save_path, "a", newline="") as f:
                writer = csv.writer(f)
                writer.writerow([state.global_step, self.current_train_loss, metrics["eval_loss"]])

2. 将回调添加到Trainer中

修改你的Trainer初始化代码,加上callbacks参数:

trainer = Trainer(
    model=model,
    tokenizer=tokenizer,
    args=args,
    data_collator=data_collator,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["valid"],
    callbacks=[SaveLossCallback()]  # 加入自定义回调
)

训练过程中,损失数据会实时写入loss_logs.csv,包含步数、训练损失、验证损失三列。

绘制损失曲线

拿到保存的CSV数据后,用matplotlib即可绘制曲线:

import matplotlib.pyplot as plt
import pandas as pd

# 读取损失数据
loss_data = pd.read_csv("loss_logs.csv")

plt.figure(figsize=(10, 6))
plt.plot(loss_data["step"], loss_data["train_loss"], label="训练损失")
plt.plot(loss_data["step"], loss_data["eval_loss"], label="验证损失")
plt.xlabel("训练步数")
plt.ylabel("损失值")
plt.title("训练与验证损失曲线")
plt.legend()
plt.show()

内容的提问来源于stack exchange,提问作者Penguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:28:39