名称: ml-system-design
描述: 面向生产的端到端ML系统设计。使用于设计ML管道、特征存储、模型训练基础设施或服务系统。涵盖从数据摄入到模型部署和监控的完整生命周期。
允许工具: 读取、全局搜索、grep
ML系统设计
此技能提供设计生产机器学习系统的框架,从数据管道到模型服务。
何时使用此技能
关键词: ML管道、机器学习系统、特征存储、模型训练、模型服务、ML基础设施、MLOps、A/B测试ML、特征工程、模型部署
使用此技能当:
- 设计面向生产的端到端ML系统
- 规划特征存储架构
- 设计模型训练管道
- 规划模型服务基础设施
- 准备ML系统设计面试
- 评估ML平台工具和框架
ML系统架构概述
ML系统生命周期
┌─────────────────────────────────────────────────────────────────────────┐
│ ML系统生命周期 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 数据 │──▶│ 特征 │──▶│ 模型 │──▶│ 模型 │──▶│ 监控 │ │
│ │ 摄入 │ │ 管道 │ │ 训练 │ │ 服务 │ │ & 评估 │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘ │
│ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ 数据 │ │ 特征 │ │ 模型 │ │ 推理 │ │ 指标 │ │
│ │ 湖 │ │ 存储 │ │ 注册表 │ │ 缓存 │ │ 存储 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
关键组件
| 组件 |
目的 |
示例 |
| 数据摄入 |
从源收集原始数据 |
Kafka, Kinesis, Pub/Sub |
| 特征管道 |
将原始数据转换为特征 |
Spark, Flink, dbt |
| 特征存储 |
存储和服务特征 |
Feast, Tecton, Vertex AI |
| 模型训练 |
训练和验证模型 |
SageMaker, Vertex AI, Kubeflow |
| 模型注册表 |
版本控制和跟踪模型 |
MLflow, Weights & Biases |
| 模型服务 |
提供预测 |
TensorFlow Serving, Triton, vLLM |
| 监控 |
跟踪模型性能 |
Evidently, WhyLabs, Arize |
特征存储架构
为什么需要特征存储?
没有特征存储的问题:
- 训练-服务偏斜(特征计算方式不同)
- 跨团队重复特征计算
- 无特征版本控制或血统
- 特征实验缓慢
特征存储组件
┌─────────────────────────────────────────────────────────────────┐
│ 特征存储 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 离线存储 │ │ 在线存储 │ │
│ │ │ │ │ │
│ │ - 历史数据 │ │ - 低延迟 │ │
│ │ - 训练查询 │ ────▶ │ - 点查找 │ │
│ │ - 批量特征 │ 同步 │ - 实时服务 │ │
│ │ │ │ │ │
│ │ (数据仓库) │ │ (Redis, DynamoDB) │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 特征注册表 ││
│ │ - 特征定义 - 版本控制 ││
│ │ - 数据血统 - 访问控制 ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
特征类型
| 类型 |
计算方式 |
存储 |
示例 |
| 批量 |
计划(每小时/每天) |
离线 → 在线 |
用户购买计数(30天) |
| 流式 |
实时事件处理 |
直接到在线 |
购物车中的物品(当前) |
| 按需 |
请求时计算 |
不存储 |
到最近商店的距离 |
训练-服务一致性
训练(历史):
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 历史事件 │───▶│ 时间点连接 │───▶│ 训练数据集 │
└──────────────┘ └──────────────┘ └──────────────┘
│
使用特征
定义
│
服务(实时): ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 在线存储 │───▶│ 相同特征定义 │───▶│ 预测请求 │
└──────────────┘ └──────────────┘ └──────────────┘
模型训练基础设施
训练管道组件
┌───────────────────────────────────────────────────────────────────────┐
│ 训练管道 │
├───────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 数据加载器│──▶│ 特征转换 │──▶│ 模型训练 │──▶│ 模型验证 │ │
│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 实验跟踪 │ │ 超参数调优 │ │ 检查点存储 │ │ 模型注册表 │ │
│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────────┘
训练基础设施模式
| 模式 |
使用案例 |
工具 |
| 单节点 |
小数据集,快速实验 |
Jupyter, 本地GPU |
| 分布式数据并行 |
大数据集,相同模型 |
Horovod, PyTorch DDP |
| 模型并行 |
大模型(内存不足) |
DeepSpeed, FSDP, Megatron |
| 超参数调优 |
自动化模型优化 |
Optuna, Ray Tune |
实验跟踪
跟踪以保持可重现性:
| 跟踪内容 |
原因 |
| 超参数 |
重现训练运行 |
| 指标 |
比较模型性能 |
| 工件 |
模型文件、数据集 |
| 代码版本 |
Git提交哈希 |
| 环境 |
Docker镜像、依赖项 |
| 数据版本 |
数据集哈希或快照 |
模型服务架构
服务模式
| 模式 |
延迟 |
吞吐量 |
使用案例 |
| 在线(REST/gRPC) |
低(<100ms) |
中等 |
实时预测 |
| 批量 |
高(小时) |
非常高 |
批量评分 |
| 流式 |
中等 |
高 |
事件驱动预测 |
| 嵌入式 |
非常低 |
可变 |
边缘/移动推理 |
在线服务架构
┌─────────────────────────────────────────────────────────────────────┐
│ 模型服务系统 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ 客户端 │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 负载均衡器 │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ API网关 │ │
│ │ - 认证 - 速率限制 - 请求验证 │ │
│ └──────────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ 模型A │ │ 模型B │ │ 模型C │ │
│ │ (v1.2) │ │ (v2.0) │ │ (v1.0) │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │ │ │ │
│ └───────────────────────┼───────────────────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 特征存储(在线)│ │
│ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
延迟优化
| 技术 |
延迟影响 |
权衡 |
| 批处理 |
减少每个请求延迟 |
增加第一个请求的延迟 |
| 缓存 |
10-100倍更快 |
可能提供过时预测 |
| 量化 |
2-4倍更快 |
轻微精度损失 |
| 蒸馏 |
可变 |
训练开销 |
| GPU推理 |
10-100倍更快 |
成本增加 |
A/B测试ML模型
实验设计
┌─────────────────────────────────────────────────────────────────────┐
│ A/B测试架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ 流量 │ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ 实验分配 │ ◀─────── 实验配置 │
│ │ - 用户分桶 │ - 分配百分比 │
│ │ - 功能标志 │ - 目标细分 │
│ └──────────┬───────────┘ - 护栏 │
│ │ │
│ ┌────────┴────────┐ │
│ ▼ ▼ │
│ ┌────────┐ ┌────────┐ │
│ │控制组 │ │实验组 │ │
│ │模型A │ │模型B │ │
│ └────┬───┘ └────┬───┘ │
│ │ │ │
│ └────────┬───────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 指标记录器 │ │
│ └────────┬───────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 统计分析 │ ─────▶ 决策: 发布 / 迭代 / 终止 │
│ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
要跟踪的指标
| 指标类型 |
示例 |
目的 |
| 模型指标 |
AUC、RMSE、精确率/召回率 |
模型质量 |
| 业务指标 |
CTR、转化率、收入 |
业务影响 |
| 护栏指标 |
延迟、错误率、参与度 |
防止退化 |
| 细分指标 |
按用户细分的指标 |
检测异质效应 |
统计考虑
- 样本大小:实验前计算功效
- 持续时间:考虑新奇效应和时间模式
- 多重测试:调整多个指标(Bonferroni、FDR)
- 早期停止:使用顺序测试方法
模型监控
要监控的内容
| 类别 |
指标 |
警报阈值 |
| 数据质量 |
缺失值、模式漂移 |
>1%变化 |
| 特征漂移 |
分布漂移(PSI、KL) |
PSI >0.2 |
| 预测漂移 |
输出分布漂移 |
取决于使用案例 |
| 模型性能 |
准确率、AUC(当标签可用时) |
>5%退化 |
| 运营 |
延迟、吞吐量、错误 |
SLO违规 |
漂移检测
┌─────────────────────────────────────────────────────────────────────┐
│ 漂移检测管道 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 训练数据 生产数据 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 参考分布 │ │ 当前分布 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └──────────────┬──────────────┘ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ 统计测试 │ │
│ │ - PSI(人口稳定性指数) │
│ │ - KS测试 │
│ │ - 卡方检验 │
│ └────────┬─────────┘ │
│ ▼ │
│ ┌──────────────────┐ │
│ │ 漂移得分 │ │
│ └────────┬─────────┘ │
│ │ │
│ ┌───────────┼───────────┐ │
│ ▼ ▼ ▼ │
│ 无漂移 警告 严重 │
│ (< 0.1) (0.1-0.2) (> 0.2) │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 继续 调查 重新训练 │
│ │
└─────────────────────────────────────────────────────────────────────┘
常见ML系统设计模式
模式1:推荐系统
所需组件:
- 候选生成(检索100-1000个)
- 排序模型(评分和排序)
- 特征存储(用户特征、物品特征)
- 实时个性化(最近行为)
- A/B测试基础设施
模式2:欺诈检测
所需组件:
- 实时特征计算
- 低延迟模型服务(<50ms)
- 高召回率焦点(不能错过欺诈)
- 可解释性以符合合规
- 人工在环审查
- 反馈循环用于标签
模式3:搜索排序
所需组件:
- 两阶段排序(检索 + 排序)
- 特征存储用于查询/文档特征
- 低延迟(<200ms端到端)
- 学习排序模型
- 点击率预测
- A/B测试与交织
ML系统估计
训练基础设施
训练时间估计:
- 数据集大小: 100M样本
- 模型: Transformer(100M参数)
- GPU: A100(80GB, 312 TFLOPS)
- 批量大小: 32
- 训练步数: 数据集 / 批量 = 3.1M步
- 每步时间: ~100ms
- 总时间: ~86小时单GPU
- 使用8个GPU(数据并行): ~11小时
服务基础设施
推理估计:
- QPS: 10,000
- 模型延迟: 20ms
- 批量大小: 1(实时)
- GPU利用率: 50%(延迟约束)
- 每秒每个GPU请求: 25
- 所需GPU: 10,000 / 25 = 400个GPU
- 使用批处理(批量8): 100个GPU(4倍减少)
相关技能
llm-serving-patterns - LLM特定服务和优化
rag-architecture - 检索增强生成模式
vector-databases - 向量搜索和嵌入
ml-inference-optimization - 延迟和成本优化
estimation-techniques - 草稿估算计算
quality-attributes-taxonomy - NFR定义
相关命令
/sd:ml-pipeline <problem> - 交互式设计ML系统
/sd:estimate <scenario> - 容量计算
相关代理
ml-systems-designer - 设计ML架构
ml-interviewer - 模拟ML系统设计面试
版本历史
- v1.0.0 (2025-12-26): 初始发布
最后更新
日期: 2025-12-26
模型: claude-opus-4-5-20251101