← 返回深度解读总览
Deep Reading Report · LLM 关键节点论文全集 · B2-P2

《Efficient Memory Management for LLM Serving with PagedAttention》深度解读报告 vLLM · UC Berkeley / Stanford / UCSD · SOSP 2023 · arXiv 2309.06180

作者Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Hao Yu, Joseph E. Gonzalez, Hao Zhang, Ion Stoica 发表SOSP 2023(2023-09-12,16 页) 代码github.com/vllm-project/vllm
数据依据:pdf-worker 源数据提取文件(00-源数据提取.md),全部数字与原文一致;文中标注「(推断)」处为分析者推理补充。

摘要

本文解读 UC Berkeley 联合 Stanford、UCSD 及独立研究者发表于 SOSP 2023 的 vLLM 论文。核心论断:LLM serving 的吞吐瓶颈不在算力,而在显存管理。KV cache 以"按最大长度预分配连续空间"的传统方式管理时,真正用于存储 token 状态的内存仅占 20.4%–38.2%,其余被预留浪费(reservation,最大浪费项)与内部/外部碎片吞噬。

作者将操作系统虚拟内存与分页机制整体迁移至 GPU 显存:block 对应 page、token 对应 byte、请求对应 process——将每个请求的 KV cache 切分为固定大小的 block,物理上无需连续存放,经 block table 完成 logical→physical 翻译,配合能直接访问非连续物理块的 PagedAttention kernel 与 block 级共享机制,把内存浪费压缩到单个 block 的尾部残余。实测中 vLLM 以相同延迟水平将主流 LLM 吞吐提升 2–4×,相对 Orca 的 Oracle 最优上界高 3.58×,且不影响模型准确率。本报告按"问题—概念—方法—证据—批判—启示"六层结构逐层拆解,并指出这项工作真正的示范意义在于方法论——用操作系统领域六十余年前的成熟智慧,精准命中的是大模型时代最新鲜的痛点。(推断)

一问题定位:显存才是 LLM serving 的第一瓶颈

1.1 论文要解决的问题

论文针对的现象极为具体:LLM 推理服务中,吞吐量上不去的原因不是 GPU 算不够快,而是显存装不下、也装不好。自回归生成的每一步都要为所有历史 token 维护 key/value 向量(即 KV cache),而这条缓存有两个致命属性:随生成长度动态增长,且最终长度事先不可知。现有推理系统对此的处理方式是把"不可知"当成"最坏情况"——按用户配置的最大序列长度(如 2048 token)一次性预分配一段连续显存。只要用户报的最大长度够大、并发请求够多,显存就被大量"占而不用"的空位塞满,新请求进不来,已进入的请求又因算力利用率不足而跑不满 GPU。

一句话小结:问题不是"显存太小",而是"显存被管得太糟"——同一块 40GB 的 A100,换一种管理方式就能多服务几倍的请求。

1.2 成本结构解剖:KV cache 占据近三分之一显存

论文 Figure 1 给出关键静态画像:13B 参数模型部署在 NVIDIA A100 40GB 上,模型权重约占 65%(对应注释约 26GB),KV cache 占据近 30%。(推断)剩余不足 5% 留给激活值与其他运行时开销。这幅画像的含义有两层:

(推断)由此可推出全文的战略逻辑:想提高吞吐,要么压缩 KV cache 的占用(量化、压缩等算法路线),要么提高已有 KV cache 内存的利用率(系统路线)。本文选择后者,且做到了近乎极致。

1.3 三类浪费:Figure 2 的内存浪费解剖学

论文 Figure 2 将现有系统中 KV cache 显存的去向逐项分解,结论触目惊心:只有 20.4%–38.2% 的 KV cache 内存真正用于存储 token states,其余全部浪费:

浪费类型成因相对规模
Reservation(预留浪费)按最大长度预分配,实际生成远短于上限最大浪费项
Internal fragmentation(内部碎片)分配粒度大于实际所需,块内空间闲置次要
External fragmentation(外部碎片)连续分配要求导致零散空闲块拼不出整段连续空间次要

这一分解的价值在于把模糊的"内存利用率低"变成可分别攻击的三个靶子。后文将看到,PagedAttention 的三项机制恰好一一对应地消灭了这三类浪费——这种"病理分类学与药方严格对位"的论证结构,是全文写作上最干净利落的部分。

1.4 问题的本质与解题的类比起点

