4. 实验跟踪与记录:使用 MLflow / Weights & Biases 构建可复现实验

在 Champion / Challenger 模型管理流程中,每一次实验的参数、指标和产物都必须被完整记录。没有系统化的实验跟踪,模型迭代将退化为“手动记笔记 + 猜测最佳版本”的低效模式。本章聚焦于两大主流工具——MLflow 和 Weights & Biases (W&B),讲解如何构建可复现的实验记录体系。

4.1 实验跟踪的核心要素

一个完整的实验记录应包含以下三个维度:

维度 内容 示例
参数 (Parameters) 模型超参数、数据路径、预处理配置 learning_rate=0.001, batch_size=64
指标 (Metrics) 训练/验证/测试阶段的量化评估 val_accuracy=0.923, f1_score=0.87
产物 (Artifacts) 模型权重、预处理流水线、可视化图表 model.pkl, confusion_matrix.png
最佳实践: 每次实验都应视为一个不可变的“快照”。即使后续发现参数错误,也应新建实验,而非修改历史记录。这是保证 Champion / Challenger 公平对比的基石。

4.2 MLflow 实战:从记录到复现

MLflow 提供轻量级的 mlflow 库,支持本地或远程 Tracking Server。以下是一个完整的训练脚本示例:

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# 设置实验名称(对应 Champion / Challenger 场景)
mlflow.set_experiment("churn_prediction_v4")

with mlflow.start_run(run_name="challenger_rf_001"):
    # 1. 记录参数
    params = {"n_estimators": 200, "max_depth": 10, "min_samples_split": 5}
    mlflow.log_params(params)

    # 2. 训练模型
    model = RandomForestClassifier(**params)
    model.fit(X_train, y_train)
    preds = model.predict(X_test)
    acc = accuracy_score(y_test, preds)

    # 3. 记录指标
    mlflow.log_metric("test_accuracy", acc)
    mlflow.log_metric("train_samples", X_train.shape[0])

    # 4. 记录模型产物
    mlflow.sklearn.log_model(model, "random_forest_model")

    # 5. 记录附加文件(如特征重要性图)
    mlflow.log_artifact("feature_importance.png")

    print(f"Run ID: {mlflow.active_run().info.run_id}")

通过 MLflow UI(执行 mlflow ui 启动),你可以按实验、运行、参数和指标进行筛选,快速定位最优 Champion 模型。

4.3 Weights & Biases 实战:可视化对比

W&B 在实时可视化和团队协作方面更具优势。其核心概念是 wandb.init() 和 wandb.log():

import wandb

# 初始化一次运行
wandb.init(project="champion_challenger_demo", name="challenger_xgb_002")

# 记录超参数
config = wandb.config
config.learning_rate = 0.01
config.max_depth = 6
config.subsample = 0.8

# 训练循环中记录指标
for epoch in range(10):
    train_loss = train_one_epoch()
    val_acc = evaluate()
    wandb.log({"epoch": epoch, "train_loss": train_loss, "val_accuracy": val_acc})

# 记录模型文件
wandb.save("model.onnx")

# 结束运行
wandb.finish()
关键差异: MLflow 更偏向“记录与复现”,适合本地或私有化部署;W&B 更偏向“实验分析与协作”,适合团队远程查看对比曲线。在 Champion / Challenger 流程中,建议将 MLflow 作为记录主干,W&B 作为分析辅助。

4.4 实验跟踪架构图

下图展示了 Champion / Challenger 实验中,MLflow 与 W&B 如何协同工作:

实验跟踪与记录架构 Champion / Challenger 实验跟踪架构 训练脚本 / 数据流水线 MLflow Tracking Server 参数 / 指标 / 产物 本地文件 / SQLite / 远程 DB Weights & Biases 实时仪表盘 / 对比曲线 云端协作 / 报告分享 MLflow Model Registry Champion / Challenger 版本管理 W&B Reports 实验对比报告 / 决策看板 Champion 决策

4.5 构建可复现实验的检查清单

为确保每次 Champion / Challenger 对比都具备可复现性,请遵循以下步骤:

  1. 固定环境: 使用 conda env export 或 pip freeze 记录依赖,MLflow 支持自动记录 conda.yaml。
  2. 记录数据版本: 在参数中记录数据集的哈希值或 DVC 版本号。
  3. 设置随机种子: 在代码中固定 random.seed(42)、np.random.seed(42) 等,并记录为参数。
  4. 自动记录代码版本: 使用 mlflow.log_param("commit_hash", git_commit) 或 W&B 的自动 Git 集成。
  5. 产物归档: 不仅保存模型,还要保存预处理流水线(如 sklearn.pipeline),确保推理路径一致。
常见陷阱: 仅记录模型权重而忽略预处理步骤,会导致 Champion 模型无法在线上环境复现推理结果。务必使用 mlflow.sklearn.log_model() 或 wandb.save() 保存完整流水线对象。

4.6 工具选型对比

维度 MLflow Weights & Biases
部署方式 本地 / 自托管 / Databricks SaaS 云端 / 私有云(付费)
核心优势 模型注册表、产物管理、开源 实时可视化、超参数搜索、团队协作
学习曲线 低(API 简洁) 中(功能丰富但需适应)
Champion 场景推荐 记录与版本管理主干 实验分析与报告展示