第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)  # 不自动保存模型文件
注意: autolog 必须在训练代码之前调用,否则不会生效。另外,如果你同时用了手动记录和 autolog,手动记录的优先级更高,会覆盖 autolog 的同名指标。

3.4 查看 UI 界面:从数据到决策

跑完实验,UI 才是重头戏。MLflow 的 UI 界面主要分三个区域:

  1. 实验列表 — 左侧显示所有实验,每个实验包含多次 run
  2. Run 对比 — 选中多个 run,可以并列查看参数和指标
  3. 单个 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 实验追踪核心流程 手动记录 log_param / log_metric 自动记录 mlflow.autolog() 本地存储 mlruns 目录 Web UI localhost:5000 对比分析 多 Run 并列对比 决策输出 选择最优模型 💡 关键优势 • 零代码侵入 • 自动对比 • 可复现

从图上能看出来,MLflow 的工作流其实就三步:记录 → 存储 → 查看。手动和自动两种方式都能把数据存到 mlruns 目录,然后 UI 统一展示。你不需要关心底层怎么存的,MLflow 全帮你处理好了。

核心要点:

  • 手动记录适合精细控制,自动记录适合快速迭代
  • UI 的对比视图是调参利器,一定要用起来
  • autolog 虽好,但要注意控制 artifact 大小

好了,这一章的内容就到这里。你可以在本地跑一遍上面的代码,看看 UI 里是不是能直接看到对比曲线。相信我,用过一次之后,你就再也回不去手动记日志的日子了。