把三类浪费合起来看,病灶只有一个:"连续内存 + 静态预分配"这套假设,与"动态增长 + 长度未知"的真实负载根本不匹配。这个矛盾在计算机科学史上早已被解决过一次——1960 年代的操作系统面对"进程内存需求动态变化、物理内存碎片化"的完全同构问题,给出了虚拟内存与分页机制:把进程地址空间切成固定大小的页(page),页可散落在物理内存任何位置,由页表完成翻译,按需调页,永不预留。作者把这个类比原封不动搬进论文:block 即 page,token 即 byte,request 即 process。(推断)这个类比的精妙之处在于它不只是修辞——OS 分页方案的三要素(定长单元、间接寻址表、按需分配)恰好就是消灭三类浪费的三味药,迁移几乎是逐条对应的。

二概念内核:五个核心概念逐一定义

2.1 KV cache 与两阶段生成

定义:Transformer 自回归解码时,为避免每步重算全部历史 token 的 key/value 投影而缓存的中间张量;每个 token 在每一层的每个 head 都有一组 key 向量与 value 向量。

拆解:论文将一个请求的生命周期分为两阶段:prompt phase(一次性吞入整个提示词,可高度并行为矩阵运算)与 autoregressive generation phase(逐 token 生成,每步只算一个新 token,却要读写整个 KV cache)。后者的瓶颈性质发生质变——从计算受限转为内存受限:每步计算量很小,但要把整个 KV cache 从显存里过一遍,GPU 算力利用率因此严重不足。(推断)这正是为什么"省显存"能直接转化为"提吞吐":显存利用率上去后,同一张卡能并行容纳更多请求,批处理变大,内存受限阶段的算力空转才被填满。

2.2 PagedAttention

定义:一种注意力机制变体与管理策略——以固定大小的 KV block 为单位组织与访问 KV cache,允许单个序列的 key/value 向量存放在物理上不连续的多个 block 中,注意力计算经由 block table 间接寻址完成。

拆解:这是全文的概念枢纽。它的革命性不在算法层面(数学上仍是标准注意力),而在数据布局层面:传统实现隐含假设"一个序列的 KV cache 是一整块连续显存",PagedAttention 把这个假设彻底打碎。打碎之后,三类浪费同时失去存在的前提——不再需要连续空间(外部碎片消失),不再按最大长度预留(预留浪费消失),残余浪费被限制在单个 block 内部(内部碎片有界化)。

2.3 Block 与 Block Table

定义:block 是固定容纳 B 个 token 的 KV 存储单元,key block 与 value block 分开管理;block table 是每个请求一张的映射表,记录其逻辑块号到物理块地址的翻译关系,每个表项还记录该物理块内已填充的 token 数。

拆解:(推断)block table 本质上就是一张极简页表——逻辑连续、物理离散,这正是 OS 虚拟内存的核心抽象。"已填充 token 数"字段看似琐碎,实则承担两个职责:其一,解码时知道往哪个位置的槽位写入新 token;其二,注意力计算时知道最后一个 block 中有多少有效 key/value,避免把垃圾数据算进去。物理 block 尾部未填满的位置即为未来 token 预留——预留的范围从一个可能上千 token 的完整序列,缩小到了最多 B−1 个 token,这就是浪费有界化的精确含义。

2.4 Block 级共享

定义:多个序列可将 block table 中的表项指向同一个物理 block,共享这部分 KV 数据;适用于同一请求派生的多条序列(如 parallel sampling 共享 prompt 部分)及跨请求场景。

拆解:(推断)这是分页抽象带来的"意外红利"——一旦 KV cache 的所有权从"整段连续空间"细化为"一个个独立的块",共享的最小粒度就天然出现了。这在 OS 里对应共享内存页与 fork 后的 copy-on-write。对 parallel sampling(一个 prompt 采样 N 条续写),N 条序列的 prompt KV 完全相同,共享一份即可,显存占用从 O(N × prompt_len) 直接降到 O(prompt_len)。(推断)复杂解码算法从"显存的负担"变成了"显存的节流阀",这是连续分配范式下根本无法实现的能力。

2.5 迭代级调度(iteration-level scheduling)

定义:由 Orca 论文引入的调度粒度——调度决策不再以"整个请求"为单位,而是细化到每一个解码迭代步;每生成一个 token,调度器都可重新决定下一步把 GPU 交给谁。

拆解:(推断)该概念在本文中是"配角",但与 PagedAttention 是天作之合:迭代级调度意味着请求可在任意 token 边界加入或离开批次,而每次加入都需立即为其 KV cache 找到安身之处——若内存必须连续分配,频繁进出会造成严重碎片化;有了分页,新请求随时拿到几个零散物理块即可上岗。(推断)可以说迭代级调度提出了"灵活内存"的需求,PagedAttention 提供了供给,二者 co-design(连同 preemption 抢占调度)构成 vLLM 高吞吐的调度侧基础。

