- Published on
Weights & Biases(W&B)实验管理实战指南:从实验追踪到 Model Registry 与生产环境监控
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 引言
- W&B 核心功能概览
- 实验追踪(Experiment Tracking)
- Sweeps:超参数优化
- Artifacts:数据与模型版本管理
- Model Registry
- Tables:数据可视化与分析
- Reports:团队协作与共享
- 实验管理工具对比(W&B vs MLflow)
- CI/CD 流水线集成
- 故障排查
- 生产环境检查清单
- 失败案例与应对
- 参考资料
引言
ML 项目中最常见的问题之一,就是"记不清楚到底是哪种超参数组合训练出的模型效果最好"。当学习率、批次大小(batch size)、epoch 数、模型架构变更等实验累积到几百次时,用电子表格或文本文件管理的方式很快就会到达极限。无法复现的实验、丢失的指标、团队成员之间共享实验结果的困难,都会严重拖累 ML 团队的生产力。
Weights & Biases(W&B)是为系统性解决这类 ML 实验管理问题而设计的、以开发者为中心的 MLOps 平台。只需添加几行代码,就能自动追踪所有实验的超参数、指标、系统资源使用情况和模型 checkpoint,并在交互式仪表盘中可视化呈现。截至 2025 年,OpenAI、NVIDIA、Toyota Research 等数千家企业和研究机构都在使用它,并为 PyTorch、TensorFlow、Keras、scikit-learn、Hugging Face Transformers 等主流框架提供原生集成。
本文将结合实战代码示例,讲解 W&B 的核心功能:Experiment Tracking、Sweeps、Artifacts、Model Registry、Tables、Reports。内容不止于基本用法,还会全面覆盖团队协作工作流、CI/CD 流水线集成、生产环境运维注意事项,以及与 MLflow 等竞品工具的对比。
W&B 核心功能概览
W&B 平台由覆盖 ML 实验完整生命周期的多个组件构成。每个组件既可以独立使用,也可以组合起来搭建完整的 MLOps 流水线。
┌─────────────────────────────────────────────────────────────────┐
│ W&B Platform Architecture │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Experiment │ │ Sweeps │ │ Artifacts │ │
│ │ Tracking │──▶│ Hyperparams │──▶│ Data/Model Version │ │
│ │ (wandb.log) │ │ Tuning │ │ Control │ │
│ └──────┬───────┘ └──────────────┘ └──────────┬───────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Tables │ │ Reports │ │ Model Registry │ │
│ │ Data Viz │ │ Team Collab │ │ Production Staging │ │
│ │ Analysis │ │ Sharing │ │ Deployment │ │
│ └──────────────┘ └──────────────┘ └──────────┬───────────┘ │
│ │ │
│ ┌─────────▼──────────┐ │
│ │ W&B Launch / │ │
│ │ Webhooks / CI/CD │ │
│ │ Automation │ │
│ └────────────────────┘ │
│ │
│ Infrastructure: Cloud (SaaS) / Self-Hosted / Dedicated Cloud │
└─────────────────────────────────────────────────────────────────┘
核心组件汇总:
| 组件 | 作用 | 核心 API |
|---|---|---|
| Experiment Tracking | 追踪指标、超参数、系统资源 | wandb.init(), wandb.log() |
| Sweeps | 自动化超参数优化 | wandb.sweep(), wandb.agent() |
| Artifacts | 数据集、模型 checkpoint 版本管理 | wandb.Artifact() |
| Model Registry | 模型版本分阶段管理、生产部署管理 | Registry UI / API |
| Tables | 预测结果可视化、数据分析 | wandb.Table() |
| Reports | 实验结果文档化、团队共享 | Report Editor / SDK |
实验追踪(Experiment Tracking)
实验追踪是 W&B 最基础也是最核心的功能。只需在训练脚本里添加几行代码,所有实验信息就会被自动记录,并可以在云端仪表盘上实时查看。
基本设置与指标记录
import wandb
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
# 1. 初始化 W&B —— 指定项目与实验名称
wandb.init(
project="image-classifier",
name="resnet50-lr0.001-batch32",
config={
"architecture": "ResNet50",
"learning_rate": 0.001,
"batch_size": 32,
"epochs": 100,
"optimizer": "AdamW",
"weight_decay": 1e-4,
"scheduler": "CosineAnnealingLR",
"dataset": "CIFAR-100",
"augmentation": "RandAugment",
},
tags=["baseline", "resnet", "cifar100"],
notes="ResNet50 baseline with CosineAnnealing scheduler",
)
config = wandb.config # 通过 config 对象访问超参数
# 2. 设置模型、优化器、调度器
model = build_model(config.architecture)
optimizer = torch.optim.AdamW(
model.parameters(),
lr=config.learning_rate,
weight_decay=config.weight_decay
)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer, T_max=config.epochs
)
# 3. 在 W&B 中追踪模型梯度(可选)
wandb.watch(model, log="all", log_freq=100)
# 4. 训练循环 —— 记录指标
for epoch in range(config.epochs):
model.train()
train_loss = 0.0
correct = 0
total = 0
for batch_idx, (images, labels) in enumerate(train_loader):
images, labels = images.cuda(), labels.cuda()
outputs = model(images)
loss = criterion(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += loss.item()
_, predicted = outputs.max(1)
total += labels.size(0)
correct += predicted.eq(labels).sum().item()
# 按 batch 记录(可选)
if batch_idx % 50 == 0:
wandb.log({
"batch/loss": loss.item(),
"batch/step": epoch * len(train_loader) + batch_idx,
})
# 按 epoch 记录指标
train_acc = 100.0 * correct / total
val_loss, val_acc = evaluate(model, val_loader)
wandb.log({
"epoch": epoch,
"train/loss": train_loss / len(train_loader),
"train/accuracy": train_acc,
"val/loss": val_loss,
"val/accuracy": val_acc,
"learning_rate": scheduler.get_last_lr()[0],
"gpu/memory_allocated_gb": torch.cuda.memory_allocated() / 1e9,
"gpu/utilization": torch.cuda.utilization(),
})
scheduler.step()
# 保存性能最佳的模型 checkpoint
if val_acc > best_val_acc:
best_val_acc = val_acc
torch.save(model.state_dict(), "best_model.pth")
wandb.save("best_model.pth")
wandb.run.summary["best_val_accuracy"] = best_val_acc
# 5. 结束实验
wandb.finish()
运行上面的代码后,就可以在 W&B 仪表盘上实时查看以下内容:
- 训练/验证损失与准确率曲线:以交互式图表查看逐 epoch 的变化趋势
- 超参数设置:config 中指定的所有值都会被自动记录
- 系统指标:GPU 利用率、内存、CPU、磁盘 I/O 会被自动采集
- 代码版本:Git 提交哈希、diff、运行环境信息会被自动附加
- 模型梯度:通过 wandb.watch() 追踪参数分布与梯度直方图
框架集成
W&B 为主流 ML 框架提供原生集成,只需极少的代码改动就能开始实验追踪。
# Hugging Face Transformers 集成示例
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./results",
report_to="wandb", # 自动接入 W&B
run_name="bert-finetune-v1",
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
metric_for_best_model="eval_f1",
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
compute_metrics=compute_metrics,
)
trainer.train() # 自动将指标记录到 W&B
PyTorch Lightning、Keras、scikit-learn、XGBoost、LightGBM 等大多数框架,都可以用类似的方式,只添加 1-2 行代码即可完成 W&B 集成。
Sweeps:超参数优化
手动调整超参数既耗时,又很容易错过最优组合。W&B Sweeps 支持 Grid Search、Random Search、Bayesian Optimization,并通过基于 Hyperband 的 Early Termination 自动中止低效实验,从而节省 GPU 时间。
Sweep 配置与运行
import wandb
# 1. 定义 Sweep 配置
sweep_config = {
"method": "bayes", # 可选 grid、random、bayes
"metric": {
"name": "val/accuracy",
"goal": "maximize"
},
"parameters": {
"learning_rate": {
"distribution": "log_uniform_values",
"min": 1e-5,
"max": 1e-2,
},
"batch_size": {
"values": [16, 32, 64, 128]
},
"optimizer": {
"values": ["adam", "adamw", "sgd"]
},
"weight_decay": {
"distribution": "log_uniform_values",
"min": 1e-6,
"max": 1e-2,
},
"dropout": {
"distribution": "uniform",
"min": 0.1,
"max": 0.5,
},
"architecture": {
"values": ["resnet18", "resnet34", "resnet50"]
},
},
# Early Termination:自动中止表现较差的实验
"early_terminate": {
"type": "hyperband",
"min_iter": 5, # 至少运行 5 个 epoch 后再评估
"eta": 3, # 只保留排名前 1/3 的实验继续运行
"max_iter": 50,
},
}
# 2. 创建 Sweep
sweep_id = wandb.sweep(
sweep=sweep_config,
project="image-classifier"
)
# 3. 定义训练函数
def train():
wandb.init()
config = wandb.config
model = build_model(config.architecture, dropout=config.dropout)
optimizer = get_optimizer(
config.optimizer, model, config.learning_rate, config.weight_decay
)
for epoch in range(50):
train_loss = train_one_epoch(model, train_loader, optimizer)
val_loss, val_acc = evaluate(model, val_loader)
wandb.log({
"epoch": epoch,
"train/loss": train_loss,
"val/loss": val_loss,
"val/accuracy": val_acc,
})
wandb.finish()
# 4. 运行 Sweep Agent —— 最多执行 50 次实验
wandb.agent(sweep_id, function=train, count=50)
Sweep 并行运行
可以在多个 GPU 或多台机器上并行运行 Sweep Agent,以提高搜索速度。每个 agent 都会从 W&B 服务器获取下一组要尝试的超参数组合,并独立执行。
# 终端 1(GPU 0)
CUDA_VISIBLE_DEVICES=0 wandb agent your-entity/image-classifier/sweep_id
# 终端 2(GPU 1)
CUDA_VISIBLE_DEVICES=1 wandb agent your-entity/image-classifier/sweep_id
# 终端 3(其他机器)
CUDA_VISIBLE_DEVICES=0 wandb agent your-entity/image-classifier/sweep_id
Bayesian Optimization 会基于之前的实验结果选择下一个探索点,因此相比 Random Search,能用更少的实验次数找到最优超参数。在仪表盘上,还可以通过 Parallel Coordinates Plot、Parameter Importance Plot 等图表直观地看出哪个超参数对性能影响最大。
Artifacts:数据与模型版本管理
W&B Artifacts 用于管理数据集、模型 checkpoint、配置文件等的版本,让你能够追踪每次实验中实际使用的数据版本,以及由此生成的模型。重复文件会被自动去重(dedup),从而节省存储空间。
数据集 Artifact 的创建与使用
import wandb
# === 上传数据集 ===
run = wandb.init(project="image-classifier", job_type="data-pipeline")
# 创建 Artifact
dataset_artifact = wandb.Artifact(
name="cifar100-processed",
type="dataset",
description="预处理完成的 CIFAR-100 数据集(已应用归一化、数据增强)",
metadata={
"num_classes": 100,
"train_size": 50000,
"val_size": 10000,
"preprocessing": "normalize_mean_std",
"augmentation": "randaugment_n2_m14",
"source": "torchvision.datasets.CIFAR100",
},
)
# 添加目录或文件
dataset_artifact.add_dir("./data/processed/cifar100")
dataset_artifact.add_file("./data/metadata.json")
# 上传 —— 自动进行 v0、v1、v2… 版本管理
run.log_artifact(dataset_artifact)
run.finish()
# === 训练时下载数据集 ===
run = wandb.init(project="image-classifier", job_type="training")
# 使用特定版本或最新版本
dataset = run.use_artifact("cifar100-processed:latest")
data_dir = dataset.download() # 返回本地缓存路径
# 进行训练...
train_loader = create_dataloader(data_dir, split="train")
# === 保存模型 checkpoint ===
model_artifact = wandb.Artifact(
name="resnet50-cifar100",
type="model",
description="ResNet50 trained on CIFAR-100",
metadata={
"val_accuracy": best_val_acc,
"architecture": "resnet50",
"framework": "pytorch",
"training_run": wandb.run.id,
},
)
model_artifact.add_file("best_model.pth")
model_artifact.add_file("model_config.json")
run.log_artifact(model_artifact)
run.finish()
Artifacts 会自动构建出 DAG(有向无环图,Directed Acyclic Graph)形式的血缘关系(lineage)。某个模型是用哪个数据集训练的、经过了怎样的预处理流水线,都可以在 W&B UI 中直观地追踪到。这对模型审计(auditing)和保障可复现性而言是必不可少的。
Model Registry
W&B Model Registry 是在组织层面管理模型生命周期的中央仓库。可以把各个实验中生成的模型 Artifact 注册到 Registry 中,并以 Staging、Production、Archived 等状态进行管理。借助它,可以明确追踪"当前生产环境中部署的是哪个模型"、"模型是何时、由谁、出于什么原因变更的"等信息。
Registry 工作流
import wandb
# 1. 训练完成后将模型注册到 Registry
run = wandb.init(project="image-classifier", job_type="register-model")
# 引用已有的模型 Artifact
model_artifact = run.use_artifact("resnet50-cifar100:v5")
# 链接到 Registry —— 创建 "Registered Model" 或为已有模型添加新版本
run.link_artifact(
artifact=model_artifact,
target_path="model-registry/image-classifier-prod",
aliases=["candidate", "v2.1.0"],
)
run.finish()
# 2. 生产部署时从 Registry 获取模型
run = wandb.init(project="image-classifier", job_type="deployment")
# 从 Registry 按指定 alias 加载模型
model_artifact = run.use_artifact(
"model-registry/image-classifier-prod:production"
)
model_dir = model_artifact.download()
# 加载并提供模型服务
model = load_model(model_dir)
run.finish()
# 3. 通过 Webhook 实现自动化 —— 响应 Registry 事件
# 可在 W&B UI 中设置,也可通过 API 配置
# 新模型获得 "production" alias 时自动触发部署流水线
Registry 状态管理最佳实践
要在 Registry 中系统化地管理模型状态,建议制定如下的 alias 规则:
- candidate:训练完成、等待评估的模型
- staging:通过评估、正在 staging 环境中测试的模型
- production:当前部署在生产环境中的模型
- archived:不再使用、但需要保留记录的模型
W&B Registry 会自动记录所有状态变更的审计日志(audit log),因此能够满足合规(compliance)与治理(governance)方面的要求。
Tables:数据可视化与分析
W&B Tables 是可以对模型预测结果、数据分布、错误分析等进行交互式可视化与分析的功能。它支持图像、文本、音频等多种媒体类型,并可以通过筛选、排序、分组、计算列等方式来探索数据。
import wandb
run = wandb.init(project="image-classifier", job_type="evaluation")
# 创建预测结果表
columns = ["image", "true_label", "predicted_label", "confidence", "correct"]
prediction_table = wandb.Table(columns=columns)
model.eval()
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images.cuda())
probs = torch.softmax(outputs, dim=1)
confidences, predictions = probs.max(dim=1)
for i in range(len(images)):
is_correct = predictions[i].item() == labels[i].item()
prediction_table.add_data(
wandb.Image(images[i]), # 图像
class_names[labels[i].item()], # 真实标签
class_names[predictions[i].item()], # 预测标签
confidences[i].item(), # 置信度
is_correct, # 是否正确
)
# 记录表格
run.log({"predictions": prediction_table})
# 误分类分析表
error_table = wandb.Table(
columns=["image", "true", "predicted", "confidence", "loss"]
)
# ... 仅筛选误分类样本后添加
run.log({"error_analysis": error_table})
run.finish()
借助 Tables,可以在仪表盘上快速直观地发现"置信度较低的预测"、"某个类别的误分类模式"、"数据集的分布不均衡"等问题。这在分析图像分类、目标检测、NLP 任务中模型的薄弱环节时尤其有用。
Reports:团队协作与共享
W&B Reports 是用于将实验结果文档化并与团队共享的交互式文档工具。可以组合 Markdown 文本、实验图表、代码块、媒体等元素,撰写出可复现的实验报告。
Reports 的主要使用场景如下:
- 周度实验进展汇报:整理本周进行的实验结果与洞察
- 模型对比分析:A/B 测试结果、架构对比等定量分析
- 项目交接:团队成员变更时传递实验历史与结论
- 论文复现实验:分享复现论文结果的实验过程与结果
- 模型评审:生产部署前的模型性能评审文档
Reports 既可以直接在 W&B UI 中撰写,也可以通过 Python SDK 以编程方式生成。共享时可以通过邮件邀请或 Magic Link,将报告分享给没有 W&B 账号的相关方,这对 ML 团队与业务团队之间的沟通十分有效。
团队协作最佳实践
为了实现高效的团队协作,建议遵循以下规则:
1. 项目结构标准化
organization/
├── project-name-research/ # 探索性实验
├── project-name-staging/ # 验证候选部署模型
└── project-name-production/ # 生产环境监控
2. 实验命名规则
{模型架构}-{数据集}-{关键改动}-{日期}
例: resnet50-cifar100-cosine_lr-20260308
3. Tag 体系
- 实验目的:baseline、ablation、architecture-search
- 状态:wip、completed、failed
- 优先级:p0-critical、p1-important、p2-nice-to-have
4. 代码评审联动
在 PR 中附上 W&B Report 链接,营造代码变更与实验结果一并评审的文化。这样就能定量验证"这次代码改动是否真的带来了性能提升"。
实验管理工具对比(W&B vs MLflow)
选择 ML 实验管理工具时,需要综合考虑团队规模、基础设施环境、预算、技术栈。下面来看看主流工具的对比。
| 功能 | W&B | MLflow | Neptune.ai | CometML |
|---|---|---|---|---|
| 部署方式 | SaaS / Self-hosted / Dedicated Cloud | Self-hosted / Databricks Managed | SaaS / Self-hosted | SaaS |
| 是否开源 | 部分开源(服务端不公开) | 完全开源(Apache 2.0) | 不公开 | 不公开 |
| 实验追踪 | 优秀(实时、自动采集系统指标) | 良好(基础功能扎实) | 优秀(大规模可扩展) | 良好 |
| 超参数调优 | 内置 Sweeps(Bayesian、Hyperband) | 需外部集成 Optuna 等 | 集成 Optuna | 内置 |
| 可视化质量 | 最优(交互式仪表盘) | 基础水平 | 优秀 | 良好 |
| 模型注册表 | 内置(基于 alias 的状态管理) | 内置(基于 Stage) | 内置 | 内置 |
| 团队协作 | Reports、评论、共享链接 | 基础水平 | 良好 | 良好 |
| 可扩展性 | 可处理数万个 runs | 大规模时需要运维基础设施 | 10 万+ runs,超大规模 | 中等规模 |
| 框架集成 | PyTorch、TF、HF、Lightning 等 | PyTorch、TF、sklearn 等 | PyTorch、TF 等 | PyTorch、TF 等 |
| 价格(团队) | $50/user/month(Pro) | 免费(OSS) / Databricks 付费 | $49/user/month | $49/user/month |
| 学习曲线 | 低(2 行代码即可开始) | 低-中 | 中 | 低 |
| GPU/系统指标 | 自动采集 | 需手动配置 | 自动采集 | 自动采集 |
选型指南
该选择 W&B 的情况:
- 可视化质量与开发者体验(DX)是首要考量时
- 快速落地和团队协作很重要时
- 需要频繁进行超参数调优时
- 需要与 Hugging Face、PyTorch Lightning 等紧密集成时
该选择 MLflow 的情况:
- 需要避免厂商锁定(vendor lock-in)时
- 完全自托管与数据主权(data sovereignty)是必需项时
- 已经在使用 Databricks 生态时
- 想要零许可成本起步时
该选择 Neptune.ai 的情况:
- 需要管理超大规模实验(10 万+ runs、数百万数据点)时
- Foundation 模型训练等场景需要极限的日志吞吐量时
- 需要以 API 为中心的灵活元数据管理时
CI/CD 流水线集成
将 W&B 集成到 CI/CD 流水线中,可以把从模型训练、评估、注册到 Registry,再到部署的整个过程自动化。
GitHub Actions 集成示例
# .github/workflows/model-training.yml
name: Model Training and Evaluation Pipeline
on:
push:
paths:
- 'src/models/**'
- 'configs/**'
workflow_dispatch:
inputs:
experiment_name:
description: 'Experiment name'
required: true
env:
WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }}
WANDB_PROJECT: image-classifier
WANDB_ENTITY: your-team
jobs:
train:
runs-on: [self-hosted, gpu]
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Train model
run: |
python src/train.py \
--config configs/production.yaml \
--wandb-run-name "ci-${{ github.sha }}"
- name: Evaluate model
run: |
python src/evaluate.py \
--model-artifact "resnet50-cifar100:latest" \
--threshold-accuracy 0.92
- name: Register model to W&B Registry
if: success()
run: |
python src/register_model.py \
--artifact "resnet50-cifar100:latest" \
--registry "image-classifier-prod" \
--alias "candidate"
deploy:
needs: train
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Promote model to production
run: |
python src/promote_model.py \
--registry "image-classifier-prod" \
--from-alias "candidate" \
--to-alias "production"
W&B Webhook 自动化
当 W&B Registry 中的模型状态发生变化时,可以自动触发外部系统。比如,当模型获得 "production" alias 后,自动启动 Kubernetes 部署流水线,或者发送 Slack 通知。
# W&B Webhook 接收服务器示例(FastAPI)
from fastapi import FastAPI, Request
import subprocess
app = FastAPI()
@app.post("/wandb-webhook")
async def handle_wandb_webhook(request: Request):
payload = await request.json()
event_type = payload.get("event_type")
artifact_alias = payload.get("artifact_alias", "")
if event_type == "ADD_ARTIFACT_ALIAS" and "production" in artifact_alias:
# 触发生产部署流水线
artifact_path = payload["artifact_version_string"]
subprocess.run([
"kubectl", "set", "image",
"deployment/model-server",
f"model-server=model-image:{artifact_path}",
])
# Slack 通知
notify_slack(
f"New production model deployed: {artifact_path}"
)
return {"status": "ok"}
故障排查
整理使用 W&B 过程中常见的问题及解决方法。
1. 网络故障导致记录失败
有时会因为企业防火墙或网络不稳定,无法连接到 W&B 服务器。
# 以离线模式运行,之后再同步
import os
os.environ["WANDB_MODE"] = "offline"
wandb.init(project="my-project")
# ... 进行训练 ...
wandb.finish()
# 之后联网时手动同步
# 在终端中运行: wandb sync ./wandb/offline-run-*
2. 大容量 Artifact 上传超时
上传大容量数据集或模型时,可能会发生超时。
# 使用引用型 Artifact —— 不上传实际文件,只记录路径
artifact = wandb.Artifact("large-dataset", type="dataset")
artifact.add_reference(
"s3://my-bucket/datasets/imagenet/", # 支持 S3、GCS、Azure Blob 等
name="imagenet"
)
run.log_artifact(artifact)
3. 内存不足(记录 Table 时)
一次性记录大规模表格,可能会导致内存不足。
# 按批次记录表格
BATCH_SIZE = 1000
table = wandb.Table(columns=["id", "prediction", "label"])
for i in range(0, len(predictions), BATCH_SIZE):
batch = predictions[i:i + BATCH_SIZE]
for pred in batch:
table.add_data(pred["id"], pred["prediction"], pred["label"])
run.log({"predictions": table})
4. Sweep Agent 中断的情况
如果因网络故障等原因导致 Sweep Agent 中断,用同一个 sweep_id 重新启动 agent,就会从中断的地方继续执行。
# 恢复已有的 sweep
wandb agent your-entity/project/existing_sweep_id
5. Self-Hosted 环境下的性能优化
自行托管 W&B Server 时,需要确认以下几点:
- 数据库:建议使用 MySQL 8.0 及以上版本,并配置足够的连接池
- 对象存储:使用 S3 兼容存储(如 MinIO)时,需确认吞吐量限制
- Redis:将 Redis 配置为缓存层,以提升仪表盘的响应速度
- 负载均衡器:并发用户较多时,使用 Nginx/ALB 做负载均衡
生产环境检查清单
整理在生产环境中运维 W&B 时需要确认的各项内容。
安全与访问控制
- 将 API Key 交由环境变量或密钥管理服务(AWS Secrets Manager、Vault 等)管理
- 按团队设置项目访问权限(Admin、Member、Viewer)
- Self-Hosted 部署时应用 TLS/SSL 证书
- 基于 SAML/OIDC 的 SSO 集成(Enterprise 方案)
- 通过 SCIM 以编程方式管理用户/角色
成本管理
W&B 的费用主要取决于 用户数量、存储容量、追踪时长(Tracked Hours):
- Free 方案:5 个模型席位,5GB 存储,适合个人项目
- Pro 方案:$50/user/month,500 追踪小时,100GB 存储,超出部分 $1/hr
- Enterprise:定制报价,提供 Self-hosted 选项、SLA、专属支持
成本优化建议:
- 定期清理不必要的实验数据(可通过 wandb.Api() 自动化)
- 大容量 Artifact 使用 Reference Artifact 方式存放在外部存储中
- Sweep 时积极使用 Early Termination,以减少追踪时长
- 调整系统指标的记录频率(默认 15 秒,可按需延长)
监控与告警
# 配置 W&B Alert —— 检测到训练异常时告警
import wandb
wandb.init(project="production-monitor")
# 训练过程中检测到异常时发送 Slack/Email 通知
if val_loss > threshold:
wandb.alert(
title="Training Anomaly Detected",
text=f"Validation loss ({val_loss:.4f}) exceeded threshold ({threshold})",
level=wandb.AlertLevel.WARN,
)
# 检测 NaN
if torch.isnan(loss):
wandb.alert(
title="NaN Loss Detected",
text="Training diverged - NaN loss detected",
level=wandb.AlertLevel.ERROR,
)
wandb.finish(exit_code=1)
失败案例与应对
案例 1:实验元数据混乱
问题:团队成员各自使用不同的命名规则和标签,导致在数百个实验中很难找到有意义的结果。
应对:在项目初期就把命名规范、必需标签列表、config schema 文档化,并添加了 pre-commit hook 以便在 CI 中校验。同时利用 W&B 的 Group 功能对相关实验分组,并制定团队规则,要求在 Notes 中必须记录实验目的与假设。
案例 2:Artifact 存储容量暴涨
问题:把每个 epoch 的 checkpoint 都保存为 Artifact,导致存储成本骤增到每月数百美元。
应对:调整了 checkpoint 保存策略,只保留性能最好的模型和最近 N 个 checkpoint,其余的自动删除。对于大容量模型,改为通过 Reference Artifact 直接存放在 S3,W&B 中只记录元数据。
# 自动清理旧 Artifact 版本的脚本
import wandb
api = wandb.Api()
artifact_type = api.artifact_type("model", "your-entity/your-project")
for artifact_collection in artifact_type.collections():
versions = artifact_collection.versions()
# 只保留最新 5 个版本
for version in versions[5:]:
if "production" not in version.aliases and "staging" not in version.aliases:
version.delete()
print(f"Deleted: {version.name}")
案例 3:Sweep 无限运行
问题:运行 Bayesian Search Sweep 后没有设置明确的终止条件就放任不管,导致 GPU 资源被浪费。
应对:此后必须通过 count 参数设置最大运行次数,并启用 early_terminate。另外还把 Sweep 开始/结束的通知自动发送到团队 Slack 频道,并搭建了 GPU 使用时长的监控仪表盘。
案例 4:框架版本不一致
问题:某位团队成员环境中训练出的模型,在另一位成员的环境中无法加载。原因是 PyTorch 版本不一致。
应对:编写了一个 wrapper 函数,让 wandb.config 显式记录框架版本、CUDA 版本、主要依赖库版本。同时把 Docker 镜像标签也纳入 config,并把 requirements.txt 一并保存为 Artifact,以保证环境的可复现性。
import sys
import torch
import wandb
def init_wandb_with_env(project, name, config):
"""自动包含环境信息的 wandb.init 包装函数"""
env_config = {
"python_version": sys.version,
"pytorch_version": torch.__version__,
"cuda_version": torch.version.cuda,
"cudnn_version": torch.backends.cudnn.version(),
"gpu_name": torch.cuda.get_device_name(0) if torch.cuda.is_available() else "N/A",
"num_gpus": torch.cuda.device_count(),
}
config.update(env_config)
return wandb.init(
project=project,
name=name,
config=config,
save_code=True, # 自动保存运行的代码
)
参考资料
- Weights & Biases 官方文档 - Experiment Tracking
- Weights & Biases 官方文档 - Sweeps
- Weights & Biases 官方文档 - Registry
- Weights & Biases 官方文档 - Tables
- Weights & Biases 官方文档 - Reports
- Weights & Biases Artifacts
- W&B Pricing
- W&B GitHub Repository
- The 2025 MLOps Landscape: MLflow vs W&B vs Neptune - Uplatz
- Neptune.ai - W&B vs MLflow vs Neptune 对比
- W&B 101 Course
- Harvard Kempner Institute - W&B Sweeps Guide