【SOSP 2023】PagedAttention 论文解读:vLLM 如何用分页内存把 LLM 服务吞吐提升 2-4 倍|从LLM推理系统优化视角

摘要

本文解读 SOSP 2023 论文《Efficient Memory Management for Large Language Model Serving with PagedAttention》。该论文提出 PagedAttention 分页注意力算法与 vLLM 服务引擎,通过融合操作系统虚拟内存分页思想KV cache 块级管理写时复制共享,把 KV cache 有效内存利用率从 20.4% 提升到近零浪费。实验表明 vLLM 在同样延迟下吞吐较 FasterTransformer 与 Orca 提升 2-4 倍,且精度零损失,已成为 LLM 推理服务的事实标准,为推理系统优化提供了重要借鉴。

视频讲解点击观看 B 站视频

论文基本信息

项目内容
标题(英文)Efficient Memory Management for Large Language Model Serving with PagedAttention
标题(中文)大模型服务的高效内存管理 —— PagedAttention 与 vLLM
作者Woosuk Kwon, Zhuohan Li, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Hao Yu, Joseph E. Gonzalez, Hao Zhang, Ion Stoica
机构UC Berkeley · Stanford · UC San Diego
会议SOSP 2023
arXivhttps://arxiv.org/abs/2309.06180
项目网站https://github.com/vllm-project/vllm

为什么 KV cache 内存管理是 LLM 服务的命门?

大语言模型(LLM)服务要想降本增效,核心手段是批处理(batching):多个请求共享同一份模型权重,摊薄每次前向的权重搬运成本。但批大小不是想多大就多大——每个请求在生成过程中都会积累一份随序列增长的 KV cache(注意力层的键值缓存),而 GPU 显存是硬上限。论文给出的数字触目惊心:OPT-13B 模型单个 token 的 KV cache 就要 800 KB($2 \times 5120 \times 40 \times 2$ 字节,FP16),单请求最多可占 1.6 GB(2048 token 上限)。A100 的 40 GB 显存里,约 65% 是固定权重、近 30% 是随请求动态增减的 KV cache——KV cache 管理直接决定最大批大小与吞吐

更糟的是硬件趋势:从 A100 到 H100,算力翻了一倍多,显存却封顶在 80 GB。内存瓶颈只会越来越严重

现有系统(Orca、FasterTransformer)为什么低效?因为主流深度学习框架要求张量连续存储,服务系统只能按请求的最大可能序列长度预分配一整块连续内存。这带来三种浪费:

  1. 预留(reserved):为未来 token 提前占住空间,整个请求生命周期内无法被他人使用;
  2. 内部碎片(internal fragmentation):实际输出长度远短于最大值,多预分配的部分纯属浪费;
  3. 外部碎片(external fragmentation):不同请求预分配大小不一,buddy allocator 等分配器产生无法利用的缝隙。

实测(附录 A 与论文 Fig. 5)显示:现有系统真正存放 token 状态的有效内存只有 20.4%--38.2%。即使引入压缩(compaction)方案,预分配块也无法支持解码算法特有的内存共享——这是结构性缺陷。

KV cache 内存分布与 vLLM 平滑曲线

图 1: 13B 模型在 A100 上的内存分布(左):约 65% 权重、近 30% KV cache;右图显示 vLLM 平滑了 KV cache 的快速增长曲线,显著提升吞吐。

现有系统的内存浪费占比

图 2: 现有系统 KV cache 内存浪费占比:实际存放 token 状态的有效内存仅 20.4%--38.2%,其余为预留、内部碎片与外部碎片。

历史坐标(附录 H):vLLM 之前,Orca(OSDI 2022)用迭代级调度解决请求交错问题,FlashAttention(NeurIPS 2022)用 tiling 降低注意力 IO 开销,FlexGen(MLSys 2023)研究单卡极限吞吐——但没有一个系统把"内存分配"本身当作一等问题来解。PagedAttention 的答案是:回到 1962 年 OS 的虚拟内存分页思想

研究主线:从问题到结论

