Skip to content
Published on

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

分享
Authors
W&B Experiment Management

引言

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&BMLflowNeptune.aiCometML
部署方式SaaS / Self-hosted / Dedicated CloudSelf-hosted / Databricks ManagedSaaS / Self-hostedSaaS
是否开源部分开源(服务端不公开)完全开源(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,  # 自动保存运行的代码
    )

参考资料