MLflow 入门:从安装到第一次实验追踪

说实话,我第一次接触 MLflow 的时候,心里是有点抵触的。那时候团队里每个人都有自己的实验记录方式——有人用 Excel,有人写 Python 脚本,还有人直接在代码里改文件名。每次复盘实验,都得花半天时间对数据。后来我实在受不了了,才认真研究起 MLflow。结果发现,这东西比我想象中要简单得多。

MLflow 是什么?说白了,它是一个开源平台,专门帮你管理机器学习实验的整个生命周期。从参数记录、指标追踪,到模型打包、部署,它都管。而且它不挑框架——你用 PyTorch、TensorFlow 还是 Scikit-learn,它都能兼容。

核心要点:MLflow 不是某个深度学习框架的附属品,它是一个独立的管理层。你可以在任何 ML 项目里引入它,成本极低。

安装与配置:五分钟上手

安装 MLflow 非常简单。我个人习惯用 pip 直接装:

pip install mlflow

嗯,就这么一行。不过要注意,如果你打算用 MLflow 的 UI 界面查看实验记录,建议同时安装它的前端依赖:

pip install mlflow[extras]

装完之后,验证一下是否成功:

mlflow --version

如果看到版本号,就说明装好了。我记得有一次在 Windows 上装,遇到了编码问题,后来发现是 Python 环境变量没配好。所以如果你在 Windows 上遇到奇怪的问题,先检查一下环境变量。

小提示:建议在虚拟环境里安装 MLflow。我见过太多人因为全局安装导致包冲突,最后不得不重装 Python。用 venv 或 conda 隔离环境,省心很多。

MLflow Tracking 核心 API

MLflow Tracking 是整个工具的核心模块。它的作用就一个——记录实验过程中的所有关键信息。你想想看,做实验的时候,你最关心什么?无非就是三样东西:

  • 参数:你用了哪些超参数?学习率、批量大小、层数……
  • 指标:模型表现如何?准确率、损失值、F1 分数……
  • 产物:模型文件、图表、日志……

MLflow 把这三种信息都管起来了。下面我带你过一遍最常用的三个 API。

mlflow.start_run():开启一次实验

每次实验,你都得先开启一个 Run。你可以把它理解成一个「实验容器」,所有记录都放在这个容器里。

import mlflow

# 开启一次实验
with mlflow.start_run() as run:
    # 你的训练代码
    pass

用 with 语句的好处是,实验结束后会自动关闭 Run。如果你不用 with,记得手动调用 mlflow.end_run()。我刚开始用的时候就经常忘记关,结果后面开的 Run 全乱套了。

注意:如果你在同一个脚本里多次调用 mlflow.start_run() 而没有关闭之前的 Run,MLflow 会报错。要么用 with 语句,要么每次结束后手动 mlflow.end_run()。

mlflow.log_param():记录参数

参数是实验的「输入」。你用了什么学习率?优化器是什么?这些都应该记下来。

with mlflow.start_run():
    mlflow.log_param("learning_rate", 0.001)
    mlflow.log_param("optimizer", "adam")
    mlflow.log_param("batch_size", 64)
    mlflow.log_param("epochs", 50)

参数可以是字符串、数字、布尔值。我个人习惯把模型结构相关的参数也记进去,比如层数、隐藏单元数。这样以后复盘的时候,一眼就能看出实验配置。

mlflow.log_metric():记录指标

指标是实验的「输出」。模型训练过程中的准确率、损失值,这些都得记下来。

with mlflow.start_run():
    # 记录单个指标
    mlflow.log_metric("accuracy", 0.923)
    
    # 记录多个指标
    mlflow.log_metric("loss", 0.045)
    mlflow.log_metric("f1_score", 0.891)

指标可以记录多次。比如你可以在每个 epoch 结束时记录一次损失值,MLflow 会自动保存所有历史值,并在 UI 里画出曲线。

