Machine Learning: MLOps入门与MLflow — ML实验管理与可复现指南

没有实验管理的ML就像没有Git的代码——谁也不知道哪个版本是最好的。

1. 你将学到


2. 一个ML团队负责人的真实故事

(1) 痛点:50次实验后不知道哪个模型最好

Bob在3周内跑了50+次实验——不同算法、不同特征、不同参数。每个实验的参数和结果散落在Jupyter Notebook、Slack消息、便签纸中。产品经理问"当前最好的模型是哪个",Bob花了2小时翻记录还是不确定。实验混乱是ML项目的常态。

(2) MLflow的解法

MLflow自动记录每次实验的参数、指标、模型和图表,所有实验集中可比较、可回溯。

PYTHON
import mlflow

mlflow.set_experiment("SalesPredict-Revenue")
with mlflow.start_run(run_name="xgboost_v1"):
    mlflow.log_params({"n_estimators": 300, "max_depth": 6, "learning_rate": 0.1})
    mlflow.log_metrics({"r2": 0.89, "mae": 8.5})
    mlflow.sklearn.log_model(model, "model")

(3) 收益:2秒找到最佳实验,实验效率提升3倍

Bob用MLflow后,2秒就能找到历史最佳模型,新实验自动对比历史,团队协作效率提升3倍。


3. MLOps概念

(1) ML生命周期管理

MLOps是DevOps在ML领域的延伸——不仅关注代码版本,还关注数据版本、实验版本、模型版本。

100%
graph TB
    DATA[Data Engineering<br/>Version & Pipeline] --> EXP[Experiment<br/>Track & Compare]
    EXP --> REG[Model Registry<br/>Version & Stage]
    REG --> DEPLOY[Deployment<br/>Serve & Scale]
    DEPLOY --> MON[Monitoring<br/>Drift & Performance]
    MON -->|Retrain Trigger| DATA

(2) ML vs 软件工程的差异

维度 软件工程 ML工程
版本管理 代码 代码+数据+模型
测试 单元测试 数据测试+模型测试
部署 一次部署 持续重训练
退化原因 Bug 数据漂移/概念漂移
可复现 代码=结果 代码+数据+参数=结果

4. MLflow四大组件

(1) MLflow Tracking

▶ 示例:记录实验参数和指标

PYTHON
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_absolute_error
from sklearn.model_selection import train_test_split
import numpy as np

mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("SalesPredict-Revenue")

rng = np.random.default_rng(42)
n = 1000
X = rng.uniform(0, 100, (n, 5))
y = 50 + 0.8 * X[:, 0] + 1.2 * X[:, 1] + rng.normal(0, 5, n)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Experiment 1: Random Forest
with mlflow.start_run(run_name="rf_baseline"):
    params = {"n_estimators": 100, "max_depth": 10}
    mlflow.log_params(params)

    model = RandomForestRegressor(**params, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    mlflow.log_metrics({"r2": r2, "mae": mae})
    mlflow.sklearn.log_model(model, "model")

    print(f"RF: R²={r2:.4f}, MAE={mae:.2f}")

# Experiment 2: XGBoost
import xgboost as xgb

with mlflow.start_run(run_name="xgboost_v1"):
    params = {"n_estimators": 300, "max_depth": 6, "learning_rate": 0.1}
    mlflow.log_params(params)

    model = xgb.XGBRegressor(**params, random_state=42)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)

    r2 = r2_score(y_test, y_pred)
    mae = mean_absolute_error(y_test, y_pred)
    mlflow.log_metrics({"r2": r2, "mae": mae})
    mlflow.xgboost.log_model(model, "model")

    print(f"XGB: R²={r2:.4f}, MAE={mae:.2f}")

输出:

TEXT 📖 仅展示
# 执行成功

▶ 示例:查询和对比实验

PYTHON
import mlflow

# Query experiments
experiment = mlflow.get_experiment_by_name("SalesPredict-Revenue")
runs = mlflow.search_runs(experiment_ids=[experiment.experiment_id])

# Sort by R² (best first)
best_runs = runs.sort_values("metrics.r2", ascending=False)
print("Top 3 runs by R²:")
print(best_runs[["run_name", "metrics.r2", "metrics.mae",
                   "params.n_estimators", "params.max_depth"]].head(3))

输出:

TEXT 📖 仅展示
Top 3 runs by R²:

(2) MLflow Models与Registry

▶ 示例:模型注册与阶段管理

PYTHON
import mlflow

# Register a model
model_uri = f"runs:/{run_id}/model"
mlflow.register_model(model_uri, "SalesPredict-Revenue-Model")

# Transition model stage
client = mlflow.tracking.MlflowClient()
client.transition_model_version_stage(
    name="SalesPredict-Revenue-Model",
    version=1,
    stage="Staging",
)

# Promote to Production
client.transition_model_version_stage(
    name="SalesPredict-Revenue-Model",
    version=1,
    stage="Production",
)

# Load production model
model = mlflow.sklearn.load_model("models:/SalesPredict-Revenue-Model/Production")

输出:

TEXT 📖 仅展示
# 执行成功
Registry阶段 含义 典型操作
None 刚注册 自动测试
Staging 待验证 A/B测试
Production 生产使用 在线服务
Archived 已退役 保留记录

5. MLflow Projects与自动日志

▶ 示例:autolog自动记录

PYTHON
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
import numpy as np

# Auto-log: automatically record all parameters, metrics, and model
mlflow.sklearn.autolog()

