三大主流推理框架汇总:vLLM · SGLang · FlashInfer
三层优化栈全景
┌─────────────────────────────────────────────────────┐
│ SGLang(系统层) │
│ RadixAttention | Overlap Scheduler | FSM | MTP │
│ 解决:KV复用、调度效率、结构化输出、多token预测 │
├─────────────────────────────────────────────────────┤
│ vLLM(运行时层) │
│ PagedAttention | Chunked Prefill | Preemption │
│ 解决:显存碎片、prefill-decode平衡、请求抢占 │
├─────────────────────────────────────────────────────┤
│ FlashInfer(Kernel层) │
│ Cascade Attn | Split-K | Ragged | GQA kernel │
│ 解决:计算效率、变长批次、KV加载冗余 │
├─────────────────────────────────────────────────────┤
│ FlashAttention-3(底层) │
│ Warp Specialization | TMA | WGMMA | Pingpong │
│ 解决:H100 硬件利用率(compute/memory overlap) │
└─────────────────────────────────────────────────────┘
一、FlashInfer —— Kernel 层
定位
纯 CUDA kernel 库,专攻 Attention 计算性能,被 vLLM / SGLang 作为后端调用。
1. Cascade Attention(分层注意力)
前缀 KV(共享,如 System Prompt):
┌─────────────────────────────┐
│ Prefix KV Cache (共享) │ ← 多请求共享,只算一次
│ [token0...token512] │
└──────────────┬──────────────┘
│ 第一级 Attention(预计算,缓存结果)
▼
┌─────────────────────────────┐
│ Per-Request KV(独享) │ ← 每请求独立
│ [token513...token_n] │
└──────────────┬──────────────┘
│ 第二级 Attention(用 online softmax 合并两级结果)
▼
Output
收益:System Prompt 长达 4096 token 时节省 60%+ 计算
2. Ragged Tensor Attention(变长序列无 Padding)
传统(Padding 浪费):
Batch = [seq_len=10, seq_len=100, seq_len=50]
Padded: [100, 100, 100] → 浪费 160/300 = 53% 算力
FlashInfer Ragged:
连续存储: [token0..9 | token0..99 | token0..49]
indptr: [0, 10, 110, 160] ← 每个序列边界
实际计算量 = 真实 token 数,zero padding
3. Split-K Attention(Decode 专用)
Decode 特征:Q 只有 1 个 token,KV 很长(如 8192)
传统: 1 个 CUDA block 处理全部 8192 KV → SM 利用率低
Split-K:
Block_0: KV[0:2048] → (m0, l0, o0)
Block_1: KV[2048:4096] → (m1, l1, o1)
Block_2: KV[4096:6144] → (m2, l2, o2)
Block_3: KV[6144:8192] → (m3, l3, o3)
Reduction: online softmax 合并四组结果
SM 利用率: 1 block → 4 blocks,decode 速度提升 ~3x
4. GQA 专用 Kernel
传统: 4 个 Q head 各自独立加载同一份 KV → 4x 显存带宽浪费
FlashInfer: 4 个 Q head 共享 smem 中的同一份 KV tile,带宽节省 75%
二、vLLM —— 运行时层
定位
完整推理服务引擎,核心贡献是显存管理和请求调度。
1. PagedAttention(最核心贡献)
传统 KV Cache(碎片严重):
[req_A(max_len=2048)][碎片][req_B(max_len=2048)]
实际用 30%,浪费 70%
PagedAttention(Block 池,类操作系统虚拟内存):
物理 Block 池: [B0][B1][B2][B3][B4][B5][B6][B7]...
逻辑页表:
req_A → [B0(seq0-15), B3(seq16-31), B7(seq32-47)]
req_B → [B1(seq0-15), B4(seq16-31)]
req_C → [B2(seq0-15), B5(seq16-31), B6(seq32-47)]
KV cache 利用率: 40% → 95%+
相同显存支持 batch size 提升 2-4x
2. Continuous Batching + Preemption
调度器状态机:
WAITING ──────────────────────► RUNNING
↑ │ │
│ 资源不足(KV cache 满) │ │ 生成完成
│◄──────────────────────────────┘ │
│ 抢占(swap to CPU/discard) │
▼
FINISHED
关键:每个 decode step 后重新调度,可插入新 prefill,
低优先级请求 KV swap 到 CPU,高优先级抢占显存
3. Chunked Prefill(解决 Prefill 阻塞 Decode)
问题: 长 prefill(4096 token)独占 GPU,decode 请求饿死
Chunked Prefill:
iter1: [prefill chunk1(512)] + [decode req1] + [decode req2]
iter2: [prefill chunk2(512)] + [decode req1] + [decode req2]
...
iter8: [prefill chunk8(512)] + [decode req1] + [decode req2]
效果:
decode P99 latency 降低 3-5x
GPU 算力更均匀(prefill compute-bound + decode memory-bound 互补)
4. Speculative Decoding 集成
LLMEngine(
model="meta-llama/Llama-3-70B", # target
speculative_model="meta-llama/Llama-3-1B", # draft
num_speculative_tokens=5, # 每步投机 5 个
# draft 生成 5 token → target 并行验证 → 平均接受 3.5 个
)
# 吞吐提升: ~2.5x(接受率高时)
三、SGLang —— 系统编排层
定位
最高层系统,在 vLLM/FlashInfer 之上做跨请求优化和调度编排。
1. RadixAttention(前缀共享的革命性实现)
场景: 1000 个请求,相同 System Prompt(1024 token)
传统 vLLM: 每请求独立存储 → 1000 份 KV cache
SGLang Radix Tree:
Root
└── "You are a helpful assistant..." (System Prompt KV,只存 1 份)
├── "User: What is..." → req_A 独有部分
├── "User: How to..." → req_B 独有部分
└── "User: Explain..." → req_C 独有部分
显存节省: 999/1000 × prefix_size ≈ 99%
命中场景: System Prompt(~100%)、Few-shot(60-80%)、多轮对话(历史全命中)
2. Compressed FSM(结构化输出加速)
问题: JSON/正则约束输出,每步计算 token mask,词表 128K → 成为瓶颈
SGLang 解法:
JSON schema → xgrammar 编译 → DFA(确定有限自动机)
每个状态预计算合法 token 集合(位图,128K bit = 16KB)
执行时: 当前状态 → O(1) 查表 → 合法 token mask
性能: 结构化输出开销 10-30ms/step → <0.1ms/step(300x 加速)
3. Overlap Scheduler(调度与计算重叠)
传统调度(串行,GPU 与 CPU 交替空转):
[调度(CPU)] → [GPU计算] → [调度(CPU)] → [GPU计算]
SGLang Overlap(双线程流水):
CPU线程: [调度t+1] [调度t+2] [调度t+3]
GPU Stream: [计算t] [计算t+1] [计算t+2]
CPU 调度延迟完全隐藏在 GPU 计算时间内
吞吐提升: 10-20%
4. DeepSeek MLA + MTP 支持
MLA (Multi-head Latent Attention):
GQA KV cache: [num_kv_heads, seq_len, head_dim] → 大
MLA KV cache: [seq_len, kv_lora_rank] → 压缩 13x
实现: KV 在低秩空间存储,Attention 时在线解压(absorb 到 Q 投影)
MTP (Multi-Token Prediction):
标准: 每步预测 1 token
MTP: 每步同时预测 k token(轻量额外头)
配合 Speculative Decoding,draft token 质量更高
四、各优化点性能提升汇总
|
优化点 |
框架 |
解决问题 |
性能提升 |
|---|---|---|---|
|
Split-K Attention |
FlashInfer |
Decode SM 利用率低 |
decode 速度 ~3x |
|
Cascade Attention |
FlashInfer |
长前缀重复计算 |
计算量 -60%(长prefix) |
|
Ragged Tensor |
FlashInfer |
Padding 浪费算力 |
有效算力 +53%(典型) |
|
GQA Kernel |
FlashInfer |
KV 带宽浪费 |
带宽节省 75%(GQA ratio=4) |
|
PagedAttention |
vLLM |
KV cache 碎片 |
显存利用率 40%→95%,batch 4x |
|
Continuous Batching |
vLLM |
静态 batch 气泡 |
吞吐 +2x,GPU 利用率 90%+ |
|
Chunked Prefill |
vLLM |
Prefill 阻塞 decode |
decode P99 latency -5x |
|
Speculative Decoding |
vLLM/SGLang |
Decode memory-bound |
吞吐 ~2.5x |
|
RadixAttention |
SGLang |
跨请求 KV 重复 |
显存 -99%(同 prefix),TTFT -5x |
|
Compressed FSM |
SGLang |
结构化输出 overhead |
mask 计算 300x 加速 |
|
Overlap Scheduler |
SGLang |
调度/计算串行 |
吞吐 +10-20% |
|
MLA |
SGLang |
KV cache 过大 |
KV cache -13x(DeepSeek-V2) |
五、多模型端侧部署推荐优先级
优先级 1(必做): PagedAttention + Continuous Batching
→ 显存和吞吐的基础,不做其他优化都白搭
优先级 2(高收益): RadixAttention(有共享前缀时)
→ System Prompt 固定的场景收益极大
优先级 3(延迟敏感): Chunked Prefill + FlashInfer Split-K
→ SLA 严格场景(decode latency < 50ms)
优先级 4(吞吐敏感): Speculative Decoding
→ 需要额外显存放 draft 模型,吞吐优先时采用
优先级 5(结构化输出): Compressed FSM
→ JSON/工具调用场景专属
六、框架选型建议
|
场景 |
推荐框架 |
原因 |
|---|---|---|
|
快速上线,通用场景 |
vLLM |
生态最成熟,API 兼容 OpenAI |
|
高并发,共享前缀多 |
SGLang |
RadixAttention 优势显著 |
|
自定义 kernel 研究 |
FlashInfer |
直接操作 CUDA kernel 级别 |
|
DeepSeek 系列模型 |
SGLang |
原生 MLA/MTP 支持最完整 |
|
多模型混合部署 |
SGLang + FlashInfer |
Overlap Scheduler + Split-K |
推荐阅读
欢迎大家加入DLer-大模型技术交流群!

👆 长按识别,邀请您进群!

更多推荐

所有评论(0)