跳到正文
LLM 推理

背景

推理是怎么变快的

这门课里的东西,没有一样是凭空出现的。每一项技术都在回应上一项的某个具体失败;记住那个失败,也就最容易记住这项技术。

  1. 2017

    Attention Is All You Need

    S03

    Transformer 问世。encoder-decoder、正弦位置编码、post-norm。

    此后的一切,都是在这个架构的某个变体上做推理。

  2. 2019

    Megatron-LM

    S17

    按列/按行的张量切分,每个子层一次 all-reduce。

    至今仍是每个引擎使用的切分模式。为训练而写,推理原封不动地继承了它。

  3. 2019

    多查询注意力(MQA)

    S03

    所有 query 头共享一个 KV 头。

    第一次承认真正的约束是 KV 缓存而不是权重。GQA 是它的折中版本。

  4. 2022

    FlashAttention

    S12

    带在线 softmax 的分块注意力;N×N 分数矩阵从不落到 HBM。

    把注意力从算力问题重新定义成 IO 问题,而且结果精确,没有做任何近似。

  5. 2022

    Orca(OSDI)

    S09

    迭代级调度——在两次前向之间准入和退出请求。

    连续批处理。此后每一个服务引擎都是它的后代。

  6. 2022

    GPTQ · SmoothQuant

    S08

    二阶信息指导的权重量化;把激活离群值迁移进权重。

    让 4-bit 权重和 INT8 激活变得可用,也就把大模型塞进了小 GPU。

  7. 2023

    vLLM · PagedAttention(SOSP)

    S06

    给 KV 缓存做虚拟内存:固定大小的 block 加每请求一张 block table。

    把因碎片损失的 60–80% KV 显存收了回来,并让前缀共享成为可能。这个领域影响力最大的一篇系统论文。

  8. 2023

    投机解码

    S14

    廉价草稿先猜 k 个 token;目标模型一次前向验证全部,并用拒绝采样。

    在不改变输出分布的前提下,打破了「一次前向一个 token」的假设。

  9. 2023

    AWQ · llama.cpp K-quant

    S08

    激活感知的权重量化;GGUF 中的嵌套分组 scale。

    本地推理从此变得实用。picoLM 和 quant.cpp 都是它的直系后代。

  10. 2024

    Sarathi-Serve · 分块 prefill

    S11

    把长 prefill 切成小块,混进 decode 批次。

    消除了长 prompt 强加给其他所有用户的延迟尖峰,也消除了超预算 prompt 的饥饿问题。

  11. 2024

    SGLang · RadixAttention

    S07

    一棵建立在 token 序列上的基数树,同时充当分配器和前缀缓存。

    token 粒度的前缀匹配,外加用于结构化输出的跳跃解码。

  12. 2024

    Outlines · XGrammar · llguidance

    S15

    把 schema 或语法编译成 token 级自动机,并对 logits 做掩码。

    合法 JSON 从一个 prompt 问题,变成了一个解码层面的保证。

  13. 2024

    Medusa · EAGLE

    S14

    在目标模型上加额外的头,用它自己的隐状态预测未来若干位置。

    让目标模型辅助的投机既便宜又够准,成为引擎里的一等选项。

  14. 2024

    DistServe · Splitwise

    S18

    让 prefill 和 decode 跑在不同机器上,并在它们之间搬运 KV 缓存。

    解耦了在共享硬件上一直互相拉扯的那两个 SLO。

  15. 2024

    Mixtral · DeepSeek-V3

    S16

    服务规模上的稀疏专家混合。

    打破了参数量与每 token 算力之间的绑定,显存账单却原封不动。

  16. 2025

    vLLM v1 · FlashInfer

    S20

    重写的引擎核心;一个把分页、GQA 和 flash 注意力合并到一起的共享 kernel 库。

    整合期。这些技术不再是论文,而成了默认配置。

  17. 2025

    Mooncake · 以 KV 为中心的服务

    S18

    一个任何 decode 实例都能读取的共享 KV 缓存池,把分离部署与全局前缀缓存合二为一。

    架构组织的中心从模型变成了缓存。

  18. now

    极简引擎

    S20

    picoLM(约 2944 行 C)、quant.cpp(单头文件、KV 压缩)、baseRT(Rust + Metal,一个 CLI)。三者都很年轻、很小;读它们是为了看清楚结构,而不是指望生产级成熟度。

    把上面这些想法重新实现到一个下午就能读完的规模。读一遍,就知道自己有没有真的理解。

这里的年份指该想法在服务领域被广泛采用的时间,未必是首次发表的时间。其中好几项在别的领域早已存在几十年:分页来自 1960 年代,拒绝采样来自 1951 年,在线 softmax 来自 2018 年。真正的工作量,在于有人注意到它们同样适用。