三层优化栈全景

┌─────────────────────────────────────────────────────┐
│                  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-大模型技术交流群!

图片

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

图片

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