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

如何在PyTorch Lightning中从logger提取每个epoch的损失和准确率

提取PyTorch Lightning全量训练日志的三种可行方案

方案1:训练前新增CSVLogger同步记录(操作最简单)

PyTorch Lightning自带CSV日志记录器,和你当前用的TensorBoardLogger可以同时使用,训练过程会自动把所有指标按行写入csv文件,不需要事后解析二进制日志:

from pytorch_lightning.loggers import CSVLogger

# 保留原有TensorBoardLogger,新增CSVLogger
tb_logger = pl.loggers.TensorBoardLogger(name=f'ssl-{lr}-{num_epoch}', save_dir='lightning_logs')
csv_logger = CSVLogger(name=f'ssl-{lr}-{num_epoch}', save_dir='lightning_logs')

trainer = pl.Trainer(progress_bar_refresh_rate=20,
                     gpus=1,
                     max_epochs = max_epoch,
                     logger = [tb_logger, csv_logger], # 传入logger列表即可
                     )

训练完成后,在csv_logger.log_dir路径下可以找到metrics.csv文件,直接用pandas读取就能拿到所有epoch、step的全量指标:

import pandas as pd
df = pd.read_csv("lightning_logs/你的实验目录/metrics.csv")

方案2:已完成训练仅存tfevents日志,直接解析现有文件

不需要重新训练,用TensorBoard自带的日志解析工具就能读取已有的tfevents文件提取全量指标:

该方法需要已安装tensorboard依赖

from tensorboard.backend.event_processing.event_accumulator import EventAccumulator

# 填入trainer.logger.log_dir返回的日志目录下的tfevents文件路径
log_path = "lightning_logs/ssl-xxx-xx/events.out.tfevents.xxxxxx"
event_acc = EventAccumulator(log_path)
event_acc.Reload()

# 查看所有已记录的指标名称
print(event_acc.Tags()['scalars'])
# 输出示例:['train_loss', 'train_acc', 'val_loss', 'val_acc', 'epoch']

# 提取单个指标的全量记录,比如验证集准确率
val_acc_events = event_acc.Scalars('val_acc')
# 转成(step, 指标值)的列表
val_acc_list = [(e.step, e.value) for e in val_acc_events]

方案3:自定义Callback全程记录(灵活度最高)

如果有特殊的记录需求,可以自己实现回调类,在每个epoch结束时自动保存当前指标:

from pytorch_lightning.callbacks import Callback

class FullMetricRecorder(Callback):
    def __init__(self):
        self.full_metrics = []
    
    def on_epoch_end(self, trainer, pl_module):
        # 把当前epoch的指标转成普通数值后存入列表
        epoch_data = {k: v.item() if hasattr(v, 'item') else v for k, v in trainer.logged_metrics.items()}
        self.full_metrics.append(epoch_data)

# 训练时把回调传入Trainer
recorder = FullMetricRecorder()
trainer = pl.Trainer(
    # 其他参数不变
    callbacks=[recorder]
)

# 训练结束直接读取全量指标
print(recorder.full_metrics)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:48:04