实验追踪工具: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。让我想想,大概流程是这样:
- 去 W&B 官网注册免费账号
- 登录后在 Settings 页面找到 API key
- 在终端跑 wandb login,输入 key 就行了
有同学问能不能离线用?可以。W&B 支持离线模式,跑完后手动同步到服务器:
wandb offline
python train.py
wandb sync
我个人习惯在团队项目里用在线模式,这样大家都能看到最新结果。自己调试小实验时就用离线,跑完了挑好的同步上去。
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 曲线一点点往下走,比干等终端输出有感觉多了。
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" 即可
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,包含实时更新的图表 |
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)
我个人觉得,自动日志适合标准流程,手动日志适合探索性实验。你完全可以两个混用:自动记录基本指标,手动记录你认为重要的中间结果,比如某层的梯度分布。