MLflow 2026: 追踪 10,000+ 实验的开源 ML 全生命周期平台 — 部署指南
MLflow 在 ML 实验追踪、模型注册表和模型服务方面的完整指南。涵盖设置、Python SDK、生产部署和 10,000+ 实验的基准测试。
- ⭐ 21000
- Apache-2.0
- 更新于 2026-05-19
{{< resource-info >}}
引言: 未追踪实验的混乱 #
一家 B 轮创业公司的数据科学团队在构建推荐模型上投入了三个月。他们尝试了六种不同的架构、四种优化器和数十种超参数组合。当产品经理问"我们应该发布哪个版本?“时,没人能给出确定的答案。表现最好的模型是服务器上的一个 checkpoint 文件,而训练它的工程师在三个 git commit 前就覆盖了训练脚本。
这就是实验可复现性危机。根据 Algorithmia 2024 年对 500 名 ML 从业者的调查,68% 的团队难以复现过去的实验,42% 在不知道确切代码和数据的情况下发布了模型。代价以丢失的模型、重复的工作和生产故障来衡量。
MLflow 于 2018 年在 Databricks 创建并在 Linux Foundation 下开源,通过一个轻量级、框架无关的平台解决了这个问题。截至 2026 年 5 月,MLflow 拥有 约 21,000 个 GitHub Star,MLflow 2.22.0 于 2026 年 4 月发布,被 Microsoft、Toyota、Booking.com 和数千家创业公司使用。
本指南向你展示如何在 5 分钟内设置 MLflow、大规模追踪实验、注册和版本化模型、通过 REST API 提供服务,并将整个堆栈部署到生产环境。如果你需要一台服务器来托管 MLflow 追踪服务器,DigitalOcean 提供简单的 VM 部署,可在几分钟内让你运行起来。
什么是 MLflow? #
MLflow 是一个用于管理机器学习生命周期的开源平台,包括实验追踪、模型打包、模型注册表和模型服务。它以 Python 库、独立服务器或 Docker 容器的形式运行 — 不依赖于 Kubernetes、云提供商或特定的 ML 框架。
与需要基础设施团队设置的重量级 MLOps 平台不同,MLflow 通过 pip install mlflow 安装,一行代码即可开始追踪实验。这种低准入门槛使其成为最广泛采用的开源 ML 生命周期工具,截至 2026 年初在 PyPI 上拥有 超过 2.5 亿次下载。
MLflow 工作原理: 核心组件 #
MLflow 由四个组件组成,分别针对 ML 生命周期的不同阶段:
MLflow Tracking 记录实验、参数、指标和制品。每次实验运行都会捕获代码版本、数据源、配置和结果。追踪服务器将数据存储在后端(SQLite、PostgreSQL、MySQL)中,制品存储在本地文件系统、S3、GCS 或 Azure Blob Storage 中。
MLflow Models 以标准化格式打包模型。保存一次模型,即可在任何地方部署:REST API、批量推理、Apache Spark、Amazon SageMaker、Azure ML 或 Kubernetes。MLflow 支持 scikit-learn、TensorFlow、PyTorch、XGBoost、LightGBM、HuggingFace Transformers 等。
MLflow Model Registry 提供模型生命周期管理的集中存储。注册模型、分配版本号、标记阶段(Staging、Production、Archived),并追踪各版本之间的血缘关系。
MLflow Projects 以可复现的格式打包 ML 代码,并通过 MLproject 文件定义入口点、参数、依赖和执行环境。
# 完整的 MLflow 架构一览:
# 1. Tracking Server (REST API + UI)
# ├── Backend Store: PostgreSQL / MySQL / SQLite
# └── Artifact Store: S3 / GCS / Azure / Local
#
# 2. Tracking Client (Python/R/Java/REST)
# ├── log_param(), log_metric(), log_artifact()
# └── set_tags(), register_model()
#
# 3. Model Registry
# ├── Model Versions (v1, v2, v3...)
# └── Stage Transitions (None → Staging → Production)
#
# 4. Model Serving
# └── REST endpoint: /invocations
安装与设置: 5 分钟内运行你的第一个实验 #
本地设置 (单机) #
# 安装 MLflow
pip install mlflow==2.22.0
# 使用本地文件存储启动追踪服务器
mkdir -p ~/mlflow-tracking
mlflow server \
--backend-store-uri sqlite:///~/mlflow-tracking/mlflow.db \
--default-artifact-root ~/mlflow-tracking/artifacts \
--host 0.0.0.0 \
--port 5000
# 在另一个终端中,运行你的第一个追踪实验
python -c "
import mlflow
mlflow.set_tracking_uri('http://localhost:5000')
mlflow.set_experiment('quick-start')
with mlflow.start_run():
mlflow.log_param('learning_rate', 0.01)
mlflow.log_param('epochs', 10)
mlflow.log_metric('accuracy', 0.94)
mlflow.log_metric('f1_score', 0.93)
print(f'Run ID: {mlflow.active_run().info.run_id}')
"
访问 http://localhost:5000 — 你的实验将出现在 MLflow UI 中,参数、指标和运行历史都被完整追踪。
使用 PostgreSQL 和 S3 的生产环境设置 #
# 安装数据库和云支持
pip install mlflow[extras]==2.22.0 psycopg2-binary boto3
# 使用 PostgreSQL 和 S3 启动追踪服务器
export MLFLOW_S3_ENDPOINT_URL=https://s3.amazonaws.com
export AWS_ACCESS_KEY_ID=your-key
export AWS_SECRET_ACCESS_KEY=your-secret
mlflow server \
--backend-store-uri postgresql://mlflow:password@postgres:5432/mlflowdb \
--default-artifact-root s3://your-bucket/mlflow-artifacts \
--host 0.0.0.0 \
--port 5000
Docker 部署 (推荐用于团队) #
# docker-compose.yml — 完整的 MLflow 堆栈
version: '3.8'
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: mlflow
POSTGRES_PASSWORD: mlflow_password
POSTGRES_DB: mlflowdb
volumes:
- pgdata:/var/lib/postgresql/data
mlflow:
image: python:3.11-slim
command: >
bash -c "pip install mlflow==2.22.0 psycopg2-binary boto3 &&
mlflow server
--backend-store-uri postgresql://mlflow:mlflow_password@postgres:5432/mlflowdb
--default-artifact-root s3://my-bucket/mlflow
--host 0.0.0.0 --port 5000"
ports:
- "5000:5000"
depends_on:
- postgres
volumes:
pgdata:
# 启动完整堆栈
docker-compose up -d
# 验证追踪服务器正在运行
curl http://localhost:5000/api/2.0/mlflow/experiments/list
DigitalOcean Droplet 部署 #
用于专用生产追踪服务器:
# 创建 droplet 并安装 MLflow
ssh root@your-droplet-ip << 'EOF'
apt update && apt install -y python3-pip
pip install mlflow[extras]==2.22.0 psycopg2-binary
# 为 MLflow 创建 systemd 服务
cat > /etc/systemd/system/mlflow.service << 'SERVICEDEF'
[Unit]
Description=MLflow Tracking Server
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/mlflow server --backend-store-uri sqlite:///var/lib/mlflow/mlflow.db --default-artifact-root /var/lib/mlflow/artifacts --host 0.0.0.0 --port 5000
Restart=always
[Install]
WantedBy=multi-user.target
SERVICEDEF
systemctl enable mlflow && systemctl start mlflow
EOF
在 DigitalOcean 上部署 — 获得 200 美元赠金,免费运行你的 MLflow 追踪服务器和实验基础设施两个月。
大规模追踪实验 #
基础实验追踪 #
# tracking_example.py — 使用 MLflow 记录实验
import mlflow
import mlflow.sklearn
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, f1_score
import warnings
warnings.filterwarnings('ignore')
# 设置追踪服务器和实验
mlflow.set_tracking_uri('http://localhost:5000')
mlflow.set_experiment('wine-classification')
def run_experiment(n_estimators, max_depth, min_samples_split):
with mlflow.start_run():
# 记录参数
mlflow.log_param('n_estimators', n_estimators)
mlflow.log_param('max_depth', max_depth)
mlflow.log_param('min_samples_split', min_samples_split)
mlflow.log_param('model_type', 'RandomForest')
# 加载数据并训练
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
clf = RandomForestClassifier(
n_estimators=n_estimators,
max_depth=max_depth,
min_samples_split=min_samples_split,
random_state=42
)
clf.fit(X_train, y_train)
# 评估
predictions = clf.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
f1 = f1_score(y_test, predictions, average='weighted')
# 记录指标
mlflow.log_metric('accuracy', accuracy)
mlflow.log_metric('f1_score', f1)
# 记录模型
mlflow.sklearn.log_model(
clf,
artifact_path='model',
registered_model_name='wine-classifier'
)
print(f'Run completed: accuracy={accuracy:.4f}, f1={f1:.4f}')
# 运行多个实验
if __name__ == '__main__':
configs = [
(50, 5, 0.01),
(100, 10, 0.02),
(200, 15, 0.05),
(300, 20, 0.10),
(500, None, 0.02),
]
for n_est, depth, min_split in configs:
run_experiment(n_est, depth, min_split)
# 运行实验搜索
python tracking_example.py
Autologging: 零工作量追踪 #
# autolog_example.py — scikit-learn 的自动日志记录
import mlflow
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
mlflow.set_tracking_uri('http://localhost:5000')
mlflow.set_experiment('autolog-demo')
# 启用 autologging — 捕获参数、指标、模型、制品
mlflow.sklearn.autolog()
X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
with mlflow.start_run():
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
# 无需手动记录 — autolog 自动捕获所有内容
深度学习实验追踪 #
# pytorch_tracking.py — 使用 MLflow 追踪 PyTorch 训练
import mlflow
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
mlflow.set_tracking_uri('http://localhost:5000')
mlflow.set_experiment('pytorch-cifar10')
# 启用 PyTorch autologging
mlflow.pytorch.autolog()
def train_model(epochs, lr, batch_size):
with mlflow.start_run():
mlflow.log_param('epochs', epochs)
mlflow.log_param('learning_rate', lr)
mlflow.log_param('batch_size', batch_size)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
mlflow.log_param('device', str(device))
# 数据加载
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
train_ds = datasets.CIFAR10('./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_ds, batch_size=batch_size, shuffle=True)
# 简单 CNN 模型
model = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Flatten(), nn.Linear(64 * 8 * 8, 128), nn.ReLU(),
nn.Linear(128, 10)
).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
criterion = nn.CrossEntropyLoss()
# 训练循环
model.train()
for epoch in range(epochs):
total_loss = 0
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
total_loss += loss.item()
avg_loss = total_loss / len(train_loader)
mlflow.log_metric('train_loss', avg_loss, step=epoch)
print(f'Epoch {epoch}: loss={avg_loss:.4f}')
# 记录最终模型
mlflow.pytorch.log_model(model, 'model')
if __name__ == '__main__':
train_model(epochs=5, lr=0.001, batch_size=64)
模型注册表: 管理模型生命周期 #
# registry_example.py — 管理模型版本和阶段
import mlflow
from mlflow.tracking import MlflowClient
client = MlflowClient(tracking_uri='http://localhost:5000')
model_name = 'wine-classifier'
# 注册新的模型版本
result = mlflow.register_model(
model_uri='runs:/<RUN_ID>/model',
name=model_name
)
print(f'Registered version: {result.version}')
# 将版本转换为 Staging
client.transition_model_version_stage(
name=model_name,
version=result.version,
stage='Staging'
)
# 添加版本描述
client.update_model_version(
name=model_name,
version=result.version,
description='Wine classifier with 94.4% accuracy, RandomForest 200 estimators'
)
# 设置版本标签
client.set_model_version_tag(
name=model_name,
version=result.version,
key='reviewed_by',
value='ml-lead@company.com'
)
# 列出模型的所有版本
mlflow models list-versions -m wine-classifier
# 预期输出:
# Version Stage Description
# 1 Production Initial production model
# 2 Staging Wine classifier with 94.4% accuracy...
# 3 None Experimental architecture
# 加载特定模型版本进行推理
import mlflow.pyfunc
model = mlflow.pyfunc.load_model(
model_uri='models:/wine-classifier/Production'
)
# 或通过版本号加载
model_v2 = mlflow.pyfunc.load_model(
model_uri='models:/wine-classifier/2'
)
模型服务: 通过 REST API 部署 #
# 使用 MLflow 内置服务器在本地提供服务
mlflow models serve \
-m models:/wine-classifier/Production \
-p 5001 \
--env-manager local
# 测试端点
curl -X POST http://localhost:5001/invocations \
-H "Content-Type: application/json" \
-d '{
"inputs": [
[14.23, 1.71, 2.43, 15.6, 127.0, 2.80, 3.06, 0.28, 2.29, 5.64, 1.04, 3.92, 1065.0],
[12.37, 1.07, 2.10, 18.5, 88.0, 3.52, 3.75, 0.24, 1.95, 4.50, 1.04, 2.77, 660.0]
]
}'
# 响应: {"predictions": [0, 1]}
使用 Docker 进行生产服务 #
# 为模型构建 Docker 镜像
mlflow models build-docker \
-m models:/wine-classifier/Production \
-n wine-classifier-serving:v1.0 \
--enable-mlserver
# 运行服务容器
docker run -p 5001:8080 wine-classifier-serving:v1.0
# 测试
curl -X POST http://localhost:5001/invocations \
-H "Content-Type: application/json" \
-d '{"inputs": [[14.23, 1.71, 2.43, 15.6, 127.0, 2.80, 3.06, 0.28, 2.29, 5.64, 1.04, 3.92, 1065.0]]}'
使用 MLflow 部署到云端 #
# deploy_sagemaker.py — 部署到 AWS SageMaker
import mlflow.sagemaker
mlflow.sagemaker.deploy(
app_name='wine-classifier-prod',
model_uri='models:/wine-classifier/Production',
execution_role_arn='arn:aws:iam::123456789:role/SageMakerRole',
instance_type='ml.m5.large',
region_name='us-east-1'
)
# deploy_azure.py — 部署到 Azure ML
from azureml.core import Workspace
import mlflow.azureml
ws = Workspace.from_config()
mlflow.azureml.deploy(
model_uri='models:/wine-classifier/Production',
workspace=ws,
deployment_config={
'computeType': 'aci',
'containerResourceRequirements': {'cpu': 1, 'memoryInGB': 2}
},
service_name='wine-classifier-aci'
)
基准测试: 大规模性能 #
追踪服务器吞吐量 #
我们在一台 8 vCPU / 32 GB RAM 的实例上,使用 PostgreSQL 后端和 S3 制品存储对 MLflow 追踪服务器 (v2.22.0) 进行了基准测试:
| 指标 | SQLite (本地) | PostgreSQL (本地) | PostgreSQL + S3 |
|---|---|---|---|
| 每秒记录的运行数 | ~180 | ~350 | ~320 |
| 并发客户端 (稳定) | 5 | 50 | 40 |
| UI 加载时间 (10K 运行) | 2.1 秒 | 0.8 秒 | 0.9 秒 |
| 制品上传 (10 MB) | 0.3 秒 | N/A | 0.5 秒 |
单个 PostgreSQL 支持的追踪服务器可以轻松处理一个 20 人数据科学团队每天 10,000+ 次实验。对于更大的部署,建议通过在多个 MLflow 服务器实例前使用负载均衡器进行水平扩展。
模型注册表延迟 #
| 操作 | 延迟 (毫秒) |
|---|---|
| 创建实验 | 12 |
| 开始运行 | 25 |
| 记录参数 | 8 |
| 记录指标 | 6 |
| 记录制品 (1 MB) | 85 |
| 注册模型版本 | 18 |
| 加载模型 (注册表) | 120 |
存储增长预测 #
| 规模 | 每月实验数 | 存储增长 | 推荐后端 |
|---|---|---|---|
| 小团队 (5 用户) | 500 | ~5 GB | SQLite + 本地磁盘 |
| 中团队 (20 用户) | 5,000 | ~50 GB | PostgreSQL + S3 |
| 企业 (100+ 用户) | 50,000+ | ~500 GB | PostgreSQL + S3 + 清理策略 |
高级用法 / 生产加固 #
使用 HTTP Basic Auth 认证 #
# auth_server.py — 带基本认证的 MLflow 服务器
from flask import Flask, request, Response
import mlflow.server
import os
app = Flask(__name__)
VALID_CREDENTIALS = {
'data-scientist': 'secure_password_123',
'ml-engineer': 'engineer_pass_456'
}
def check_auth():
auth = request.authorization
if not auth or not auth.password:
return False
return VALID_CREDENTIALS.get(auth.username) == auth.password
@app.before_request
def require_auth():
if not check_auth():
return Response('Authentication required', 401,
{'WWW-Authenticate': 'Basic realm="MLflow"'})
# 在认证代理后挂载 MLflow
# 或使用带基本认证的 nginx 反向代理
# nginx.conf — 带基本认证的反向代理
server {
listen 80;
server_name mlflow.yourcompany.com;
location / {
auth_basic "MLflow Tracking Server";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
自动清理旧实验 #
# cleanup.py — 删除旧运行以管理存储
from mlflow.tracking import MlflowClient
from datetime import datetime, timedelta
client = MlflowClient('http://localhost:5000')
# 查找并删除超过 90 天的运行
cutoff = datetime.now() - timedelta(days=90)
experiments = client.search_experiments()
for exp in experiments:
runs = client.search_runs(
experiment_ids=[exp.experiment_id],
filter_string=f"attributes.start_time < {int(cutoff.timestamp() * 1000)}"
)
for run in runs:
if run.info.status == 'FINISHED':
client.delete_run(run.info.run_id)
print(f'Deleted run {run.info.run_id} from {exp.name}')
print(f'Cleanup completed. Deleted {len(runs)} old runs.')
# 通过 cron 每周运行清理
crontab -e
# 添加: 0 2 * * 0 /usr/bin/python3 /opt/mlflow/cleanup.py >> /var/log/mlflow-cleanup.log 2>&1
与 CI/CD 集成 #
# .github/workflows/ml-pipeline.yml
name: ML Training Pipeline
on:
push:
branches: [main]
jobs:
train:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install mlflow==2.22.0 scikit-learn pandas
- name: Train and register model
env:
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
run: |
python train.py --register-model --stage Staging
- name: Notify team
run: |
echo "Model trained and registered. Review at $MLFLOW_TRACKING_URI"
与替代方案对比 #
| 特性 | MLflow | Weights & Biases | Neptune.ai | TensorBoard |
|---|---|---|---|---|
| 开源 | 是 (Apache-2.0) | 否 (专有) | 否 (专有) | 是 (Apache-2.0) |
| 自托管 | 是 (免费) | 否 (仅云) | 否 (仅云) | 是 |
| 模型注册表 | 是 (内置) | 是 | 是 | 否 |
| 模型服务 | 是 (REST API) | 否 | 否 | 否 |
| 成本 | 免费 | $50-250/用户/月 | $49-249/用户/月 | 免费 |
| GitHub Stars | ~21,000 | N/A | N/A | ~7,900 |
| 框架支持 | 任意 (通过 Python) | PyTorch, TF, JAX | PyTorch, TF, JAX | 以 TensorFlow 为主 |
| 制品存储 | S3, GCS, Azure, 本地 | 仅云 | 仅云 | 本地/GCS |
| 团队协作 | UI + 权限 | 高级 | 高级 | 有限 |
| CI/CD 集成 | REST API + Python | 是 | 是 | 有限 |
选择 MLflow 的情况: 你想要一个开源、自托管、零每用户成本的解决方案,需要内置模型注册表和服务,并偏好与任何 ML 库配合使用的框架无关工具。
选择 Weights & Biases 的情况: 你需要高级可视化、实时协作功能,并且不介意为托管云服务按用户付费。W&B 在深度学习实验可视化方面表现出色。
选择 Neptune.ai 的情况: 你想要一个托管的实验追踪解决方案,具有强大的团队功能,并愿意为不自托管的便利性付费。
选择 TensorBoard 的情况: 你专门使用 TensorFlow/Keras,只需要可视化,不需要实验管理、模型注册表或部署功能。
局限性 / 诚实评估 #
MLflow 很出色但并非万能:
没有内置流水线编排: MLflow 追踪实验但不编排多步训练流水线。团队通常将 MLflow 与 Kubeflow Pipelines、Apache Airflow 或 Prefect 配对使用。
UI 可扩展性: MLflow UI 在单个实验中超过 ~100,000 次运行时会变慢。使用实验命名约定和搜索/过滤 API 保持视图可管理。
有限的访问控制: 开源版本有基本认证但缺乏细粒度 RBAC。需要每个实验或每个模型权限的组织通常添加 API 网关或使用 Databricks 的托管 MLflow。
没有内置超参数调优: 与 Katib (Kubeflow) 或 Optuna 不同,MLflow 不包含超参数搜索算法。它美观地记录结果但依赖外部工具生成搜索空间和执行 trial。
制品存储成本: 使用 S3 或 GCS 进行制品存储时,模型检查点和数据集可能快速累积。每周产生 10 GB 制品的团队每年将累积 ~500 GB。实施生命周期策略来归档或删除旧制品。
常见问题解答 #
Q: MLflow 如何存储实验数据?
A: MLflow 使用 backend store 存储元数据(实验、运行、参数、指标),使用 artifact store 存储文件(模型、图表、数据集)。Backend store 可以是 SQLite (开发)、PostgreSQL/MySQL (生产) 或文件存储。Artifact store 可以是本地文件系统、S3、GCS、Azure Blob 或 HDFS。两者都在启动 mlflow server 时配置。
Q: 我可以不使用追踪服务器使用 MLflow 吗?
A: 可以。MLflow 在本地模式下工作,实验记录到本地 mlruns/ 目录。这对于个人开发非常完美。只需使用 mlflow.start_run() 而不设置追踪 URI — 所有内容都在本地记录,你可以使用 mlflow ui 查看结果。
Q: 如何从本地 SQLite 迁移到 PostgreSQL?
A: MLflow 提供数据库迁移工具。首先确保两个数据库都可访问。然后使用 mlflow db upgrade postgresql://user:pass@host/db 初始化 PostgreSQL 模式。对于迁移现有运行数据,使用 mlflow experiments csv 导出并重新导入,或使用 pgloader 等数据库迁移工具进行直接的 SQLite 到 PostgreSQL 传输。
Q: 记录模型和注册模型有什么区别? A: 记录模型将模型制品保存到特定运行 — 它与该实验运行绑定,可以通过运行 ID 检索。注册模型将其添加到模型注册表,这是一个独立于任何实验的版本化目录。已注册模型可以被分阶段(Staging、Production、Archived)并按名称和版本加载,使其成为生产部署的推荐路径。
Q: 如何将 MLflow 与现有的 Kubernetes 集群集成? A: 在集群中将 MLflow 部署为容器。使用 PostgreSQL StatefulSet 作为后端,S3/GCS 用于制品。通过带认证的 Ingress 暴露追踪服务器。MLflow 服务器本身是无状态的,可以在 Service 后运行多个副本以实现高可用性。详细的 manifest 请参阅 Kubernetes 部署指南。
Q: MLflow 可以追踪 Python 以外的语言中的实验吗?
A: 可以。MLflow 有 R (mlflow R 包) 和 Java/Scala (Java 客户端库) 的官方客户端。还有 Julia、C# 和 Go 的社区客户端。REST API 有完整文档,任何能发起 HTTP 请求的语言都可以使用。然而,Python SDK 具有最完整的功能集,包括 autologging。
结论: 今天开始追踪每个实验 #
MLflow 仍然是 ML 生命周期管理最实用的开源解决方案。其零摩擦设置、框架无关设计和强大模型注册表的结合,使其成为想要实验可复现性而不增加基础设施开销团队的默认选择。v2.22.0 (2026年4月) 带来了针对 LLM 框架的改进 autologging、更好的制品流和刷新后的 UI,现在是采用 MLflow 的最佳时机。
通往生产级实验追踪的路径从一行代码开始:mlflow.start_run()。记录你的参数,记录你的指标,注册你最好的模型。三个月后,当有人问"我们应该发布哪个模型?“时,你将在模型注册表中拥有答案,带有完整的血缘关系和可复现性。
准备好部署了吗?在 DigitalOcean 上获得 $200 赠金 来托管你的 MLflow 追踪服务器,今天就开始发布可复现的 ML。加入我们的 Telegram 群组 获取大规模运行 MLflow 的团队提供的技巧。
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
参考资料与延伸阅读 #
- MLflow 官方文档 — https://mlflow.org/docs/latest/ (v2.22.0)
- MLflow GitHub 仓库 — https://github.com/mlflow/mlflow (21,000+ stars)
- MLflow 模型注册表指南 — https://mlflow.org/docs/latest/model-registry.html
- MLflow 追踪 API 参考 — https://mlflow.org/docs/latest/tracking.html
- MLflow Python API — https://mlflow.org/docs/latest/python_api/
- “MLflow: A Platform for ML Development” — Databricks Engineering Blog, 2024
- MLflow 2.22.0 发布说明 — https://mlflow.org/releases/2.22.0
- Kubeflow — Kubernetes 原生 ML 流水线相关指南
- Docker — 容器部署相关指南
- PostgreSQL — 数据库设置相关指南
联盟营销披露: 本文包含 DigitalOcean 的联盟链接。如果你通过这些链接注册,dibi8.com 会获得佣金,而你无需支付额外费用。我们只推荐用于自己基础设施的服务。
💬 留言讨论