推理重要论文
DistServe:Prefill 与 Decode 分离
DistServe 将 Prefill 和 Decode 阶段解耦到不同 GPU 上,避免两阶段在同一设备上的资源争抢。
核心问题
在 LLM 推理中,Prefill 和 Decode 是两个计算特性截然不同的阶段:
| 特性 | Prefill | Decode |
|---|---|---|
| 计算类型 | 计算密集型 | 通信密集型 |
| 并行度 | 高(整段 prompt) | 低(逐 token) |
| 显存需求 | KV Cache 初始构建 | KV Cache 增量更新 |
| 适合并行策略 | 张量并行 | 数据并行 |
传统做法将两个阶段放在同一 GPU 上执行,导致相互争抢资源:Prefill 需要大量计算,Decode 需要频繁访问显存带宽,二者混跑会互相干扰,降低整体性能。
解决方案
DistServe 的做法:
- 将 Prefill 阶段分配到一组 GPU(Prefill 节点)
- 将 Decode 阶段分配到另一组 GPU(Decode 节点)
- 通过异步通信将 Prefill 阶段生成的 KV Cache 传输到 Decode 节点
效果
- TTFT(Time To First Token)降低
- TPOT(Time Per Output Token)降低
- 整体吞吐量提升
实际应用效果:在 LLaMA-13B 模型上,DistServe 相比单 GPU 部署,TTFT 降低 2.1 倍,TPOT 降低 1.5 倍,吞吐量提升 1.8 倍。
SARATHI:Chunked Prefill 与 Decode 捎带
SARATHI 解决了不同长度 Prompt 导致的 Padding 冗余问题。
核心问题
传统 Prefill 阶段中,batch 内不同长度的 prompt 需要 padding 到相同长度,造成计算浪费。同时 Decode 阶段的请求在等待 Prefill 完成时处于空闲状态。
解决方案
Chunked Prefill:将长 prompt 拆分为等长的 chunk,每个 chunk 都能充分利用算力,避免 padding 冗余。
Decode 捎带:在 Prefill 处理 chunk 的间隙,将 Decode 阶段的请求"捎带"到空闲的 GPU 算力上并行处理,提升 GPU 利用率。
效果
- 减少 padding 浪费
- 提升 GPU 利用率
- 降低整体推理延迟
实际应用效果:在 Mixtral-8x7B 模型上,SARATHI 相比传统 Prefill,GPU 利用率从 45% 提升至 85%,吞吐量提升 1.9 倍。
SGLang:RadixAttention 与前缀缓存
SGLang 引入 RadixAttention 机制,通过基数树(Radix Tree)管理 KV Cache 的前缀共享。
核心问题
在 RAG、多轮对话等场景中,不同请求往往共享相同的 prompt 前缀(如 system prompt、few-shot 示例)。传统做法为每个请求独立计算 KV Cache,造成大量重复计算。
解决方案
RadixAttention 利用基数树结构自动检测和缓存公共前缀:
- 将每个请求的 token 序列插入基数树
- 新请求到达时,在树上查找最长公共前缀
- 复用已缓存的 KV Cache,只需计算增量部分
效果
- 长 system prompt 场景下推理速度显著提升
- 多轮对话场景下 KV Cache 命中率高
- 与 Continuous Batching 配合效果更佳
实际应用效果:在多轮对话场景下,SGLang 的 KV Cache 命中率可达 85%,推理速度提升 2.3 倍。
Mooncake:以 KV Cache 为中心的调度
Mooncake 以 KV Cache 为中心构建推理集群,通过全局调度优化资源利用。
核心思想
传统推理调度以请求为单位,Mooncake 将 KV Cache 作为一等公民:
- KV Cache 可在节点间迁移和复制
- 全局调度器统一管理 KV Cache 的位置和生命周期
- Prefill 和 Decode 节点通过高速网络共享 KV Cache
效果
- 提升集群级 GPU 利用率
- 降低请求排队延迟
- 支持更灵活的弹性伸缩
实际应用效果:在 128 卡集群上,Mooncake 相比传统调度,GPU 利用率提升 35%,请求排队延迟降低 60%。
其他重要工作
| 论文 | 核心贡献 |
|---|---|
| FlashAttention | IO 感知的精确注意力算法,通过分块计算减少 HBM 访问 |
| PagedAttention | 借鉴 OS 虚拟内存管理 KV Cache,消除显存碎片 |
| TensorRT-LLM | NVIDIA 优化推理引擎,集成多种 kernel 优化 |
| DeepSpeed-FastGen | SplitFuse 技术,将 Prefill 和 Decode 统一为微批次调度 |
核心贡献对比
| 论文 | 优化目标 | 核心技术 | 适用场景 | 效果提升 |
|---|---|---|---|---|
| DistServe | Prefill/Decode 解耦 | 异步通信 | 高并发服务 | TTFT 降低 2.1× |
| SARATHI | Prefill 效率 | Chunked Prefill + Decode 捎带 | 长 prompt 场景 | 吞吐量提升 1.9× |
| SGLang | 前缀缓存 | RadixAttention | 多轮对话/RAG | 推理速度提升 2.3× |
| Mooncake | 集群调度 | KV Cache 中心化调度 | 大规模集群 | GPU 利用率提升 35% |
| FlashAttention | 注意力计算 | 分块计算 + IO 感知 | 通用 | 计算速度提升 2-4× |
| PagedAttention | 显存管理 | 虚拟内存分页 | 通用 | 并发能力提升 2-4× |
实际应用效果对比
| 方案 | 延迟优化 | 吞吐量优化 | 显存优化 | 实现复杂度 | 适用规模 |
|---|---|---|---|---|---|
| DistServe | TTFT↓60%, TPOT↓30% | 吞吐量↑80% | 无 | 高 | 大规模集群 |
| SARATHI | 整体延迟↓40% | 吞吐量↑90% | 无 | 中 | 中等规模 |
| SGLang | 首 token 延迟↓55% | 吞吐量↑130% | KV Cache↓70% | 中 | 中等规模 |
| Mooncake | 排队延迟↓60% | 吞吐量↑35% | 无 | 高 | 大规模集群 |
| FlashAttention | 计算延迟↓50-75% | 吞吐量↑100-300% | 显存↓60-80% | 低 | 通用 |
| PagedAttention | 无直接优化 | 吞吐量↑100-300% | 显存利用率↑ | 低 | 通用 |
选型建议
按场景选型
高并发在线服务:
- 首选 DistServe + PagedAttention
- 适合:聊天机器人、API 服务
- 效果:低延迟、高吞吐
长 prompt 场景:
- 首选 SARATHI + FlashAttention
- 适合:RAG、Agent、文档处理
- 效果:高效处理长输入
多轮对话场景:
- 首选 SGLang + Continuous Batching
- 适合:客服、助手、交互式应用
- 效果:高缓存命中率
大规模集群部署:
- 首选 Mooncake + 张量并行
- 适合:企业级服务、云平台
- 效果:高资源利用率
按模型规模选型
小模型(< 7B):
- FlashAttention + PagedAttention
- 可单卡部署,注重吞吐量
中等模型(7B-30B):
- FlashAttention + PagedAttention + Continuous Batching
- 单卡或双卡部署,平衡延迟和吞吐量
大模型(> 30B):
- DistServe + 张量并行 + PagedAttention
- 多卡部署,注重延迟优化
组合优化建议
基础优化(必须):
- FlashAttention:优化注意力计算
- PagedAttention:优化显存管理
- GQA:减少 KV Cache 大小
场景优化(推荐):
- Continuous Batching:提升吞吐量
- Prefix Caching:复用公共前缀
- 量化:降低显存占用和计算量
高级优化(可选):
- DistServe:Prefill/Decode 解耦
- SGLang:RadixAttention
- Mooncake:集群级调度
最佳实践
分阶段优化:
- 先优化 Prefill 阶段(TTFT)
- 再优化 Decode 阶段(TPOT)
- 最后优化整体吞吐量
监控驱动:
- 建立完善的监控体系
- 根据监控数据持续优化
- 定期评估优化效果
成本效益:
- 评估优化投入产出比
- 优先选择收益高的优化
- 避免过度优化
持续迭代:
- 关注最新研究成果
- 及时应用新技术
- 保持技术领先性