经验之谈:我建议把训练集和验证集的指标分开记录。比如 train_loss 和 val_loss,这样在 UI 里对比起来非常直观。我曾经犯过一个错误——只记录了训练集指标,结果模型过拟合了都没发现。

一个完整的实验追踪示例

光说理论没意思,咱们直接看代码。下面是一个完整的例子,展示如何用 MLflow 追踪一次简单的模型训练:

import mlflow
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.2, random_state=42
)

# 开始实验
with mlflow.start_run():
    # 记录参数
    mlflow.log_param("model_type", "LogisticRegression")
    mlflow.log_param("C", 1.0)
    mlflow.log_param("solver", "lbfgs")
    mlflow.log_param("max_iter", 100)
    
    # 训练模型
    model = LogisticRegression(C=1.0, solver="lbfgs", max_iter=100)
    model.fit(X_train, y_train)
    
    # 预测并计算指标
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    # 记录指标
    mlflow.log_metric("accuracy", accuracy)
    
    # 记录模型
    mlflow.sklearn.log_model(model, "model")

你看,整个流程非常清晰。参数、指标、模型,全都在一个 Run 里记录好了。运行完这段代码,你就可以在 MLflow UI 里看到这次实验的所有信息。

启动 MLflow UI

记录完实验,怎么查看呢?MLflow 自带一个 Web UI,启动方式很简单:

mlflow ui

默认会在 http://localhost:5000 启动。打开浏览器,你就能看到所有实验的列表。每个 Run 的参数、指标、产物都一目了然。

重要:MLflow UI 默认会在当前目录下创建一个 mlruns 文件夹,所有实验数据都存在里面。如果你换了目录启动 UI,是看不到之前实验的。所以建议固定一个工作目录来管理所有实验。

MLflow Tracking 核心流程

为了让你更直观地理解 MLflow Tracking 的工作流程,我画了一张图:

MLflow Tracking 核心流程 start_run() log_param() log_metric() log_model() end_run() mlflow ui → 浏览器查看 开始 记录 结束 查看

这张图把整个流程串起来了。你只需要记住:开始实验 → 记录参数/指标/产物 → 结束实验 → 在 UI 里查看。就这么简单。

参数与指标的对比

很多初学者容易把参数和指标搞混。我整理了一个表格,帮你快速区分:

维度 参数 (Parameter) 指标 (Metric)
含义 实验的输入配置 实验的输出结果
示例 learning_rate=0.001, batch_size=64 accuracy=0.923, loss=0.045
记录时机 训练开始前 训练过程中或结束后
是否可更新 不可更新,一次实验固定 可多次记录,保留历史值
API mlflow.log_param() mlflow.log_metric()

记住这个区别,你在记录实验的时候就不会搞混了。

避坑指南

最后,分享几个我踩过的坑:

  • 参数名不要用中文:MLflow 的 UI 对中文支持不太好,排序和搜索都可能出问题。我建议统一用英文命名。
  • 指标名不要带空格:比如 test accuracy 不如 test_accuracy 好。带空格在 UI 里显示会换行,看着别扭。
  • 不要在一个 Run 里记录太多指标:我曾经在一个 Run 里记录了 100 多个指标,结果 UI 加载慢得要命。建议把不重要的指标放到日志文件里,只把关键指标记录到 MLflow。
  • 注意磁盘空间:MLflow 会把每次实验的数据都存下来。如果你跑了几千次实验,mlruns 文件夹可能会占用几个 GB 的空间。定期清理不需要的实验记录。

曾经踩过的坑:有一次我跑实验的时候,不小心在 start_run() 外面调用了 log_param(),结果数据没记进去,白白浪费了半天时间。记住:所有记录操作必须在 start_run() 和 end_run() 之间执行。

好了,MLflow 入门的内容就这些。你只要掌握了安装、启动 UI、以及三个核心 API,就已经能应付大部分实验追踪场景了。剩下的,就是在实际项目里多用、多练。