一句话小结:五个概念构成一条完整链条——两阶段生成揭示瓶颈所在,PagedAttention 打碎连续性假设,block/block table 提供新抽象,block 共享收获额外红利,迭代级调度与之协同放大收益。

三方法拆解:从数据布局到分布式的一体化设计

3.1 KV cache 的组织方式

vLLM 将每个序列的 KV cache 划分为若干 KV block,每个 block 固定容纳 B 个 token 的 key 与 value,key block 与 value block 分开管理。由于每个 token 在每层都有独立的 key/value 向量,存在两种组织选择:① 同一层相关的全部 head/layer 数据合并进单个 block;② 不同 head/layer 各自单独成 block、各配一张 block table。论文明确指出两种设计的性能没有差异,作者选择了后者——理由仅仅是简化实现。(推断)这是典型的系统工程判断:当两条路性能相同时,永远选实现简单的那条,因为简单意味着更少的 bug、更好的可测试性与更低的维护成本。

3.2 Block Table:一次完整的地址翻译

block table 的每个表项记录两项信息:对应物理 block 的地址与该 block 内已填充的位置数。解码时的写入流程:新 token 的 KV 追加写入逻辑块对应的物理块的下一个空槽位;物理块写满后,向全局块池申请新的空闲物理块,在 block table 尾部追加表项。读取时,kernel 按 block table 逐块取回分散各处的 key/value。整个过程中逻辑视图始终连续,物理布局始终凌乱——混乱被封装在翻译层之下。(推断)这正是虚拟内存给应用编程带来的同款解放:上层永远面对整洁的逻辑地址空间。

3.3 PagedAttention Kernel:非连续访存的注意力

传统 attention kernel 假设 K、V 矩阵在显存中连续排布、可整段加载;PagedAttention kernel 则以 block 为访存单位:对当前 query token,逐个遍历 block table 指向的各个物理 block,与 block 内的有效 key 计算注意力分数,再结合对应的 value 向量加权求和得到输出 o。论文用贯穿性例子说明:生成文本 "Four score and seven years ago our fathers brought forth..." 时,其 key/value 散布在三个互不相邻的物理 block(Block 1/2/3)中,逻辑上的 block 0 位于远处。kernel 分别识别并抓取这些非连续 block,计算结果与数据连续存放时完全一致。(推断)代价是访存模式变得不规则,需要精心设计的 kernel 来摊薄间接寻址的开销——这也是为什么该工作能登上 SOSP 这样的系统顶会:难点全在工程实现的细节里。

3.4 解码全流程:浪费如何被限制在单块之内

将上述机制串联,一次典型解码过程为:① 当前逻辑块未满 → 新 token 的 KV 直接入槽,更新"已填充数";② 当前块写满 → 申请新物理块、追加表项;③ 注意力计算 → 经 block table 收集全部有效 KV 参与运算。由于"旧 block 满后才分配新 block",任一时刻的浪费只可能出现在最后一块的未填满尾部,上界为 B−1 个 token 的槽位。对照第一章病理表:reservation 被消灭(从不预留整段空间)、外部碎片被消灭(物理块无需连续)、内部碎片被有界化(≤ 一个块的尾部)。三类浪费的药方与病理严格一一对应。

3.5 系统级协同:调度、抢占与换出

3.6 分布式推理

当模型大到单卡装不下时,vLLM 支持跨 worker 的分布式推理:KV block 的管理横跨多张 GPU 的显存。(推断)这与张量并行的常见做法一致——切分后的模型各部分驻留不同设备,KV cache 也随之分布。此外 block size 设计为可变超参:block size > 1 时每 block 容纳多个 token,kernel 一次处理多 token,以此在管理开销与访存效率间取得平衡。block size 的权衡将在第四章证据部分再次出现。

一句话小结:方法体系是一棵自底向上的树——底层是 block 化数据布局与非连续访存 kernel,中层是 block table 翻译与按需分配策略,顶层是调度/换出/分布式的系统协同;每一层的存在都为"消灭某一类浪费"服务,无一处冗余设计。

四证据链:主实验、对照协议与收益边界

4.1 实验设置