PagedAttention 研究主线流程图:从 KV cache 碎片化问题到 2-4 倍吞吐结论

图 14(Mermaid 流程图): 研究主线:问题(KV cache 碎片化、有效内存仅 20.4%)→ 动机(内存决定批大小)→ 设计(分页抽象)→ 方法(PagedAttention + vLLM)→ 实验(ShareGPT/Alpaca)→ 结论(吞吐 2-4 倍、精度零损失)。

基准/方法设计:把操作系统搬进 GPU

vLLM 的系统架构(Fig. 3)是三层结构:集中式调度器统一协调分布式 GPU worker;KV Cache Manager 以分页方式管理 KV cache;Block Engine 在 GPU worker 上把连续 DRAM 切成等大的物理 KV 块(CPU RAM 也备一块用于交换)。

核心抽象是一句话:块(block)= 页(page),token = 字节,请求 = 进程。每条请求的 KV cache 表示为一串逻辑 KV 块,通过 block table(块表) 映射到物理块——逻辑上连续,物理上可以东一块西一块。

vLLM 系统总览

图 3: vLLM 系统总览:集中式调度器统一管理分布式 GPU worker,KV Cache Manager 以分页方式分配与回收物理块。

这套设计同时消灭了三种浪费:按需分配物理块 → 无预留;块大小一致 → 无外部碎片;块内最多浪费一块 → 内部碎片降到"最后一个块"以内。有效内存从 20.4% 直接逼近 100%

分类全景:PagedAttention 的四大设计支柱

PagedAttention 四大设计支柱分类图

图 15(Mermaid 分类图): PagedAttention/vLLM 的四大设计支柱:分块注意力(非连续存储)、逻辑物理分离(按需分配)、引用计数 + 写时复制(多序列共享)、调度抢占(交换/重计算)。

方法细节:PagedAttention 如何工作?

PagedAttention 算法(附录 B):把每条序列的 KV cache 切成固定大小的块(默认 16 token)。注意力计算时,查询向量 $q_i$ 与每个 KV 块的键矩阵 $K_j$ 相乘得到块级注意力分数,再与值矩阵 $V_j$ 加权求和。关键是:内核按块表逐块取数,物理块不需要连续

PagedAttention 算法示意

图 4: PagedAttention 算法示意:一条序列的 key/value 分散存储在三个物理块中,注意力内核逐块读取并计算。

Block table 翻译过程(Fig. 5):7 个 token 的 prompt 占用逻辑块 0/1,映射到物理块 7/1;解码第一步新 token 塞进逻辑块 1 的空位;第二步逻辑块满了,就新分配物理块 3 并登记进块表。碎片被限制在最后一个块以内

Block table 翻译

图 5: Block table 翻译:逻辑块 0/1 映射到物理块 7/1,生成过程中按需追加新物理块,仅在最后一个块内存在碎片。

内存共享三件套

  • 并行采样:多个输出共享 prompt 的物理块,用引用计数记录共享;写入共享块时触发 Copy-on-Write(写时复制)——新分配一块、拷贝内容、引用计数减一;
  • Beam search:候选序列间的共享模式随解码动态演化,像 OS 进程树;旧系统需要频繁拷贝 KV cache,vLLM 只在写共享块时复制单块;
  • 共享前缀:服务商预存系统提示词的物理块(类似 OS 共享库),新请求直接映射,末块标记 CoW。

系统实现(附录 B):vLLM 共 8.5K 行 Python + 2K 行 C++/CUDA,前端兼容 OpenAI API。三个融合内核:fused reshape+block write、fused block read+attention(每个 warp 读一个块)、fused block copy(批量 CoW 拷贝)。解码原语只有 fork / append / free 三个方法,就覆盖了所有解码场景。

调度与分布式(正文 §8):FCFS 保证公平;内存耗尽时按 all-or-nothing 策略整条逐出序列;恢复方式二选一——交换(拷到 CPU RAM,交换空间有界)或重计算(重算 KV cache,开销从不超过交换延迟的 20%)。分布式采用 Megatron 风格张量并行(SPMD),单一 KV Cache Manager 让所有 GPU worker 共享块映射。

