名称: ml-实验追踪器 描述: 使用MLflow、Weights & Biases和DVC等工具指导机器学习实验日志记录、版本控制和可重复性,以实现系统化模型开发。 许可证: MIT
ML 实验追踪器
这个技能提供系统化机器学习实验的指导,包括适当的追踪、版本控制和可重复性实践。
核心能力
- 实验追踪: MLflow、Weights & Biases (wandb)、Neptune、Comet
- 数据版本控制: DVC、Delta Lake、LakeFS
- 模型注册表: 训练模型的版本控制
- 可重复性: 环境、代码、数据和超参数追踪
实验追踪基础
追踪内容
每个实验应记录:
| 类别 | 项目 | 原因 |
|---|---|---|
| 代码 | Git 提交哈希、分支、差异 | 重现确切的代码状态 |
| 数据 | 数据集版本、哈希、血统 | 了解使用了哪些数据 |
| 环境 | Python 版本、依赖项、硬件 | 重现运行时环境 |
| 超参数 | 所有配置值 | 理解变化之处 |
| 指标 | 损失、准确率、自定义指标 | 比较性能 |
| 产物 | 模型、图表、预测 | 保存输出 |
实验组织
项目/
├── 实验/
│ ├── 基线/ # 初始实验
│ ├── 特征工程/ # 数据改进
│ ├── 架构/ # 模型变化
│ └── 超参数/ # 调优运行
├── 数据/
│ ├── 原始/ # 原始数据(版本化)
│ ├── 处理/ # 清洗数据
│ └── 特征/ # 特征存储
└── 模型/
├── 暂存/ # 候选模型
└── 生产/ # 部署模型
MLflow 模式
基本实验日志记录
import mlflow
# 设置实验(如果不存在则创建)
mlflow.set_experiment("我的分类项目")
with mlflow.start_run(run_name="基线-v1"):
# 记录参数
mlflow.log_param("学习率", 0.01)
mlflow.log_param("批量大小", 32)
mlflow.log_param("轮次", 100)
# 训练循环
for epoch in range(轮次):
train_loss = train_epoch(model, train_loader)
val_loss, val_acc = evaluate(model, val_loader)
# 记录带步数的指标
mlflow.log_metrics({
"训练损失": train_loss,
"验证损失": val_loss,
"验证准确率": val_acc
}, step=epoch)
# 记录模型
mlflow.pytorch.log_model(model, "模型")
# 记录产物(图表、配置)
mlflow.log_artifact("混淆矩阵.png")
mlflow.log_artifact("config.yaml")
模型注册表工作流
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 训练 │───▶│ 暂存 │───▶│ 生产 │
│ 运行 │ │ 审核 │ │ 部署 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
▼ ▼ ▼
候选模型 验证模型 监控模型
阶段:
- 无: 仅记录,未注册
- 暂存: 生产候选
- 生产: 主动服务
- 归档: 历史参考
Weights & Biases 模式
项目结构
import wandb
# 使用配置初始化
config = {
"学习率": 0.01,
"架构": "ResNet50",
"数据集": "imagenet子集",
"轮次": 100
}
run = wandb.init(
project="图像分类",
group="架构实验", # 分组相关运行
tags=["基线", "resnet"],
config=config,
notes="在子集上测试ResNet50基线"
)
# 带自动日志的训练
for epoch in range(config["轮次"]):
metrics = train_and_eval(model, train_loader, val_loader)
wandb.log(metrics)
# 记录媒体
wandb.log({"预测": wandb.Image(pred_grid)})
wandb.log({"混淆矩阵": wandb.plot.confusion_matrix(...)})
wandb.finish()
超参数扫掠
# sweep_config.yaml
program: train.py
method: bayes # 或 grid, random
metric:
name: val_accuracy
goal: maximize
parameters:
learning_rate:
distribution: log_uniform_values
min: 0.0001
max: 0.1
batch_size:
values: [16, 32, 64, 128]
optimizer:
values: ["adam", "sgd", "adamw"]
early_terminate:
type: hyperband
min_iter: 10
DVC 用于数据版本控制
设置和使用
# 在 git 仓库中初始化 DVC
dvc init
# 追踪大文件
dvc add data/training.csv
git add data/training.csv.dvc data/.gitignore
git commit -m "添加训练数据 v1"
# 推送到远程存储
dvc remote add -d storage s3://bucket/dvc
dvc push
# 创建管道
dvc run -n 预处理 \
-d src/preprocess.py -d data/raw \
-o data/processed \
python src/preprocess.py
# 重现管道
dvc repro
DVC 管道定义
# dvc.yaml
stages:
预处理:
cmd: python src/preprocess.py
deps:
- src/preprocess.py
- data/raw/
outs:
- data/processed/
训练:
cmd: python src/train.py
deps:
- src/train.py
- data/processed/
params:
- train.epochs
- train.learning_rate
outs:
- models/model.pkl
metrics:
- metrics.json:
cache: false
可重复性检查清单
代码可重复性
- [ ] 为每个实验固定 git 提交
- [ ] 追踪未提交更改(git diff)
- [ ] 版本控制笔记本(nbstripout)
- [ ] 记录手动步骤
环境可重复性
- [ ] 锁定依赖项(pip freeze、poetry.lock)
- [ ] 指定 Python 版本
- [ ] 记录 CUDA/GPU 要求
- [ ] 使用容器进行完全隔离
数据可重复性
- [ ] 使用 DVC 或类似工具版本化数据集
- [ ] 记录数据收集过程
- [ ] 追踪预处理步骤
- [ ] 保存训练/验证/测试分割索引
训练可重复性
- [ ] 设置随机种子(Python、NumPy、PyTorch/TF)
- [ ] 记录所有超参数
- [ ] 保存模型检查点
- [ ] 记录非确定性操作
最佳实践
命名约定
实验: {项目}-{目标}
运行: {日期}-{描述}-{变体}
模型: {架构}-{数据集}-{版本}
示例:
实验: 欺诈检测-基线
运行: 2024-01-15-xgboost调优-lr001
模型: xgboost-交易-v2.3.1
比较仪表板
为模型比较追踪这些指标:
- 主要指标(优化的内容)
- 次要指标(约束条件)
- 资源使用(训练时间、内存)
- 推理性能(延迟、吞吐量)
实验文档
每个重要实验应记录:
- 假设: 变化和预期结果
- 方法: 实际执行的内容
- 结果: 指标和观察
- 结论: 学到了什么,下一步
参考文献
references/mlflow-setup.md- MLflow 安装和配置references/wandb-patterns.md- 高级 W&B 功能和扫掠references/reproducibility-checklist.md- 详细可重复性指南