rng = np.random.default_rng(42)
X = rng.uniform(0, 100, (1000, 5))
y = 50 + 0.8 * X[:, 0] + rng.normal(0, 5, n)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

with mlflow.start_run(run_name="gb_autolog"):
    model = GradientBoostingRegressor(n_estimators=100, max_depth=5, learning_rate=0.1, random_state=42)
    model.fit(X_train, y_train)
    # autolog captures everything automatically!

输出:

TEXT 📖 仅展示
# 执行成功
autolog框架 支持的自动记录
sklearn 参数、指标、模型、混淆矩阵
xgboost 参数、指标、特征重要性
lightgbm 参数、指标、特征重要性
pytorch 参数、指标、模型

▶ 示例:记录自定义图表

PYTHON
import mlflow
import matplotlib.pyplot as plt
import numpy as np

with mlflow.start_run(run_name="feature_analysis"):
    # Create and log a plot
    fig, ax = plt.subplots()
    ax.barh(["feat_1", "feat_2", "feat_3", "feat_4", "feat_5"],
            [0.35, 0.25, 0.15, 0.10, 0.05])
    ax.set_xlabel("Importance")
    ax.set_title("Feature Importance")
    plt.tight_layout()

    mlflow.log_figure(fig, "feature_importance.png")
    plt.close()

    # Log artifacts (any file)
    # mlflow.log_artifact("local_file.csv")

输出:

TEXT 📖 仅展示
# 执行成功

6. Bob的50+实验管理实战

▶ 示例:批量实验跟踪框架

PYTHON
import mlflow
import mlflow.sklearn
import xgboost as xgb
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.model_selection import cross_val_score
from sklearn.metrics import r2_score, mean_absolute_error
import numpy as np

mlflow.set_experiment("SalesPredict-Benchmark")

# Simulated data
rng = np.random.default_rng(42)
X = rng.uniform(0, 100, (2000, 10))
y = 50 + X[:, :5] @ [0.8, 1.2, -0.5, 0.3, 0.1] + rng.normal(0, 5, 2000)

# Systematic experiment tracking
experiments = [
    {"name": "linear_baseline", "model": LinearRegression(), "params": {}},
    {"name": "ridge_alpha1", "model": Ridge(alpha=1), "params": {"alpha": 1}},
    {"name": "rf_100", "model": RandomForestRegressor(n_estimators=100, random_state=42),
     "params": {"n_estimators": 100}},
    {"name": "rf_300", "model": RandomForestRegressor(n_estimators=300, random_state=42),
     "params": {"n_estimators": 300}},
    {"name": "xgb_d6_lr01", "model": xgb.XGBRegressor(max_depth=6, learning_rate=0.1, random_state=42),
     "params": {"max_depth": 6, "learning_rate": 0.1}},
]

for exp in experiments:
    with mlflow.start_run(run_name=exp["name"]):
        mlflow.log_params(exp["params"])
        cv_scores = cross_val_score(exp["model"], X, y, cv=5, scoring="r2")
        mlflow.log_metrics({
            "cv_r2_mean": cv_scores.mean(),
            "cv_r2_std": cv_scores.std(),
        })

# Find best experiment
runs = mlflow.search_runs(
    experiment_ids=[mlflow.get_experiment_by_name("SalesPredict-Benchmark").experiment_id],
    order_by=["metrics.cv_r2_mean DESC"],
)
print("Best experiments:")
print(runs[["run_name", "metrics.cv_r2_mean", "metrics.cv_r2_std"]].head(5))

输出:

TEXT 📖 仅展示
Best experiments:

❓ 常见问题

Q MLflow和Weights & Biases(W&B)该用哪个?
A MLflow开源免费、可自部署、功能全面;W&B可视化更好、团队协作方便、但商业收费。个人/小团队→MLflow,大团队→W&B。
Q MLflow Tracking Server怎么部署?
A 本地开发用mlflow server --backend-store-uri sqlite:///mlflow.db。生产用PostgreSQL+对象存储(S3/GCS)+反向代理。
Q autolog和手动log能混用吗?
A 能。autolog捕获标准信息,手动log补充自定义内容(如业务指标、图表)。推荐:autolog为主,手动补充。
Q Model Registry有必要吗?
A 必须。没有Registry,模型文件散落各处,不知道哪个在生产、哪个是旧版。Registry提供版本管理、阶段管理、回滚能力。
Q 实验太多怎么组织?
A 用experiment分组(如SalesPredict-Revenue/SalesPredict-Churn),用tags标注(如team=bob, priority=high),用run_name区分(如xgboost_v3_tuned)。
Q 如何确保实验可复现?
A MLflow记录参数+代码版本+数据版本+随机种子。加载时用mlflow.sklearn.load_model(run_id)还原完整模型。配合DVC管理数据版本。

📖 小节


📝 作业

  1. 基础题(难度⭐):安装MLflow,启动本地Tracking Server,记录一次实验的参数(lr=0.01)和指标(r2=0.85)。提示:pip install mlflow + mlflow.start_run()
  2. 进阶题(难度⭐⭐):用autolog记录sklearn的RandomForestRegressor训练过程,查询所有run并按R²排序。提示:mlflow.sklearn.autolog() + search_runs()
  3. 挑战题(难度⭐⭐⭐):实现Bob的实验管理框架——对SalesPredict数据跑5种模型,每次自动记录参数/指标/模型到MLflow,注册最佳模型到Registry,加载Production模型做预测。提示:参考第6节批量实验示例。

← 上一课:模型评估与调优 | 下一课:模型部署 →

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