实验设计与结果:2-4 倍吞吐从哪来?

评测设置:OPT-13B/66B/175B + LLaMA-13B,负载来自 ShareGPT(真实对话,输入比 Alpaca 平均长 $8.4\times$、输出长 $5.8\times$)与 Alpaca(自指令数据);请求按 Poisson 分布到达,跑 1 小时轨迹(OPT-175B 用 15 分钟)。基线:Orca 的三种变体(Oracle/Pow2/Max)与 FasterTransformer。指标为归一化延迟(端到端延迟 ÷ 输出长度)。

主结果(OPT-13B + ShareGPT):

对比基线可承受请求率提升说明
Orca (Oracle)1.7--2.7×内存高效 → 更多请求入批
Orca (Max)2.7--8×消除预留与碎片
FasterTransformer最高 22×细粒度调度 + 内存管理
同时批处理请求数2.2--4.3×对比 Orca (Oracle)/(Max)

单序列生成的延迟曲线

图 6: OPT 系列单序列生成(ShareGPT / Alpaca):请求率超过容量后延迟爆炸,vLLM 能承受显著更高的请求率。

批处理请求数对比

图 7: OPT-13B 同时批处理请求数(ShareGPT 2 req/s、Alpaca 30 req/s):vLLM 分别较 Orca (Oracle) 与 Orca (Max) 多处理 2.2× 与 4.3×。

解码场景收益(附录 D 量化):

场景Alpaca 内存节省ShareGPT 内存节省
并行采样6.1%--9.8%16.2%--30.5%
Beam search37.6%--55.2%44.3%--66.3%

并行采样块共享示例

图 8: 并行采样示例:两个输出共享 prompt 物理块(引用计数 2),A1 写入时触发 Copy-on-Write 分配新块。

Beam search 块管理

图 9: Beam search($k=4$)块管理:候选共享前缀块,随迭代动态释放引用计数归零的物理块,无需频繁拷贝 KV cache。

共享前缀示例

图 10: 共享前缀示例(机器翻译):系统提示词与示例的 KV cache 预存为物理块,用户输入仅需计算任务部分。

共享前缀实验收益

图 11: 翻译负载下共享前缀收益:one-shot(80 token 前缀)吞吐 1.67×,few-shot(341 token)3.58×,均对比 Orca (Oracle)。

调度对比:小块场景下交换受 PCIe 带宽限制、开销大;重计算开销与块大小无关。小块用重计算、大块用交换;块大小 16--64 时两者端到端相当(Fig. 12)。

重计算 vs 交换

图 12: 重计算 vs 交换:(a) 微基准开销,(b) OPT-13B + ShareGPT 轨迹端到端性能——小块时交换受 PCIe 带宽限制。

块大小微基准(附录 E):默认 16;ShareGPT 下 16--128 均为好区间,但 Alpaca 短序列下大块显著退化。PagedAttention 内核因块表访问与变长序列处理,比 FasterTransformer 注意力内核慢 20%--26%——但内存效率带来的批大小收益远大于内核开销。

Beam search 内存共享节省曲线

图 13: Beam search 下的 KV 块共享内存节省(Alpaca 轨迹)——共享比例随波束宽度增加。

结果对比总结

vLLM 与基线对比总结图:请求率与吞吐提升倍数

图 16(Mermaid 对比图): 结果对比总结:vs Orca (Oracle) 请求率 1.7-2.7×、vs Orca (Max) 2.7-8×、vs FasterTransformer 最高 22×,精度零损失,实现吞吐 2-4 倍与近零内存浪费。

