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 如何协同工作:
4.5 构建可复现实验的检查清单
为确保每次 Champion / Challenger 对比都具备可复现性,请遵循以下步骤:
- 固定环境: 使用
conda env export或pip freeze记录依赖,MLflow 支持自动记录conda.yaml。 - 记录数据版本: 在参数中记录数据集的哈希值或 DVC 版本号。
- 设置随机种子: 在代码中固定
random.seed(42)、np.random.seed(42)等,并记录为参数。 - 自动记录代码版本: 使用
mlflow.log_param("commit_hash", git_commit)或 W&B 的自动 Git 集成。 - 产物归档: 不仅保存模型,还要保存预处理流水线(如
sklearn.pipeline),确保推理路径一致。
常见陷阱: 仅记录模型权重而忽略预处理步骤,会导致 Champion 模型无法在线上环境复现推理结果。务必使用
mlflow.sklearn.log_model() 或 wandb.save() 保存完整流水线对象。
4.6 工具选型对比
| 维度 | MLflow | Weights & Biases |
|---|---|---|
| 部署方式 | 本地 / 自托管 / Databricks | SaaS 云端 / 私有云(付费) |
| 核心优势 | 模型注册表、产物管理、开源 | 实时可视化、超参数搜索、团队协作 |
| 学习曲线 | 低(API 简洁) | 中(功能丰富但需适应) |
| Champion 场景推荐 | 记录与版本管理主干 | 实验分析与报告展示 |