name: ml-inference-optimization
description: 机器学习推理延迟优化、模型压缩、蒸馏、缓存策略和边缘部署模式。用于优化推理性能、减少模型大小或在边缘部署机器学习时使用。
allowed-tools: 读取、全局搜索、文本搜索
机器学习推理优化
何时使用此技能
在以下情况下使用此技能:
- 优化机器学习推理延迟
- 减少模型大小以进行部署
- 实施模型压缩技术
- 设计推理缓存策略
- 在边缘部署模型
- 平衡准确性与延迟之间的权衡
关键词: 推理优化、延迟、模型压缩、蒸馏、剪枝、量化、缓存、边缘机器学习、TensorRT、ONNX、模型服务、批处理、硬件加速
推理优化概述
┌─────────────────────────────────────────────────────────────────────┐
│ 推理优化堆栈 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 模型层级 │ │
│ │ 蒸馏 │ 剪枝 │ 量化 │ 架构搜索 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 编译器层级 │ │
│ │ 图优化 │ 操作符融合 │ 内存规划 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 运行时层级 │ │
│ │ 批处理 │ 缓存 │ 异步执行 │ 多线程 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 硬件层级 │ │
│ │ GPU │ TPU │ NPU │ CPU SIMD │ 自定义加速器 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
模型压缩技术
技术概述
| 技术 |
大小减少 |
速度提升 |
准确性影响 |
| 量化 |
2-4倍 |
2-4倍 |
低 (1-2%) |
| 剪枝 |
2-10倍 |
1-3倍 |
低-中 |
| 蒸馏 |
3-10倍 |
3-10倍 |
中 |
| 低秩分解 |
2-5倍 |
1.5-3倍 |
低-中 |
| 权重共享 |
10-100倍 |
可变 |
中-高 |
知识蒸馏
┌─────────────────────────────────────────────────────────────────────┐
│ 知识蒸馏 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ 教师模型 │ (大、准确、慢) │
│ │ GPT-4 │ │
│ └──────────────┘ │
│ │ │
│ ▼ 软标签 (概率分布) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 训练过程 │
│ │ 损失 = α × 交叉熵(学生,硬标签) │
│ │ + (1-α) × KL散度(学生,教师软标签) │
│ └──────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 学生模型 │ (小、几乎同样准确、快) │
│ │ DistilBERT │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
蒸馏类型:
| 类型 |
描述 |
使用场景 |
| 响应蒸馏 |
匹配教师输出 |
通用压缩 |
| 特征蒸馏 |
匹配中间层 |
更好的迁移 |
| 关系蒸馏 |
匹配样本关系 |
结构化数据 |
| 自蒸馏 |
模型自我教学 |
正则化 |
剪枝策略
非结构化剪枝 (权重级):
之前: [0.1, 0.8, 0.2, 0.9, 0.05, 0.7]
之后: [0.0, 0.8, 0.0, 0.9, 0.0, 0.7] (50% 稀疏)
• 灵活,可实现高稀疏度
• 需要稀疏硬件/库
结构化剪枝 (通道/层级):
之前: ┌───┬───┬───┬───┐
│ C1│ C2│ C3│ C4│
└───┴───┴───┴───┘
之后: ┌───┬───┬───┐
│ C1│ C3│ C4│ (完全移除C2)
└───┴───┴───┘
• 适用于标准硬件
• 压缩率较低
剪枝决策标准:
| 方法 |
描述 |
有效性 |
| 基于幅度的 |
移除最小权重 |
简单、有效 |
| 基于梯度的 |
移除低梯度权重 |
更好的准确性 |
| 二阶方法 |
使用Hessian信息 |
最好但昂贵 |
| 彩票票假设 |
寻找获胜子网络 |
理论见解 |
量化 (详细)
精度层次:
FP32 (32位): ████████████████████████████████
FP16 (16位): ████████████████
BF16 (16位): ████████████████ (不同的尾数/指数)
INT8 (8位): ████████
INT4 (4位): ████
二进制 (1位): █
内存和计算按比例缩放
量化方法:
| 方法 |
何时应用 |
质量 |
努力程度 |
| 动态量化 |
运行时 |
好 |
低 |
| 静态量化 |
训练后校准 |
更好 |
中 |
| 量化感知训练 |
训练期间 |
最好 |
高 |
编译器级优化
图优化
原始图:
输入 → 卷积 → 批归一化 → ReLU → 卷积 → 批归一化 → ReLU → 输出
优化图 (操作符融合):
输入 → 融合卷积批归一化ReLU → 融合卷积批归一化ReLU → 输出
好处:
• 更少的内核启动
• 更好的内存局部性
• 减少内存带宽
常见优化
| 优化 |
描述 |
加速比 |
| 操作符融合 |
合并连续操作 |
1.2-2倍 |
| 常量折叠 |
预计算常量 |
1.1-1.5倍 |
| 死代码消除 |
移除未使用操作 |
可变 |
| 布局优化 |
优化张量内存布局 |
1.1-1.3倍 |
| 内存规划 |
优化缓冲区分配 |
1.1-1.2倍 |
优化框架
| 框架 |
供应商 |
最适合 |
| TensorRT |
NVIDIA |
NVIDIA GPU,最低延迟 |
| ONNX Runtime |
Microsoft |
跨平台,广泛支持 |
| OpenVINO |
Intel |
Intel CPU/GPU |
| Core ML |
Apple |
Apple设备 |
| TFLite |
Google |
移动、嵌入式 |
| Apache TVM |
开源 |
自定义硬件、研究 |
运行时优化
批处理策略
无批处理:
请求1: [处理] → 响应1 10ms
请求2: [处理] → 响应2 10ms
请求3: [处理] → 响应3 10ms
总计: 30ms,GPU未充分利用
动态批处理:
请求1-3: [等待5ms] → [批处理] → 响应
总计: 15ms,2倍吞吐量
权衡: 延迟 vs. 吞吐量
• 更大批处理: 更高吞吐量,更高延迟
• 更小批处理: 更低延迟,更低吞吐量
批处理参数:
| 参数 |
描述 |
权衡 |
batch_size |
最大批处理大小 |
吞吐量 vs. 延迟 |
max_wait_time |
等待批处理填充时间 |
延迟 vs. 效率 |
min_batch_size |
处理前的最小批处理大小 |
延迟可预测性 |
缓存策略
┌─────────────────────────────────────────────────────────────────────┐
│ 推理缓存层级 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 层级1: 输入缓存 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 缓存精确输入 → 返回缓存输出 │ │
│ │ 命中率: 低 (输入很少完全重复) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 层级2: 嵌入缓存 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 缓存计算的嵌入用于重复令牌/实体 │ │
│ │ 命中率: 中 (常见令牌重复) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 层级3: KV缓存 (用于变压器) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 缓存注意力键值对 │ │
│ │ 命中率: 高 (在序列中跨令牌重用) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 层级4: 结果缓存 │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 缓存语义等价 (模糊匹配) │ │
│ │ 命中率: 可变 (取决于查询分布) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
LLM的语义缓存:
查询: "法国的首都是什么?"
↓
哈希 + 嵌入查询
↓
搜索缓存 (相似度 > 阈值)
↓
├── 命中: 返回缓存响应
└── 未命中: 生成 → 缓存 → 返回
异步和并行执行
顺序:
┌─────┐ ┌─────┐ ┌─────┐
│准备 │→│模型 │→│后处理│ 总计: 30ms
│10ms │ │15ms │ │5ms │
└─────┘ └─────┘ └─────┘
流水线:
请求1: │准备│模型│后处理│
请求2: │准备│模型│后处理│
请求3: │准备│模型│后处理│
吞吐量: 3倍更高
每个请求延迟: 相同
硬件加速
硬件比较
| 硬件 |
优势 |
限制 |
最适合 |
| GPU (NVIDIA) |
高并行性,成熟生态系统 |
功耗,成本 |
训练,大批次推理 |
| TPU (Google) |
矩阵操作,云集成 |
供应商锁定 |
Google Cloud工作负载 |
| NPU (Apple/Qualcomm) |
功耗高效,设备上 |
模型有限 |
移动,边缘 |
| CPU |
灵活,可用 |
ML较慢 |
低批次,CPU绑定 |
| FPGA |
可定制,低延迟 |
开发复杂度 |
专用工作负载 |
GPU优化
| 优化 |
描述 |
影响 |
| 张量核心 |
使用FP16/INT8张量操作 |
2-8倍加速 |
| CUDA图 |
减少内核启动开销 |
1.5-2倍用于小模型 |
| 多流 |
并行执行 |
更高吞吐量 |
| 内存池 |
减少分配开销 |
降低延迟方差 |
边缘部署
边缘约束
┌─────────────────────────────────────────────────────────────────────┐
│ 边缘部署约束 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 资源约束: │
│ ├── 内存: 1-4 GB (vs. 64+ GB 云) │
│ ├── 计算: 1-10 TOPS (vs. 100+ TFLOPS 云) │
│ ├── 功耗: 5-15W (vs. 300W+ 云) │
│ └── 存储: 16-128 GB (vs. TB 云) │
│ │
│ 操作约束: │
│ ├── 无网络 (离线操作) │
│ ├── 可变环境条件 │
│ ├── 不频繁更新 │
│ └── 长部署生命周期 │
│ │
└─────────────────────────────────────────────────────────────────────┘
边缘优化策略
| 策略 |
描述 |
使用时机 |
| 模型选择 |
使用边缘原生模型 (MobileNet, EfficientNet) |
准确性可接受 |
| 激进量化 |
INT8或更低 |
内存/功耗受限 |
| 设备上蒸馏 |
蒸馏到极小模型 |
极端约束 |
| 拆分推理 |
边缘预处理,云推理 |
网络可用 |
| 模型缓存 |
本地缓存结果 |
重复查询 |
边缘ML框架
| 框架 |
平台 |
特性 |
| TensorFlow Lite |
Android, iOS, 嵌入式 |
量化,委托 |
| Core ML |
iOS, macOS |
神经引擎优化 |
| ONNX Runtime Mobile |
跨平台 |
广泛模型支持 |
| PyTorch Mobile |
Android, iOS |
熟悉API |
| TensorRT |
NVIDIA Jetson |
最大性能 |
延迟分析
分析方法
┌─────────────────────────────────────────────────────────────────────┐
│ 延迟分解分析 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 数据加载: ████████░░░░░░░░░░ 15% │
│ 2. 预处理: ██████░░░░░░░░░░░░ 10% │
│ 3. 模型推理: ████████████████░░ 60% │
│ 4. 后处理: ████░░░░░░░░░░░░░░ 8% │
│ 5. 响应序列化: ███░░░░░░░░░░░░░░░ 7% │
│ │
│ 目标: 模型推理 (60% = 最大优化机会) │
│ │
└─────────────────────────────────────────────────────────────────────┘
分析工具
| 工具 |
用于 |
| PyTorch Profiler |
PyTorch模型分析 |
| TensorBoard |
TensorFlow可视化 |
| NVIDIA Nsight |
GPU分析 |
| Chrome Tracing |
通用时间线可视化 |
| perf |
CPU分析 |
关键指标
| 指标 |
描述 |
目标 |
| P50延迟 |
中位数延迟 |
< SLA |
| P99延迟 |
尾部延迟 |
< 2倍 P50 |
| 吞吐量 |
请求/秒 |
满足需求 |
| GPU利用率 |
计算使用率 |
> 80% |
| 内存带宽 |
内存使用率 |
< 限制 |
优化工作流
系统方法
┌─────────────────────────────────────────────────────────────────────┐
│ 优化工作流 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 基线 │
│ └── 测量当前性能 (延迟、吞吐量、准确性) │
│ │
│ 2. 分析 │
│ └── 识别瓶颈 (模型、数据、系统) │
│ │
│ 3. 优化 (按努力/影响顺序): │
│ ├── 硬件: 使用合适的加速器 │
│ ├── 编译器: 启用优化 (TensorRT, ONNX) │
│ ├── 运行时: 批处理、缓存、异步 │
│ ├── 模型: 量化、剪枝 │
│ └── 架构: 蒸馏、模型更改 │
│ │
│ 4. 验证 │
│ └── 验证准确性保持、延迟改善 │
│ │
│ 5. 部署和监控 │
│ └── 跟踪实际性能 │
│ │
└─────────────────────────────────────────────────────────────────────┘
优化优先级矩阵
高影响
│
编译器优化 ────┼──── 量化
(简单胜利) │ (最佳投资回报率)
│
低努力 ──────────────┼──────────────── 高努力
│
批处理 ────┼──── 蒸馏
(快速胜利) │ (主要努力)
│
低影响
常见模式
多模型服务
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ 请求 → ┌─────────┐ │
│ │ 路由器 │ │
│ └─────────┘ │
│ │ │ │ │
│ ┌────────┘ │ └────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ 极小 │ │ 小 │ │ 大 │ │
│ │ <10ms │ │ <50ms │ │<500ms │ │
│ └───────┘ └───────┘ └───────┘ │
│ │
│ 路由策略: │
│ • 基于复杂性: 简单→极小,复杂→大 │
│ • 基于置信度: 尝试极小,如果置信度低则升级 │
│ • 基于SLA: 基于延迟要求路由 │
│ │
└─────────────────────────────────────────────────────────────────────┘
推测执行
查询: "翻译: Hello"
│
├──▶ 小模型 (草稿): "Bonjour" (5ms)
│
└──▶ 大模型 (验证): 检查 "Bonjour" (10ms 并行)
│
├── 接受: 立即返回
└── 拒绝: 用大模型生成
加速: 2-3倍当草稿常被接受时
级联模型
输入 → ┌────────┐
│ 过滤器 │ ← 廉价过滤器 (拒绝明显负例)
└────────┘
│ (仅候选)
▼
┌────────┐
│ 阶段1 │ ← 快速模型 (粗排名)
└────────┘
│ (前100)
▼
┌────────┐
│ 阶段2 │ ← 准确模型 (细排名)
└────────┘
│ (前10)
▼
输出
好处: 10倍更便宜,相似准确性
优化检查表
部署前
- [ ] 分析基线性能
- [ ] 识别主要瓶颈 (模型、数据、系统)
- [ ] 应用编译器优化 (TensorRT, ONNX)
- [ ] 评估量化 (INT8通常安全)
- [ ] 调整批处理大小以满足目标吞吐量
- [ ] 优化后测试准确性
部署
- [ ] 配置合适的硬件
- [ ] 启用适用缓存
- [ ] 设置监控 (延迟、吞吐量、错误)
- [ ] 配置自动扩展策略
- [ ] 实施优雅降级
部署后
- [ ] 监控p99延迟
- [ ] 跟踪准确性指标
- [ ] 分析缓存命中率
- [ ] 审核成本效率
- [ ] 规划迭代改进
相关技能
llm-serving-patterns - LLM特定服务优化
ml-system-design - 端到端ML管道设计
quality-attributes-taxonomy - 性能作为质量属性
estimation-techniques - ML系统容量规划
版本历史
- v1.0.0 (2025-12-26): 初始发布 - ML推理优化模式
最后更新
日期: 2025-12-26