实验追踪工具:Weights & Biases

做深度学习实验,最怕什么?我个人觉得,最怕的是「跑完一个模型,结果忘了当时用的什么参数」。你想想看,调了一周的模型,终于看到 loss 往下走了,结果第二天再跑,发现复现不出来。这问题我刚开始做项目时遇到过好多次,后来才明白,缺的不是记忆力,而是一个靠谱的实验追踪工具。

W&B 就是我用了很久的方案。它不是唯一的,但确实是最顺手的一个。说白了,它就是个「实验记账本」——每个训练跑起来,自动帮你记录配置、指标、模型权重,甚至还能看 GPU 利用率。这比自己在 CSV 里手动记参数靠谱多了。

4.1 为什么需要实验追踪?

我先问你一个问题:你训练了 50 个模型,每个跑 80 轮,你手里除了几个 log 文件和一个「好像记得这个模型效果不错」的模糊记忆,还能拿出什么来复现最好的那个?

嗯,答案是几乎没有。这就是实验追踪要解决的问题。它让每个实验都有一张「身份证」,包含:

  • 超参数:学习率、batch size、优化器类型、层数
  • 训练指标:loss、accuracy、F1、训练时间
  • 验证指标:每个 epoch 的验证集结果
  • 代码版本:git commit hash、diff
  • 环境信息:CUDA 版本、Python 版本、依赖包列表
  • 模型产物:权重文件、checkpoint、预测结果
维度手工记录W&B 自动追踪
超参数记录改一次记一次,容易漏自动捕获 all config
指标可视化自己画图,耗时实时生成对比图
模型复现靠文件名和人脑一键恢复实验配置
团队协作传文件、写文档共享报告、直接对比

4.2 W&B 的安装和设置

安装很简单。你直接跑:

pip install wandb

我第一次用的时候,以为装完就能用。结果发现还得注册个账号,拿 API key。让我想想,大概流程是这样:

  1. 去 W&B 官网注册免费账号
  2. 登录后在 Settings 页面找到 API key
  3. 在终端跑 wandb login,输入 key 就行了

有同学问能不能离线用?可以。W&B 支持离线模式,跑完后手动同步到服务器:

wandb offline
python train.py
wandb sync

我个人习惯在团队项目里用在线模式,这样大家都能看到最新结果。自己调试小实验时就用离线,跑完了挑好的同步上去。

小技巧: 如果你在远程服务器上训练,记得 export WANDB_API_KEY=你的key,这样不用每次都 login。我经常在 SSH 里忘记这个,导致实验没记录,教训挺深的。

4.3 核心概念:run、config、metrics

W&B 有三个核心概念,你搞明白它们,基本就上手了。

  • run:一次训练就是一次 run。它有唯一 ID,包含所有记录数据。
  • config:训练的超参数配置。你可以当做 Python 字典来用。
  • metrics:训练过程中记录的指标,比如 loss、accuracy。

怎么用?其实很简单。在你的训练代码里加上几行代码就行:

import wandb

wandb.init(project="my-llm-project", config={
    "learning_rate": 0.001,
    "batch_size": 64,
    "epochs": 10,
    "optimizer": "adamw"
})

config = wandb.config

for epoch in range(config.epochs):
    train_loss = train_one_epoch()
    val_loss = validate()
    wandb.log({"train_loss": train_loss, "val_loss": val_loss})

wandb.finish()

你看,就这几行。wandb.log 每次调用,数据就会实时上传到网页端。你可以在浏览器里看到 loss 曲线一点点往下走,比干等终端输出有感觉多了。

注意: 我见过有人只 log 最后一个 epoch 的指标。这样不好,会丢失整个训练过程的趋势。记得每个 epoch 都记录,哪怕只是打印到终端再 log 一次。

4.4 实验结果分析:从数字到决策

记录完实验,怎么分析?W&B 的网页界面提供了几个核心功能,我简单说说:

  • 对比多个 run:勾选两个实验,指标曲线叠在一起看,哪个效果好一目了然。
  • 超参数重要性分析:W&B 会自动算每个超参数对目标指标的影响度。你想想看,有时候我们以为某个参数重要,实际影响很小,这种事情我遇过好几次。
  • 并行坐标图:适合看多个超参数组合的效果。颜色表示最终指标,一眼就能找到最优区域。

我曾经有个项目,调了一周的模型,结果发现最好的配置是「学习率 1e-4 + 权重衰减 0.01」这个组合。用 W&B 的并行坐标图,五分钟就找到了。嗯,早该用的。

# 在 W&B 中你可以在代码里指定哪些参数要对比
# 网页端会自动生成分析图
wandb.init(project="hyperparam-search")
wandb.config.learning_rate = 0.001
wandb.config.dropout = 0.2
# 跑完多个 run 后,在面板里选 "Parallel Coordinates" 即可
核心逻辑: W&B 不只是记录工具,它的价值在全量实验数据的可搜索、可对比、可分析上。同一个项目里的所有 run,无论谁跑的、什么时候跑的,都能在一个页面里比较。这对团队协作来说,太关键了。

4.5 团队协作与实验管理

一个人调参是孤单的。团队合作时,你需要让大家都能看到最新进展。W&B 的 Reports 功能可以生成可分享的实验报告,支持 Markdown 和动态图表。

# 在代码里创建报告(也可以在网页端操作)
import wandb
api = wandb.Api()
run = api.run("my-project/run-id")
# 然后在网页端创建 Report,引用这个 run 的数据

我建议团队 Leader 每周出一份报告:把本周所有实验的对比图、最佳配置、失败原因写进去。这样知识不会散落在各人的笔记本里。

场景W&B 解决方式
同事问我「你那个最好的模型参数是什么?」直接分享 run 链接,包含所有超参数
想回顾上周跑的 20 个实验结果项目页面按时间排序,批量对比
需要向领导汇报调参进展创建 Report,包含实时更新的图表
避坑指南: 我曾经因为忘记在 wandb.init 里指定 project,结果所有实验都混到默认的「uncategorized」里了。后来找实验找得头大。记住:每个项目都用不同的 project 名,甚至可以按日期子分组,比如 "llm-experiments-2024-11"。

4.6 W&B 与自动日志

除了手动记录,W&B 还支持自动日志。你训练 PyTorch 模型时,可以配合 Lightning 或者自己写 callback:

class WandbCallback:
    def on_epoch_end(self, epoch, logs=None):
        wandb.log({
            "epoch": epoch,
            "loss": logs.get("loss"),
            "accuracy": logs.get("accuracy")
        })

用 Lightning 的话更简单,直接传参数:

from pytorch_lightning.loggers import WandbLogger

wandb_logger = WandbLogger(project="my-project")
trainer = Trainer(logger=wandb_logger)
trainer.fit(model)

我个人觉得,自动日志适合标准流程,手动日志适合探索性实验。你完全可以两个混用:自动记录基本指标,手动记录你认为重要的中间结果,比如某层的梯度分布。

本章知识体系

W&B 实验追踪核心逻辑 W&B 实验追踪 记录阶段 分析阶段 协作阶段 配置 指标 模型权重 对比曲线 超参数分析 并行坐标图 共享报告 团队对比 每个实验都是一次「可复现的探索」