Ch21 MLOps修订于 二〇二六年七月二日

21.3 实验管理

概念:为什么实验管理不是”锦上添花”

训练一个机器学习模型不是”写一段代码,跑一次就完事”。你通常会尝试几十甚至上百组不同的配置:学习率从 0.0001 试到 0.1,batch size 从 8 试到 128,LoRA 的 r 值从 4 试到 64。每组配置跑一次训练,产生一个”实验”。

如果没有实验管理系统,你的处境就像一个厨师做了 50 道菜,但没有记下任何一道菜的配方和试吃评价——一周后你完全不记得第 37 道菜为什么比第 12 道好吃。1

实验管理(Experiment Tracking)要解决的核心问题是可复现性(Reproducibility):三个月后,你能否精确复现当时那个效果最好的模型?这需要记录三样东西:

  • 参数(Parameters):训练时用了什么配置(学习率、batch size、模型架构、随机种子)
  • 指标(Metrics):训练结果如何(准确率、损失值、F1 分数、推理速度)
  • 产物(Artifacts):训练生成了什么(模型文件、评估图表、配置文件)

生活比喻:实验管理就像科学家的实验记录本。中学化学课老师要求你记录”用了多少克试剂、加热到多少度、观察到什么现象”——ML 实验管理是完全一样的道理,只是多了代码和自动化。2

教学:MLflow 三行代码入门

MLflow 是目前最流行的开源实验管理工具,由 Databricks 公司开发和维护。它的核心设计哲学是”轻量级”:不需要搭服务器,不需要学新语言,三行 Python 代码就能开始记录实验。

import mlflow

# 记录训练配置(超参数)
mlflow.log_param("learning_rate", 2e-4)
mlflow.log_param("lora_r", 16)
mlflow.log_param("model", "Qwen2.5-7B")

# 记录训练结果(指标)
mlflow.log_metric("accuracy", 0.89)
mlflow.log_metric("f1_score", 0.87)

# 记录训练产物(文件)
mlflow.log_artifact("confusion_matrix.png")
mlflow.log_artifact("config.yaml")

然后终端运行 mlflow ui,浏览器里就能看到所有实验的对比界面——按准确率排序、筛选、可视化。3

MLflow 的实验组织结构:

  • Experiment(实验):一个大的研究方向,比如”情感分类 v2”。你可以把相关的训练都放在同一个 Experiment 下面。
  • Run(运行):一次具体的训练。每个 Run 有自己的参数、指标和产物。
  • Tag(标签):给 Run 打标签,方便搜索。比如 dataset: "production-v3" 或 status: "promising"。

对于更复杂的超参数搜索,MLflow 支持父子 Run 结构:父 Run 是一次超参数搜索任务(比如 Grid Search),下面的每个子 Run 是一组具体参数的训练结果。这样你可以对比”学习率 0.001 的 10 个 batch size 变体”和”学习率 0.01 的 10 个 batch size 变体”之间的系统性差异。4

自动日志:如果你用的是 Scikit-learn、PyTorch、XGBoost 等主流框架,MLflow 支持一行 mlflow.sklearn.autolog() 自动记录几乎所有相关信息——不需要手动写 log_param 和 log_metric。对初学者来说这是最省力的入口。5

工具对比:MLflow vs. Weights & Biases

维度MLflowWeights & Biases (W&B)
类型开源,可自建服务器云服务,有免费层
上手速度需要本地安装和启动注册账号即可用
可视化基础图表高级交互图表
超参数搜索手动对比自动 Sweep(智能搜索)
团队协作需要自己部署共享服务器原生支持团队共享
适用场景个人项目、企业内部部署研究团队、需要高级可视化

选择建议:如果你是个人学习或小团队,MLflow 的本地部署完全够用——不需要任何云服务。如果你的团队超过 5 人且需要实时共享实验进度,W&B 的协作体验更好。两者不是替代关系,很多团队同时使用:MLflow 做本地快速迭代,W&B 做团队大盘展示。6

