4.1 MLOps 全景:从数据到生产的端到端闭环 DevOps 让代码从提交到上线变成自动化流水线;MLOps 要做同样的事,但管理对象从「代码」扩展到「代码 + 数据 + 模型」三件套——这是它比 DevOps 复杂一个量级的根本原因。 4.1.1 MLOps 的核心定义与七大组件 MLOps(Machine Learning Operations) 是 DevOps 思想在机器学习领域的延伸,目标是让 ML 模型的开发、部署、运维像传统软件一样自动化、可复现、可监控、可持续。
DevOps 让代码从提交到上线变成自动化流水线;MLOps 要做同样的事,但管理对象从「代码」扩展到「代码 + 数据 + 模型」三件套——这是它比 DevOps 复杂一个量级的根本原因。
MLOps(Machine Learning Operations) 是 DevOps 思想在机器学习领域的延伸,目标是让 ML 模型的开发、部署、运维像传统软件一样自动化、可复现、可监控、可持续。
一个完整的 MLOps 系统由七大组件构成,覆盖从数据到生产的全链路:
这七大组件的职责分工:
| 组件 | 职责 | 关键挑战 |
|---|---|---|
| 数据管理 | 采集、清洗、标注、版本化 | 数据规模大、版本管理、数据质量 |
| 特征工程 | 特征定义、计算、存储、共享 | 训练-服务一致性、特征复用 |
| 模型训练 | 选型、调参、分布式训练 | 算力调度、超参搜索、可复现 |
| 模型评估 | 离线指标、在线 A/B、业务指标 | 评估与真实效果的 gap |
| 模型注册 | 版本、阶段、元数据、血缘 | 多团队协作、回滚 |
| 模型服务 | 部署、灰度、扩缩容 | 推理性能、稳定性 |
| 监控反馈 | 漂移检测、质量监控、反馈闭环 | 漂移识别、自动再训练 |
💡 判读:MLOps 的复杂性在于这七大组件不是孤立的,而是「数据流」贯穿的闭环——上游数据变了,下游模型效果就变;模型上线后监控发现漂移,要回到训练环节再训练。这种闭环特性要求每个组件都要有版本管理与可追溯能力。
把 MLOps 与 DevOps 放在一起对比,能清楚看到 ML 系统的额外复杂度:
| 维度 | DevOps | MLOps |
|---|---|---|
| 管理对象 | 代码 | 代码 + 数据 + 模型 |
| 部署产物 | 二进制/容器 | 模型权重 + 推理容器 |
| 质量指标 | 功能、性能、安全 | 还要管模型精度、漂移 |
| 上线后行为 | 代码不变则行为不变 | 数据变了模型效果就变 |
| 回滚单位 | 代码版本 | 模型版本 + 数据版本 |
| 监控重点 | 系统指标(CPU/内存/延迟) | 还要管模型质量(预测分布、漂移) |
| 自动化触发 | 代码提交 | 代码提交 + 数据更新 + 定时 |
最关键的差异是 「数据变了模型效果就变」。传统软件只要代码不变,线上行为就稳定;但 ML 系统即使代码不动,只要线上数据分布发生变化(数据漂移),模型效果就会衰退。这要求 MLOps 必须有「持续监控 + 自动再训练」能力,这是 DevOps 完全没有的维度。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 320" font-family="sans-serif" font-size="13"> <text x="440" y="24" text-anchor="middle" font-size="15" font-weight="bold">DevOps 单向流水线 vs MLOps 闭环</text> <!-- DevOps --> <rect x="20" y="50" width="840" height="100" rx="8" fill="#dbeafe" stroke="#2563eb"/> <text x="40" y="75" font-weight="bold" fill="#1e40af">DevOps:单向(代码 → 部署)</text> <g font-size="12" fill="#1e3a8a"> <rect x="40" y="90" width="120" height="40" rx="4" fill="#fff" stroke="#2563eb"/> <text x="100" y="115" text-anchor="middle">代码提交</text> <rect x="200" y="90" width="120" height="40" rx="4" fill="#fff" stroke="#2563eb"/> <text x="260" y="115" text-anchor="middle">CI 构建</text> <rect x="360" y="90" width="120" height="40" rx="4" fill="#fff" stroke="#2563eb"/> <text x="420" y="115" text-anchor="middle">CD 部署</text> <rect x="520" y="90" width="120" height="40" rx="4" fill="#fff" stroke="#2563eb"/> <text x="580" y="115" text-anchor="middle">监控</text> <line x1="160" y1="110" x2="200" y2="110" stroke="#2563eb" marker-end="url(#arr4)"/> <line x1="320" y1="110" x2="360" y2="110" stroke="#2563eb" marker-end="url(#arr4)"/> <line x1="480" y1="110" x2="520" y2="110" stroke="#2563eb" marker-end="url(#arr4)"/> </g> <!-- MLOps --> <rect x="20" y="170" width="840" height="130" rx="8" fill="#dcfce7" stroke="#16a34a"/> <text x="40" y="195" font-weight="bold" fill="#15803d">MLOps:闭环(数据/代码 → 模型 → 部署 → 监控 → 再训练)</text> <g font-size="12" fill="#14532d"> <rect x="40" y="210" width="100" height="40" rx="4" fill="#fff" stroke="#16a34a"/> <text x="90" y="235" text-anchor="middle">数据/代码</text> <rect x="170" y="210" width="100" height="40" rx="4" fill="#fff" stroke="#16a34a"/> <text x="220" y="235" text-anchor="middle">特征/训练</text> <rect x="300" y="210" width="100" height="40" rx="4" fill="#fff" stroke="#16a34a"/> <text x="350" y="235" text-anchor="middle">评估</text> <rect x="430" y="210" width="100" height="40" rx="4" fill="#fff" stroke="#16a34a"/> <text x="480" y="235" text-anchor="middle">注册/部署</text> <rect x="560" y="210" width="100" height="40" rx="4" fill="#fff" stroke="#16a34a"/> <text x="610" y="235" text-anchor="middle">监控</text> <line x1="140" y1="230" x2="170" y2="230" stroke="#16a34a" marker-end="url(#arr4)"/> <line x1="270" y1="230" x2="300" y2="230" stroke="#16a34a" marker-end="url(#arr4)"/> <line x1="400" y1="230" x2="430" y2="230" stroke="#16a34a" marker-end="url(#arr4)"/> <line x1="530" y1="230" x2="560" y2="230" stroke="#16a34a" marker-end="url(#arr4)"/> <path d="M 610 250 Q 610 285 90 285 Q 90 270 90 250" fill="none" stroke="#16a34a" stroke-dasharray="5,3" marker-end="url(#arr4)"/> <text x="350" y="298" text-anchor="middle" font-style="italic" font-size="11">— 漂移/反馈触发再训练,形成闭环</text> </g> <defs> <marker id="arr4" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"> <path d="M0,0 L8,3 L0,6 z" fill="#475569"/> </marker> </defs> </svg>
Google 在 MLOps 白皮书中提出了著名的三级成熟度模型,是评估团队 MLOps 现状的标准尺子。我们在第 1 章 03 节已经简要提过,这里展开讲每一级的特征与跃迁路径。
最常见的状态。数据科学家在 Jupyter Notebook 里完成全流程:
第 0 级的特征:
训练流程被封装成可重复执行的流水线(Pipeline):
第 1 级的特征:
训练与部署都进入 CI/CD 闭环:
第 2 级的特征:
| 维度 | 第 0 级 | 第 1 级 | 第 2 级 |
|---|---|---|---|
| 训练触发 | 手工 | 数据/定时触发 | 代码/数据/定时全触发 |
| 流水线 | 无 | 有 DAG | 有 DAG + CI/CD |
| 实验追踪 | 口口相传 | 自动归档 | 自动归档 + 比对 |
| 部署 | 手工 | 半手工 | 自动晋升 + 灰度 |
| 监控 | 无 | 基础 | 漂移检测 + 自动再训练 |
| 可复现 | 极差 | 好 | 好 + 可重跑 |
💡 判读:大多数团队的真实状态是「0.5 级」或「1.2 级」——介于两级之间。MLOps 的演进不是一蹴而就的,而是逐级提升自动化范围。从 0 到 1 的关键是「训练流水线化 + 实验追踪」,从 1 到 2 的关键是「CI/CD + 自动化部署 + 监控闭环」。
把七大组件映射到云原生栈,看每个组件用什么项目实现:
| 组件 | 开源代表 | 商业代表 | 云原生承载 |
|---|---|---|---|
| 数据管理 | DVC、LakeFS | Databricks Delta | 对象存储 + K8s CRD |
| 特征工程 | Feast | Tecton、Hopsworks | 离线仓 + 在线 KV |
| 模型训练 | Training Operator、Ray Train | SageMaker、Vertex AI | K8s Operator |
| 模型评估 | Kubeflow Pipelines 步骤 | 自研评估平台 | K8s Job |
| 模型注册 | MLflow Model Registry | W&B Artifacts | 镜像仓库 + 元数据 |
| 模型服务 | KServe、Triton、vLLM | SageMaker Endpoints | K8s InferenceService |
| 监控反馈 | Prometheus + Evidently/WhyLabs | Arize、Fiddler | Prometheus + 自定义指标 |
可以看到,开源生态已经覆盖了 MLOps 的全部七大组件,且大多数都能跑在 K8s 上。这是云原生 AI 的成熟度标志——MLOps 不再是少数大厂的专利,而是任何团队都可以搭建的基础设施。
给读者一个实用的自评清单,判断自己团队处于哪一级:
第 0 级特征(每符合一项 +1):
第 1 级特征(每符合一项 +1):
第 2 级特征(每符合一项 +1):
⚠️ 现实提醒:第 2 级是 MLOps 的「北极星」,但盲目追求 2 级可能过度工程化。一个用 LLM API 做应用的小团队,第 1 级就够了;一个有几十个模型在生产的金融团队,才需要完整的第 2 级。成熟度要与业务规模匹配,而不是越高级越好。
最后总结几个常见误区,帮助读者避坑:
这五个误区的解法,分别对应本章后续的四节内容(特征存储、实验跟踪、模型注册、监控闭环)。
下一节《4.2 特征存储:离线训练与在线服务的一致性》将深入 MLOps 中最容易踩坑的「特征一致性」问题。