WandB 模型监控:实验追踪与可视化协作
WandB 模型监控:实验追踪与可视化协作
在机器学习项目中,追踪每一次实验的配置、指标和产出是一场噩梦。Weights & Biases (WandB) 提供了一套轻量级但功能强大的工具,让你只需几行代码就能实现实验追踪、模型监控和团队协作。本教程将带你从零开始,快速掌握 WandB 的核心功能,并应用于实际模型训练监控。
1. 什么是 Weights & Biases (WandB)?
WandB 是一个面向开发者的 MLOps 平台,专注于实验跟踪、数据集版本管理、模型评估和协作可视化。它帮助团队记录每一次训练的超参数、损失曲线、系统资源使用情况,甚至模型梯度分布,所有记录自动同步到云端仪表板,支持实时图表、对比分析和报告生成。
对于初学者,可以把 WandB 理解为:
- 一个自动实验日志:替代手动保存训练记录和手绘曲线。
- 一个共享工作区:团队成员可以实时看到你的实验进展。
- 一个模型体检工具:深入观察梯度、权重和系统瓶颈。
2. 环境准备与安装
2.1 安装 WandB
在终端中使用 pip 安装:
pip install wandb
如果你的项目使用了 PyTorch、TensorFlow、Keras 等主流框架,WandB 提供了开箱即用的集成回调,无需额外安装适配器。
2.2 登录认证
安装完成后,需要将本地环境与你的 WandB 账户关联。
wandb login
执行后会提示输入 API Key。你可以在 wandb.ai/authorize 登录后获取密钥。也可以在代码中通过 wandb.login(key="your-api-key") 来进行验证,但更推荐使用命令行方式避免密钥泄露。
3. 快速上手:第一个实验 Track
我们通过一个经典的 MNIST 训练示例来演示核心工作流。
3.1 初始化实验
在训练脚本开头调用 wandb.init() 即可创建一个实验(Run)。
import wandb
wandb.init(
project="mnist-baseline", # 项目名称
name="exp-01-dropout-0.3", # 本次实验的可读名称
config={ # 超参数配置
"learning_rate": 0.001,
"batch_size": 64,
"epochs": 5,
"dropout": 0.3,
"optimizer": "Adam"
}
)
此时,WandB 会在云端项目中初始化一个空实验,并自动开始记录。
3.2 记录指标
在训练循环中使用 wandb.log() 字典来记录任何你想跟踪的数值。
for epoch in range(epochs):
train_loss = train_one_epoch(...)
val_loss, val_acc = validate(...)
# 记录到 WandB,会自动将 epoch 作为 x 轴
wandb.log({
"train/loss": train_loss,
"val/loss": val_loss,
"val/accuracy": val_acc,
"epoch": epoch
})
wandb.log() 接受一个字典,键可以是包含 / 的分组形式(例如 train/loss),这样在网页仪表板中指标会被自动分组展示。每调用一次会在图表上增加一个数据点,WandB 会自动处理时间步对齐。
3.3 跟踪配置与超参数
wandb.config 会保存你传入的所有超参数,并在 UI 中形成可搜索、可对比的表格。你可以在训练过程中动态更新配置(例如调整学习率调度),使用:
wandb.config.update({"current_lr": 0.0005})
这不会覆盖初始配置,而是追加新字段,完整记录实验轨迹。
4. 高级监控:系统指标与模型梯度
仅记录损失和准确率无法定位训练中的效率瓶颈或梯度爆炸问题。WandB 内置了自动监控能力。
4.1 自动记录系统资源
在 wandb.init() 中设置 log_system_metrics=True,无需额外代码即可自动采集 CPU、GPU 使用率、内存占用、磁盘 I/O 等指标。
wandb.init(
project="resource-monitoring",
settings=wandb.Settings(log_system_metrics=True)
)
采集的指标会以 system.cpu, system.gpu.0.gpu, system.memory 等形式出现在仪表板中,帮助判断是否存在数据加载瓶颈或显存泄漏。
4.2 监控模型梯度与参数
WandB 可以自动记录模型梯度的直方图、参数范数等信息,这对于调试梯度消失/爆炸非常有效。在 PyTorch 中,只需在训练步骤中添加 wandb.watch():
model = MyModel()
wandb.watch(model, log="gradients", log_freq=100)
log 参数可以是 "gradients", "parameters", 或 "all",log_freq 控制每多少批次记录一次。记录的数据会显示在“Gradients”和“Parameters”标签页,方便观察梯度的统计特性。
5. 可视化面板与协作
实验记录的价值在于分析。WandB 的 Web 仪表板提供了丰富的交互方式。
5.1 自定义图表
除了自动生成的标量图,你可以通过编程方式创建自定义图表。例如,在记录时使用自定义 wandb.plot:
wandb.log({
"roc_curve": wandb.plot.roc_curve(y_true, y_probas, labels=class_names)
})
或者将 Matplotlib 图表直接记录:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(...)
wandb.log({"confusion_matrix": wandb.Image(fig)})
plt.close()
所有图表都可以在仪表板中实时缩放、悬停查看数值,以及设为汇总视图。
5.2 报表与团队协作
当多个实验完成后,可以创建报表 (Report),拖拽图表、添加 Markdown 文本,生成可分享的分析文档。报表支持实时嵌入最新实验数据,团队可以评论和协作编辑。
在项目页面中,勾选多个实验,点击“Compare”可以并排对比超参数和指标,快速找出最优配置。
6. 最佳实践:组织实验与版本管理
- 命名规范:使用有意义的实验名,如
resnet50-bs128-lr0.01-augv2,避免自动生成的随机名称。 - 分组与标签:通过
wandb.init(group="baseline-experiments", tags=["final", "production"])对实验分类。 - 代码快照:默认情况下,WandB 会保存启动实验时的代码 Git commit hash 和 diff,并可通过
wandb.log_code()手动附加代码目录,确保实验完全可复现。 - 断点续传:如果训练中断,使用
wandb.init(resume=True)配合id可以继续记录同一个实验,避免数据不连续。 - 本地缓存:所有日志会先写入本地文件夹
wandb/,然后异步同步至云端,即使网络不稳定也不会丢失数据。
7. 总结
WandB 将模型监控从手工记录带到自动化与协作化的水平。通过三步核心操作——init, log, watch,你可以完整追踪实验配置、训练曲线、系统资源和模型内部状态。仪表板的实时可视化和报表功能让团队沟通成本大幅降低。现在就可以将它集成到你的下一个训练任务中,让每一次实验都有迹可循。