评估使用 LLaMA-13B 模型与 NVIDIA A100 40GB GPU,核心度量指标为 serving throughput(服务吞吐量)。(推断)选 13B 档位是因为该规模下 KV cache 占比显著(§1.2 的 30% 画像正是此配置),内存管理优化的收益空间最大;更小的模型权重占比过高、更大的模型则需多卡,都会稀释单一因素的归因清晰度。

4.2 主结果:2–4× 与 3.58×

对比对象结果说明
相同延迟水平下的整体吞吐2–4× 提升Abstract 与 §1 的总体主张
vs FasterTransformer / Orca 等 SOTA2–4× 提升不影响模型准确率
vs Orca(Oracle 配置)3.58× 提升§6.3 主实验

这里最值得注意的是对比对象:不是普通基线,而是当时最强的专用推理引擎 FasterTransformer 与首个引入迭代级调度的 Orca。赢过弱者不足为奇,在同代最强系统上取得倍数级领先,才说明优化的维度是对方体系里根本不存在的——对手们无论调度做得多好,都困在连续内存分配的天花板下。

4.3 对照协议的公平性:Oracle 的含义

源数据明确记录:Orca 未公开源码,因此部分对照组以 Oracle(最优上界)与 Max/Pow2 两种预分配策略代替。(推断)所谓 Oracle 配置,即假设 Orca 能完美知晓每个请求的真实输出长度、按需精确分配——这是给对手"开挂"后的理论上界。在此口径下测得的 3.58× 反而是保守数字:真实 Orca 无法完美预知,实际差距只会更大。这种"宁可高估对手"的实验设计值得称道,但也埋下了第五章讨论的复现性隐患。

4.4 精度与收益条件

4.5 Block Size 研究:参数并非免费

§7.2 专门研究了 block size 这一关键超参:增大 block size 可降低管理开销(表项更少、kernel 单次处理更多数据),但会增加碎片(块内尾部浪费变大);block size 恒定时该 trade-off 始终存在。(推断)这是 OS 分页历史上同一个问题的翻版——页太大则内部碎片严重,页太小则页表开销爆炸,OS 最终选择的 4KB 也是折中产物。vLLM 把这个权衡重新暴露出来交给使用者调节,说明作者清楚自己的方案没有"免费的午餐"。

一句话小结:证据链的主轴是"在最强的对手、最保守的口径下仍取得倍数级吞吐优势,且精度无损";收益边界与超参权衡的坦诚披露,让这份证据的可信度高于一般的系统论文。

五批判审视:局限的深层含义与独立疑点

5.1 作者自述局限的深层含义

  1. 依赖 GPU 显存分配,CPU swap 场景需额外管理开销:分页解决了显存内部的利用率,但当总需求超出显存总量时仍需换出到主存——此时 PCIe 带宽成为新瓶颈,swap 调度策略本身是另一个难题。(推断)深层含义:分页改变的是"分配效率"的上限,不改变"容量"的物理上限,二者不应混为一谈。
  2. Block size 的碎片—开销权衡始终存在:(推断)深层含义:分页把浪费从"无界且不可控"变成"有界但可调",没有凭空消灭熵,只是把熵关进笼子并交出了调节旋钮。
  3. 对照基于 Oracle 估计,对比公平性受限:Orca 不开源导致的替代实验虽属无奈,但意味着 3.58× 这个 headline 数字无法被第三方在完全相同条件下复现检验。(推断)后续社区基于开源 vLLM 与复现版 Orca 的对比普遍支持了量级结论,但这属于论文之外的证据。
  4. "Near-zero waste" 的口径:严格说最后一个 block 的尾部碎片依然存在(最多 B−1 个槽位)。(推断)这是修辞与工程现实间的正常张力:从 20.4%–38.2% 的利用率跃升至接近 100%,尾部残余确实配得上 "near-zero",但读者应知悉其精确含义。
  5. Prompt 长序列处理覆盖有限:评估主要聚焦解码吞吐,prompt 侧长序列处理(后来发展出 chunked prefill 技术)当时仅部分覆盖。(推断)这为后续工作留出了明确改进空间——vLLM 社区后来的演进方向之一正是补齐 prefill 侧的调度与分块。
  6. 理论分析较少,OS 类比为主要论证工具:全文以工程系统贡献为主,缺少形式化性能模型。(推断)这不是缺陷而是类型问题——SOSP 系统论文的评价标准本来就是"造出来、跑得快、可复现",而非证明定理。

5.2 独立观察到的三个疑点