关键发现

  • 有效内存从 20.4%--38.2% 提升到近零浪费:vLLM 的 KV cache 中除最后一个块外无碎片,直接翻倍批大小。
  • 同延迟下吞吐提升 2-4 倍:对比 FasterTransformer 与 Orca,且不损失任何模型精度。
  • 复杂度越高的解码算法收益越大:beam search 宽度 6 时对 Orca (Oracle) 的优势从基础采样的 1.3× 扩大到 2.3×。
  • 共享前缀最多省 66.3% 内存(ShareGPT + beam search);few-shot 前缀翻译任务吞吐达 Orca (Oracle) 的 3.58×。
  • 聊天长对话场景可承受 2 倍请求率:ShareGPT 长输入下碎片消除收益最大。
  • 内核开销仅 20%--26%:PagedAttention 注意力内核比 FasterTransformer 慢,但端到端仍大幅胜出——内存效率是决定因素。

局限性

  • 非通用 GPU 负载:训练负载张量形状静态、分配可预先优化;非 LLM 推理多为计算受限——分页引入的间接开销反而有害。
  • 内核延迟 +20%--26%:块表访问、额外分支与变长序列处理,是必须支付的代价。
  • 块大小权衡:块太大 → 内部碎片增加、共享概率下降;块太小 → GPU 并行度不足(Alpaca 短序列下大块退化明显)。
  • 收益全在内存管理:不改变输出分布,因此需要配套的调度与内核工程才能兑现收益。

常见问题(FAQ)

PagedAttention 和普通注意力有什么区别?

普通注意力要求 KV cache 连续存储;PagedAttention 把 KV cache 切成固定大小的块,允许块存放在非连续物理内存中,通过 block table 按块取数——代价是注意力内核慢 20%--26%,收益是内存碎片近乎归零。

vLLM 为什么比 Orca 快这么多?

Orca 的迭代级调度解决"请求怎么交错",vLLM 的 PagedAttention 解决"内存怎么装下更多请求"。两者互补;vLLM 把有效内存利用率从 20.4% 提到近零浪费,批大小翻倍,吞吐自然提升 2-4 倍。

并行采样和 beam search 怎么共享 KV cache?

共享的粒度是物理块:多个序列把逻辑块映射到同一批物理块,用引用计数管理;需要写入共享块时触发 Copy-on-Write,只复制一个块。Beam search 的共享模式随解码动态演化,像 OS 的进程树。

被抢占的请求怎么恢复?

两种方式:交换——把逐出块拷到 CPU RAM,等 GPU 有空再拷回来(交换空间有界);重计算——重算被抢占序列的 KV cache,开销从不超过交换延迟的 20%。小块场景重计算更优,大块场景交换更优。

块大小为什么默认是 16?

16 足够大以充分利用 GPU 并行度,又足够小以避免内部碎片与共享概率下降。ShareGPT 下 16--128 都是好区间;Alpaca 这类短序列负载下大块会显著退化。

vLLM 现在还在用 PagedAttention 吗?

是的。vLLM 已成为业界 LLM 服务引擎事实标准,TensorRT-LLM、LMDeploy、HuggingFace TGI 都跟进分块 KV 管理;SGLang 的 RadixAttention 用前缀缓存树延续了分页思想;KV 压缩社区(H2O、SnapKV、PyramidKV)在其基础上做缓存剪枝。

参考链接

  • arXiv 论文页:https://arxiv.org/abs/2309.06180
  • vLLM 项目:https://github.com/vllm-project/vllm
  • Orca(OSDI 2022):https://www.usenix.org/conference/osdi22/presentation/yu
  • FlashAttention(NeurIPS 2022):https://arxiv.org/abs/2205.14135
  • SGLang / RadixAttention:https://arxiv.org/abs/2312.07104

给大家推荐一款自用写文献综述、无虚构文献的 AI:

🌟 复旦大学 FudanNLP 团队自研 切问学术

官网:qiewenpaper.com

覆盖 3.6 亿篇可溯源真实中英文文献,能自动整合文献观点生成规范综述

还能挖掘研究创新点、复现实验,配合视频教学,新手快速上手文献综述写作


🍀后记🍀

博客的关键词集中在编程、算法、机器人、人工智能、数学等等,持续高质量输出中。

🌸讨论QQ群白拾的小屋 (750365700)

⭐B站账号白拾的物理AI组会(活跃于知识区和动画区)

✨GitHub主页YhbCode000(工程文件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白拾ShiroX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值