Machine Learning: MLOps入门与MLflow — ML实验管理与可复现指南
没有实验管理的ML就像没有Git的代码——谁也不知道哪个版本是最好的。
1. 你将学到
- MLOps概念:DevOps在ML领域的延伸,ML生命周期管理
- MLflow四大组件:Tracking/Projects/Models/Model Registry
- 实验跟踪实战:记录参数/指标/模型/图表,对比不同模型版本
- Model Registry:模型阶段管理(Staging→Production),版本回滚
- Bob的实验管理:SalesPredict的50+次实验如何系统化管理
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领域的延伸——不仅关注代码版本,还关注数据版本、实验版本、模型版本。
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管理数据版本。📖 小节
- MLOps = DevOps for ML:管理数据版本、实验版本、模型版本的完整生命周期
- MLflow四大组件:Tracking(记录) + Projects(打包) + Models(格式) + Registry(注册)
- Tracking核心:log_params + log_metrics + log_model,每次实验自动记录
- Model Registry管理模型阶段:None → Staging → Production → Archived
- autolog自动捕获参数/指标/模型,减少手动记录负担
- 实验可复现=参数+数据+随机种子+代码版本全部记录
📝 作业
- 基础题(难度⭐):安装MLflow,启动本地Tracking Server,记录一次实验的参数(lr=0.01)和指标(r2=0.85)。提示:
pip install mlflow+mlflow.start_run()。 - 进阶题(难度⭐⭐):用autolog记录sklearn的RandomForestRegressor训练过程,查询所有run并按R²排序。提示:
mlflow.sklearn.autolog()+search_runs()。 - 挑战题(难度⭐⭐⭐):实现Bob的实验管理框架——对SalesPredict数据跑5种模型,每次自动记录参数/指标/模型到MLflow,注册最佳模型到Registry,加载Production模型做预测。提示:参考第6节批量实验示例。