① 类比的边界:GPU 上没有 MMU。OS 分页的硬件基础是 MMU/TLB——地址翻译由专用硬件完成,几乎零开销。而 PagedAttention 的 block table 翻译完全靠软件:每个 attention kernel 都要在访存路径上感知间接寻址。(推断)这意味着分页在 GPU 上不是"免费"的,其成功高度依赖 kernel 实现质量——若间接寻址开销控制不住,方案就不成立。这也解释了为什么论文花大量篇幅描述 kernel 细节,以及为什么后续众多"借鉴分页思想"的实现未必都能达到同等效果:思想易抄,kernel 难写。

② 共享机制的引用计数复杂度未被展开。block 级共享(尤其 parallel sampling 的 copy-on-write 场景)必然引入类似 OS 的引用计数与写时复制逻辑:何时共享、何时分裂、分裂时谁持有旧块、释放顺序如何保证安全——这些工程难点源数据未见详述。(推断)这类机制的 bug 往往表现为静默的数据错乱(两条序列读到对方的 KV),比崩溃难排查得多,是生产环境稳定性的隐形风险区。

③ 评估维度的单薄之处。核心指标为吞吐,延迟仅作为约束条件("相同延迟水平")出现。(推断)对交互式对话场景,单请求的首 token 延迟与 token 间延迟同样关键;分页在高并发下的尾延迟表现、以及 swap 触发时的延迟抖动,论文着墨有限。这不是对结果的否定,而是阅读时应携带的视角:3.58× 是吞吐叙事,不是延迟叙事。

一句话小结:这篇论文的批判点不在结论的真伪——其核心数字与设计逻辑经受住了此后整个行业的大规模复现——而在边界的澄清:分页解决的是分配效率而非容量上限,kernel 工程是其隐藏的成本中心,吞吐是其唯一的叙事主轴。

六启示提炼:可迁移的经验与历史位置

6.1 五条可迁移启示

  1. 旧思想迁移是新领域的富矿:虚拟内存/分页是 1960 年代的成熟技术,作者没有发明新机制,而是完成了一次精准的同构识别——发现"动态增长、长度未知、连续分配"三元组在 LLM serving 与早期 OS 中完全同构,然后整套搬运。(推断)可迁移的方法论:遇到新领域的资源管理问题时,先问一句"这个问题在计算机系统的哪个角落已经被解决过了?"
  2. 病理分类先行于药方设计:先用 Figure 2 把浪费分解为 reservation/internal/external 三类并量化(20.4%–38.2%),再逐一给出对应机制。"先把损失解剖清楚,再对症下药"适用于一切性能优化工作——不能量化的浪费就无法被消灭。
  3. 抽象边界的价值大于单点优化:logical/physical block 的分离表面上只是一个指针表,实质是在"注意力算法"与"显存布局"之间插入了一层稳定接口。此后 vLLM 生态的各种能力(prefix caching、序列共享、抢占换出)都在这层接口上生长。(推断)好的抽象让后续创新变成"填空题"而非"改题"。
  4. 性能相同的实现中永远选简单的:head/layer 合并与分开管理两种 block 组织性能无差,作者选后者只因实现简单。这条朴素原则在系统设计中反复被验证:复杂性是延迟爆发的负债,简单性是可演进的资产。
  5. 诚实的收益边界是公信力的来源:明确指出收益集中在长序列、大模型、复杂解码场景,坦承 block size 权衡与 near-zero 口径,甚至把对手设为 Oracle 上界。这种克制反而让 2–4×/3.58× 的主张更加可信。

6.2 历史位置与后续影响

总结

《Efficient Memory Management for LLM Serving with PagedAttention》用一次教科书级的"旧智慧迁移"解决了 LLM serving 的第一瓶颈:先以 Figure 1/2 的解剖学证据锁定病灶——KV cache 占近 30% 显存而有效利用率仅 20.4%–38.2%,浪费大头是按最大长度预分配造成的 reservation;再将 OS 虚拟内存的 block/page、table/页表、按需分配三件套整体移植,以 block table 翻译与非连续访存 kernel 落地,使浪费收缩至单块尾部;最终在 LLaMA-13B + A100 40GB 上以相同延迟取得 2–4× 吞吐提升、对 Orca 的 Oracle 上界高 3.58×,且精度无损。

批判视角下,它的边界同样清晰:kernel 工程是不可见的成本中心、CPU swap 引入新瓶颈、吞吐之外的延迟维度未被充分展开、Oracle 口径的对照无法被严格复现。但这些都不足以撼动其历史地位——它是"系统思维驯服大模型"的第一座里程碑,此后整个行业的推理基础设施,或多或少都活在它划定的抽象之上。(推断)

交付自检清单