模型版本管理:从实验到上线

实验管理的终点不是”找到最好的那个实验”——而是把那个实验产出的模型注册、版本化、部署上线。这就是模型注册表(Model Registry)的工作。

生活比喻:模型注册表就像一个餐厅的菜单管理系统。实验阶段相当于厨师在研发新菜(各种配方版本都要记录),注册表阶段相当于把确定下来的菜品正式加入菜单——标注了”当前供应”(Production)、“试营业”(Staging)、“已下架”(Archived)。客人点菜时(API 请求),服务员直接从”当前供应”里调取。7

模型注册表的核心操作:

  • 注册:把实验产出的模型文件注册为命名版本(如 sentiment-classifier v1.0)
  • 标注状态:Staging(待上线测试)、Production(正式服务)、Archived(归档)
  • 版本对比:v1.2 和 v1.3 在相同测试集上的效果对比
  • 快速回退:如果 v1.3 上线后出现问题,一键切回 v1.2

MLflow 内置了模型注册表。你不需要额外工具——从实验记录到模型上线,都在 MLflow 中完成。HuggingFace Hub(详见 Ch10)也提供了类似的模型版本管理功能,而且和 transformers 库无缝集成:model = AutoModel.from_pretrained("yourname/yourmodel") 一行代码就能加载已注册的模型。8

注意事项

不要过度记录。不是所有实验都值得永久保存。一个简单的判断标准:如果你能清楚地回答”这个实验的数据来自哪里、参数是什么、结果怎么样”,就已经够了。记录 50 个指标不如记录 5 个真正重要的指标并写一段文字说明”这次实验的核心发现是什么”。

实验命名是门艺术。run_37 和 test_final_v3_real_final 都是糟糕的名字。好的命名规则:[任务]-[关键变化]-[日期],比如 sentiment-lora_r16-0701。一个月后你看到这个名字,还能大致想起这次实验做了什么。

本地 MLflow 的坑。默认情况下 MLflow 把实验数据存到本地的 mlruns/ 文件夹。如果你换了一台电脑,这些数据不会自动跟着走。如果有团队协作需求,需要部署一个共享的 Tracking Server(MLflow 支持用 MySQL/PostgreSQL 做后端存储,S3 做 artifact 存储)。

模型版本的”语义版本”。给模型版本号不要随便递增。参考语义版本规范:主版本.次版本.补丁(如 v1.2.3)。改动训练数据 → 主版本 +1;改动模型架构或超参数 → 次版本 +1;修复 bug(如数据预处理错误)→ 补丁 +1。这样任何人看到版本号就能大致判断变动的范围。

关联


← 上一节:21.2 MLOps成熟度模型 | 下一节:21.4 小型团队MLOps最低可行方案 →

注释

  1. MLflow, “MLflow Tracking”, https://mlflow.org/docs/latest/tracking.html, 2025 ↩

  2. UW-Madison Data Science, “MLflow 101: Local Experiment Tracking for Beginners”, https://uw-madison-datascience.github.io/ML-X-Nexus/Toolbox/MLOps/mlflow-101.html, 2025 ↩

  3. MLflow, “MLflow Tracking Quickstart”, https://mlflow.org/docs/latest/getting-started/intro-quickstart/index.html, 2025 ↩

  4. MLflow, “Organizing Runs with Experiments”, https://mlflow.org/docs/latest/tracking.html#organizing-runs-in-experiments, 2025 ↩

  5. MLflow, “Automatic Logging”, https://mlflow.org/docs/latest/tracking.html#automatic-logging, 2025 ↩

  6. Databricks, “MLflow vs Weights & Biases”, https://www.databricks.com/blog, 2024 ↩

  7. MLflow, “Model Registry”, https://mlflow.org/docs/latest/model-registry.html, 2025 ↩

  8. HuggingFace, “Model Hub Documentation”, https://huggingface.co/docs/hub/models, 2025 ↩

关联9

知识图谱

局部图谱 · 点节点跳转