第3章 MLflow实战:记录实验参数与指标
说实话,MLflow 是我在团队里推得最顺利的一个工具。为什么?因为它够简单。你不需要改代码结构,不需要学新框架,加两行代码就能把实验管起来。今天我们就动手跑一遍,看看 MLflow 到底怎么用。
3.1 先搭环境:安装与初始化
安装没什么好说的,一行命令搞定:
pip install mlflow
我个人习惯在项目根目录建一个 mlruns 文件夹,用来存所有实验记录。启动 UI 也很直接:
mlflow ui --port 5000
然后浏览器打开 http://localhost:5000,就能看到 MLflow 的界面了。嗯,这里要注意,如果你在远程服务器上跑,记得把 --host 0.0.0.0 加上,不然只能本机访问。
3.2 手动记录:参数、指标、标签
先来最基础的手动记录。我早期做推荐系统实验时,全靠这个方式把几十组超参数对比清楚。
核心就三个 API:
mlflow.log_param()— 记录参数mlflow.log_metric()— 记录指标mlflow.set_tag()— 打标签
看个完整例子:
import mlflow
# 启动一次实验
with mlflow.start_run(run_name="lr_experiment_01"):
# 记录参数
mlflow.log_param("learning_rate", 0.01)
mlflow.log_param("batch_size", 64)
mlflow.log_param("epochs", 10)
# 模拟训练过程,记录指标
for epoch in range(10):
loss = 1.0 / (epoch + 1)
accuracy = 0.5 + epoch * 0.05
mlflow.log_metric("loss", loss, step=epoch)
mlflow.log_metric("accuracy", accuracy, step=epoch)
# 打标签方便筛选
mlflow.set_tag("model_type", "logistic_regression")
mlflow.set_tag("dataset", "cifar10")
跑完之后,去 UI 界面看看。你会看到每次 start_run 都对应一行记录,点进去能看到参数、指标曲线、标签。我曾经犯过一个错——忘记加 step 参数,结果所有指标只保留最后一个值,曲线图全是一条直线。你想想看,排查了半天才发现是 step 没传。
mlflow.log_metric() 时,如果不传 step,默认 step=0,后记录的会覆盖前面的。想画训练曲线,一定要传 step。
3.3 自动记录:mlflow.autolog 真香
手动记录虽然灵活,但代码里到处插 log_metric 也挺烦的。MLflow 提供了 autolog,一行代码自动捕获主流框架的参数和指标。
支持的框架包括:
| 框架 | 自动记录内容 |
|---|---|
| TensorFlow / Keras | 损失、准确率、学习率、模型结构 |
| PyTorch Lightning | 训练/验证损失、梯度范数、学习率 |
| scikit-learn | 模型参数、交叉验证分数、特征重要性 |
| XGBoost / LightGBM | 每轮迭代的评估指标、树的数量 |
| Spark MLlib | Pipeline 参数、评估指标 |
用法简单到离谱:
import mlflow
mlflow.autolog() # 就这一行
# 然后正常训练你的模型
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
model = RandomForestClassifier(n_estimators=100, max_depth=5)
model.fit(X, y)
跑完之后去 UI 看,你会发现 MLflow 自动帮你记录了:
- 所有超参数(n_estimators、max_depth 等)
- 训练集准确率
- 模型文件(artifact)
- 特征重要性图
我在项目中遇到过一个问题:autolog 默认会记录所有东西,有时候模型文件太大(比如深度学习模型几百 MB),导致 UI 加载变慢。我的做法是手动限制一下:
mlflow.autolog(log_models=False) # 不自动保存模型文件
3.4 查看 UI 界面:从数据到决策
跑完实验,UI 才是重头戏。MLflow 的 UI 界面主要分三个区域:
- 实验列表 — 左侧显示所有实验,每个实验包含多次 run
- Run 对比 — 选中多个 run,可以并列查看参数和指标
- 单个 Run 详情 — 参数、指标曲线、标签、artifact 文件
我最常用的功能是「对比视图」。比如我调了 5 组学习率,选中这 5 个 run,UI 会自动生成一张对比表:
| Run 名称 | learning_rate | batch_size | accuracy | loss |
|---|---|---|---|---|
| lr_0.001 | 0.001 | 64 | 0.82 | 0.45 |
| lr_0.01 | 0.01 | 64 | 0.89 | 0.28 |
| lr_0.1 | 0.1 | 64 | 0.91 | 0.22 |
| lr_0.5 | 0.5 | 64 | 0.85 | 0.38 |
| lr_1.0 | 1.0 | 64 | 0.76 | 0.55 |
一眼就能看出 lr=0.1 效果最好。你想想看,要是没有这个对比表,你是不是得自己翻日志、手抄数据、再画 Excel 表格?MLflow 把这些全省了。
3.5 本章知识体系
下面这张图把 MLflow 实验追踪的核心流程串起来了:
从图上能看出来,MLflow 的工作流其实就三步:记录 → 存储 → 查看。手动和自动两种方式都能把数据存到 mlruns 目录,然后 UI 统一展示。你不需要关心底层怎么存的,MLflow 全帮你处理好了。
核心要点:
- 手动记录适合精细控制,自动记录适合快速迭代
- UI 的对比视图是调参利器,一定要用起来
- autolog 虽好,但要注意控制 artifact 大小
好了,这一章的内容就到这里。你可以在本地跑一遍上面的代码,看看 UI 里是不是能直接看到对比曲线。相信我,用过一次之后,你就再也回不去手动记日志的日子了。