2017Attention Is All You Need
S03 → Transformer 问世。encoder-decoder、正弦位置编码、post-norm。
此后的一切,都是在这个架构的某个变体上做推理。
按列/按行的张量切分,每个子层一次 all-reduce。
至今仍是每个引擎使用的切分模式。为训练而写,推理原封不动地继承了它。
所有 query 头共享一个 KV 头。
第一次承认真正的约束是 KV 缓存而不是权重。GQA 是它的折中版本。
带在线 softmax 的分块注意力;N×N 分数矩阵从不落到 HBM。
把注意力从算力问题重新定义成 IO 问题,而且结果精确,没有做任何近似。
迭代级调度——在两次前向之间准入和退出请求。
连续批处理。此后每一个服务引擎都是它的后代。
2022GPTQ · SmoothQuant
S08 → 二阶信息指导的权重量化;把激活离群值迁移进权重。
让 4-bit 权重和 INT8 激活变得可用,也就把大模型塞进了小 GPU。
2023vLLM · PagedAttention(SOSP)
S06 → 给 KV 缓存做虚拟内存:固定大小的 block 加每请求一张 block table。
把因碎片损失的 60–80% KV 显存收了回来,并让前缀共享成为可能。这个领域影响力最大的一篇系统论文。
廉价草稿先猜 k 个 token;目标模型一次前向验证全部,并用拒绝采样。
在不改变输出分布的前提下,打破了「一次前向一个 token」的假设。
2023AWQ · llama.cpp K-quant
S08 → 激活感知的权重量化;GGUF 中的嵌套分组 scale。
本地推理从此变得实用。picoLM 和 quant.cpp 都是它的直系后代。
2024Sarathi-Serve · 分块 prefill
S11 → 把长 prefill 切成小块,混进 decode 批次。
消除了长 prompt 强加给其他所有用户的延迟尖峰,也消除了超预算 prompt 的饥饿问题。
2024SGLang · RadixAttention
S07 → 一棵建立在 token 序列上的基数树,同时充当分配器和前缀缓存。
token 粒度的前缀匹配,外加用于结构化输出的跳跃解码。
2024Outlines · XGrammar · llguidance
S15 → 把 schema 或语法编译成 token 级自动机,并对 logits 做掩码。
合法 JSON 从一个 prompt 问题,变成了一个解码层面的保证。
在目标模型上加额外的头,用它自己的隐状态预测未来若干位置。
让目标模型辅助的投机既便宜又够准,成为引擎里的一等选项。
2024DistServe · Splitwise
S18 → 让 prefill 和 decode 跑在不同机器上,并在它们之间搬运 KV 缓存。
解耦了在共享硬件上一直互相拉扯的那两个 SLO。
2024Mixtral · DeepSeek-V3
S16 → 服务规模上的稀疏专家混合。
打破了参数量与每 token 算力之间的绑定,显存账单却原封不动。
2025vLLM v1 · FlashInfer
S20 → 重写的引擎核心;一个把分页、GQA 和 flash 注意力合并到一起的共享 kernel 库。
整合期。这些技术不再是论文,而成了默认配置。
2025Mooncake · 以 KV 为中心的服务
S18 → 一个任何 decode 实例都能读取的共享 KV 缓存池,把分离部署与全局前缀缓存合二为一。
架构组织的中心从模型变成了缓存。
picoLM(约 2944 行 C)、quant.cpp(单头文件、KV 压缩)、baseRT(Rust + Metal,一个 CLI)。三者都很年轻、很小;读它们是为了看清楚结构,而不是指望生产级成熟度。
把上面这些想法重新实现到一个下午就能读完的规模。读一遍,就知道自己有没有真的理解。
这里的年份指该想法在服务领域被广泛采用的时间,未必是首次发表的时间。其中好几项在别的领域早已存在几十年:分页来自 1960 年代,拒绝采样来自 1951 年,在线 softmax 来自 2018 年。真正的工作量,在于有人注意到它们同样适用。