一、为什么你需要关注W&B的对比分析
搞深度学习的小伙伴都知道,训练模型最头疼的事情不是调代码,而是面对一长串实验记录发呆。今天跑了20组超参数,明天又跑了30组,光看日志文件就能把人看花眼。更烦人的是,明明觉得某个配置好像在哪见过,但就是找不到具体的运行记录。这时候,我们就需要一把好用的“筛子”,帮我们从一堆乱糟糟的实验里快速挑出最顺眼的那个模型配置。
Weights & Biases(简称W&B)就是这把筛子。它不单单是一个记录实验日志的工具,它的对比分析功能能让你像逛淘宝一样,拿多个实验放在一起比,哪个loss低、哪个精度高,一目了然。而且不需要你手动写复杂的SQL查询,全在网页上点点鼠标就能搞定。这篇文章我就带大家一起看看,怎么用W&B的对比分析功能,从成百上千次实验里快速定位最优模型配置。
二、基础准备:安装与配置W&B
2.1 安装wandb库
要使用W&B,首先得在Python环境里装上这个包。打开你的终端,敲下面这行代码就行:
pip install wandb
装好之后,你需要在W&B官网注册一个账号(免费),然后得到一个API Key。第一次运行时会让你登录,按提示输入key就行。你也可以在代码里设置环境变量,避免每次手动输入。
2.2 初始化wandb并记录实验
使用W&B的核心操作就是在训练脚本里初始化一个run,然后把你想记录的指标、超参数、模型权重等都传进去。下面是一个最基础的例子,我们用PyTorch训练一个简单的分类网络,记录训练损失和验证准确率。
import torch
import torch.nn as nn
import torch.optim as optim
import wandb
# 技术栈:Python + PyTorch + W&B
# 初始化W&B run,指定项目名称和配置文件
wandb.init(
project="demo-find-best-model", # 项目名,方便分类
config={ # 记录超参数,方便对比
"learning_rate": 0.001,
"batch_size": 64,
"epochs": 10,
"architecture": "SimpleCNN"
}
)
# 创建一个简单的CNN
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 16, 3)
self.fc = nn.Linear(16*26*26, 10)
def forward(self, x):
x = torch.relu(self.conv1(x))
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
model = SimpleCNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=wandb.config.learning_rate)
# 模拟训练
for epoch in range(wandb.config.epochs):
running_loss = 0.0
for i in range(100): # 假数据循环
inputs = torch.randn(wandb.config.batch_size, 1, 28, 28)
labels = torch.randint(0, 10, (wandb.config.batch_size,))
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
# 关键!记录指标到W&B
avg_loss = running_loss / 100
wandb.log({"train_loss": avg_loss, "epoch": epoch})
# 模拟验证准确率,实际项目中应该是真实验证集
val_acc = 0.8 + epoch * 0.02 # 随便编的
wandb.log({"val_acc": val_acc, "epoch": epoch})
# 结束run
wandb.finish()
注意看,我们在wandb.log里传入了train_loss和val_acc,这些指标后续会被W&B记录下来,并在网页上画成曲线。如果你有多个实验,每个实验都会生成一条曲线,方便对比。
三、海量实验记录的产生:超参数搜索
手动改超参数跑几十次实验太累了,所以一般我们会用自动调参工具。W&B自带一个wandb.sweep功能,可以帮你做随机搜索、贝叶斯搜索等。下面是一个典型的sweep配置。
3.1 使用wandb sweep进行自动调参
首先定义一个sweep配置文件,可以是YAML或字典。我们想搜索学习率、batch size和dropout概率。
# 技术栈:Python + W&B Sweep
# 定义搜索空间
sweep_config = {
"method": "random", # 随机搜索
"parameters": {
"learning_rate": {
"distribution": "log_uniform",
"min": -4, # log10范围,即1e-4到1e-1
"max": -1
},
"batch_size": {
"values": [32, 64, 128, 256]
},
"dropout": {
"distribution": "uniform",
"min": 0.1,
"max": 0.5
}
},
"metric": { # 优化的目标指标
"name": "val_acc",
"goal": "maximize"
}
}
# 初始化sweep,项目名要和训练脚本一致
sweep_id = wandb.sweep(sweep_config, project="demo-find-best-model")
然后在训练脚本里使用wandb.agent来执行一个或多个agent,每个agent负责跑一组超参数。训练脚本需要读取wandb.config中的超参数。
# 技术栈:Python + WandB Agent
import wandb
import torch
import torch.nn as nn
import torch.optim as optim
def train():
# 每个agent运行时会自动获得一组超参数
wandb.init(project="demo-find-best-model")
# 从wandb.config中获取当前参数
lr = wandb.config.learning_rate
batch_size = wandb.config.batch_size
dropout = wandb.config.dropout
# 构建模型,注意dropout传进去
model = nn.Sequential(
nn.Linear(784, 128),
nn.Dropout(dropout),
nn.ReLU(),
nn.Linear(128, 10)
)
optimizer = optim.Adam(model.parameters(), lr=lr)
criterion = nn.CrossEntropyLoss()
# 模拟训练5个epoch
for epoch in range(5):
running_loss = 0.0
for i in range(50):
inputs = torch.randn(batch_size, 784)
labels = torch.randint(0, 10, (batch_size,))
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
avg_loss = running_loss / 50
val_acc = 0.7 + epoch * 0.05 + (dropout < 0.3) * 0.02 # 假装dropout小一点效果更好
wandb.log({"train_loss": avg_loss, "val_acc": val_acc, "epoch": epoch})
wandb.finish()
# 启动agent,指定sweep_id和要运行几次
wandb.agent(sweep_id, function=train, count=20) # 运行20组实验
运行上面的代码后,W&B会自动调度,跑20组不同的参数组合。每跑完一组,你就可以在网页上看到新记录。
四、对比分析功能详解
当你有几十上百个实验记录后,直接在仪表盘上一只只找显然不现实。W&B的对比分析功能就是专门解决这个问题的。
4.1 在W&B UI中查看对比视图
登录W&B网站,进入你的项目。你会看到左侧栏目下的所有run。点击“Compare”按钮,就可以同时选中多个run,然后在一张图里看到它们的指标曲线叠加在一起。比如你想比较所有run的val_acc曲线,选中后直接看图表,那个曲线最高、最平稳的run就是潜在的优胜者。
4.2 使用Grouping和Filtering筛选
有时候我们只想看特定条件下的实验。比如,只关心使用dropout大于0.3的实验。在W&B的搜索框里可以直接写过滤条件,比如dropout:>0.3。还可以按标签、状态(finished/running/failed)过滤。如果你用wandb.sweep,每个自动生成的run都会带上sweep_id和run_id,你可以直接按sweep分组,一次只看当前搜索的那一批。
4.3 并行坐标图 (parallel coordinates) 找出最佳参数组合
这是W&B对比分析里最实用的功能之一。平行坐标图把每个超参数作为一列轴,然后每个run是一条折线,折线的颜色代表目标指标的值。你一眼就能看出,哪些参数区间出来的颜色深(指标高),哪些浅(指标低)。比如下图(其实没有图,你想象一下):学习率在0.0005附近、batch_size在64时,折线全是红色(表示高准确率),那你就知道这个区域是金矿。
不过,平行坐标图适合参数不多的情况(3-8个),如果参数太多会显得凌乱。你可以先通过其他筛选去掉一部分不重要的参数。W&B还支持把超参数分组,比如只展示你关心的几个。
五、实战案例:从100次实验中快速定位最优模型
理论说再多不如上手一只狗。假设我们有一个图像分类任务,跑了100组sweep实验,现在想找到验证准确率最高的那个模型配置。
5.1 定义搜索空间和目标
我们前面已经定义好了sweep配置,目标最大化val_acc。现在运行100次(把上面的count改为100)。
5.2 运行sweep生成实验记录
执行agent后,W&B后台自动创建100个run。跑完后,你登录项目,会看到100条记录。
5.3 使用对比分析筛选
- 第一步:在W&B项目页面,点击“Sweeps”标签,找到你刚刚运行的sweep,系统会自动生成一个对比视图。里面默认按
val_acc排序,前几个就是顶尖选手。 - 第二步:点击“Parallel Coordinates”选项卡,把
learning_rate、batch_size、dropout和val_acc这四个列勾上。你会看到颜色从浅到深,直观看到颜色明亮的折线都是哪些参数组合。 - 第三步:如果你发现某几个参数范围特别突出,比如
learning_rate在0.0005到0.001之间、batch_size在64时全是高准确率,那就可以在筛选框里加上learning_rate:>0.0005, learning_rate:<0.001,再结合batch_size:64,瞬间只显示满足条件的run。 - 第四步:点开最高准确率那个run,看它的详细配置(
config选项卡),记录下具体的超参数值。
5.4 确认最优配置并部署
你也可以通过W&B的API直接获取最好的run的参数,方便你自动化下一步。
# 技术栈:Python + WandB API
import wandb
# 创建API对象
api = wandb.Api()
# 获取项目
project = api.project("demo-find-best-model")
# 获取所有已完成的run列表,按val_acc排序降序
runs = project.runs(order="-summary_metrics.val_acc")
best_run = runs[0] # 第一个就是最好的
# 打印最佳参数
print("最佳run的ID:", best_run.id)
print("超参数:")
for key, value in best_run.config.items():
# 注意:config可能包含一些wandb内部字段,我们只取我们设置的
if key in ["learning_rate", "batch_size", "dropout"]:
print(f" {key}: {value}")
# 查看最佳验证准确率
print("最佳验证准确率:", best_run.summary.get("val_acc", "unknown"))
用这段代码,你就能把最优配置提取出来,然后规划下一次实验或者直接用于生产。注意,如果需要完整的模型权重,你可以在训练时用wandb.save或torch.save存下来。
六、应用场景与技术优缺点
6.1 应用场景
最直接的应用就是机器学习算法的超参数调优。不管是传统的SVM、随机森林,还是深度学习CNN、Transformer,只要你能把参数和指标记录到W&B,对比分析都能帮你省下大量时间。此外,它也非常适合团队协作:多个成员各自跑实验,大家同一个项目下查看对比图,一起讨论哪组参数更优。甚至可以用在模型部署后的监控,对比不同版本模型的表现。
6.2 技术优缺点
优点:
- 可视化非常直观,平行坐标图和叠加曲线图让你一眼看出趋势。
- 不需要写复杂的Python脚本做数据汇总或画图,全在网页上操作。
- 自动记录实验环境(包括代码版本、依赖包、GPU类型),复现实验很方便。
- 支持与Git、Docker等集成,适合生产级MLOps。
缺点:
- 必须联网,不能离线使用(除非你用自托管版本,但配置麻烦)。
- 免费版有项目数、存储空间、并行agent数量的限制。对于小团队足够,但大公司可能需要付费。
- 学习成本还是有的,初学者可能会被各种概念(run、sweep、artifact)吓到,但熟悉后很顺手。
- 如果实验记录过多(比如上万),网页加载和筛选会变慢。
6.3 注意事项
- 在记录超参数时,记得保持命名规范,不要随意起名,否则筛选时会很痛苦。
- 不要将敏感数据(如密码、用户隐私)记录到W&B中,因为默认上传到云端。
- 训练过程中记录指标不要太频繁,比如每次step都log会导致图表点太多,一般每个epoch记录1-2次就够了。
- 使用sweep时,合理设置agent数量,避免一次性占用全部GPU资源导致别人无法使用。
七、文章总结
通过W&B的对比分析功能,我们可以像逛菜市场一样,把一堆实验记录摆在一起挑选。不需要手动导出CSV再画图,也不需要写循环比较代码。学会先用wandb.sweep做自动调参,然后再用平行坐标图或排序功能定位到最优配置,整个过程一气呵成。如果你现在还在手动翻日志文件,不妨试试W&B,说不定会打开新世界的大门。记住,一个好的工具并不会直接帮你提升模型精度,但它能帮你更快地找到通向更高精度的路径。
Comments