一、核心思想
PagedAttention 是 vLLM 提出的核心显存管理技术,专门用来优化大模型推理中的 KV Cache 管理。
它的核心思想是:借鉴操作系统的虚拟内存分页机制,把 KV Cache 切成固定大小的 block,用非连续的物理显存块来存储逻辑上连续的 KV Cache。
传统 KV Cache 管理方式要求每个请求预分配一段连续的显存,导致严重的显存碎片和浪费。PagedAttention 通过分页管理,让 KV Cache 可以离散存储,显存利用率大幅提升。
一句话总结:PagedAttention 把操作系统的分页思想搬到了 KV Cache 管理上,解决了显存碎片和浪费问题。
二、先看传统 KV Cache 管理的问题
1、传统方式怎么做
在 vLLM 之前,主流推理框架对 KV Cache 的管理方式是:
- 每个请求预分配一段连续的显存空间;
- 这段空间要能容纳该请求可能达到的最大序列长度;
- 请求结束后释放整段显存。
比如一个请求最大可能生成 2048 个 token,那就按 2048 预分配。
2、问题一:内部碎片
预分配按最大长度来,但实际生成长度往往远小于最大值。
假设预分配 2048 个 token 的空间,实际只生成了 200 个 token:
- 已用:200;
- 浪费:1848;
- 浪费率超过 90%。
这部分浪费叫内部碎片,是传统方式最严重的问题。
3、问题二:外部碎片
不同请求的序列长度不同:
- 有的请求长,有的请求短;
- 每个请求都要一段连续显存;
- 显存被切得七零八落。
即使总空闲显存足够,也可能找不到一块足够大的连续空间分配给新请求,这就是外部碎片。
4、问题三:无法共享
多个请求如果有相同的前缀,比如相同的 system prompt:
- 传统方式每个请求都要各自存一份;
- 无法共享这部分 KV Cache;
- 显存重复占用。
5、问题四:显存利用率低
综合以上问题,传统方式的显存利用率可能只有 20% 到 40%。
这意味着:
- 能同时处理的请求数少;
- batch size 上不去;
- 吞吐低;
- 长上下文场景下更严重。
三、PagedAttention 的核心思想
1、分页管理
PagedAttention 把 KV Cache 分成固定大小的 block:
- 每个 block 存储固定数量 token 的 K、V;
- 比如一个 block 存 16 个 token 的 KV;
- block 是显存分配的基本单位。
逻辑上,一个请求的 KV Cache 是连续的;物理上,它可以分散在多个不连续的 block 中。
2、逻辑 block 和物理 block
引入两层结构:
- 逻辑 block:请求视角下连续的 KV Cache;
- 物理 block:实际显存中的存储块。
通过一张 block table 建立映射:
$$
\text{逻辑 block } i \rightarrow \text{物理 block } j
$$
这和操作系统中的页表几乎一样。
3、按需分配
PagedAttention 不再预分配最大长度,而是:
- 生成新 token 时,才分配新的 block;
- 一个 block 满了,再分配下一个;
- 请求结束时,释放它占用的所有 block。
这样显存按实际需要分配,几乎没有内部碎片。
四、PagedAttention 的核心优势
1、几乎消除内部碎片
因为按需分配,最后一个 block 可能没满,但浪费最多只有一个 block 的大小。
假设 block 大小为 $B$,平均浪费约为:
$$
\frac{B}{2}
$$
相比传统方式浪费整个最大长度,内部碎片大幅降低。
显存利用率可以从传统方式的 20% 到 40%,提升到 90% 以上。
2、消除外部碎片
因为 block 是固定大小的,物理上不需要连续:
- 任何空闲 block 都可以分配给任何请求;
- 不会出现“总空间够但没有连续空间”的问题;
- 外部碎片基本消除。
3、支持前缀共享
多个请求如果有相同前缀,可以:
- 让它们的逻辑 block 指向相同的物理 block;
- 共享这部分 KV Cache;
- 通过引用计数管理,避免重复存储。
这在以下场景非常有用:
- 相同的 system prompt;
- few-shot 示例相同;
- 并行采样,同一个 prompt 生成多个回答;
- beam search。
4、支持 Copy-on-Write
共享的 block 如果某个请求要修改:
- 不直接改共享 block;
- 而是复制一份新的物理 block;
- 再修改。
这和操作系统的写时复制机制一致,保证共享安全。
5、显存利用率高,吞吐提升
显存利用率提升后:
- 能同时容纳更多请求;
- batch size 更大;
- GPU 利用率更高;
- 吞吐显著提升。
vLLM 论文报告,PagedAttention 相比传统方式,吞吐可以提升 2 到 4 倍,尤其是长序列、大并发场景。
6、支持动态批处理和连续批处理
因为 block 可以灵活分配和回收:
- 新请求可以随时加入;
- 完成的请求可以立即释放 block;
- 和连续批处理天然契合。
五、PagedAttention 的工作流程
1、预填充阶段
处理 prompt 时:
- 计算所有 prompt token 的 K、V;
- 按 block 大小切分;
- 为每个逻辑 block 分配物理 block;
- 写入 block table。
2、解码阶段
每生成一个新 token:
- 计算当前 token 的 K、V;
- 找到最后一个逻辑 block;
- 如果没满,追加进去;
- 如果满了,分配新物理 block;
- 更新 block table。
3、注意力计算
计算注意力时:
- 通过 block table 找到所有物理 block;
- 按逻辑顺序读取 K、V;
- 和当前 Q 做注意力。
因为 block 在物理上离散,所以叫 PagedAttention。
4、请求结束
请求完成后:
- 释放它占用的所有物理 block;
- 引用计数减一;
- 如果引用计数为 0,block 回收到空闲池。
六、和传统 KV Cache 管理的对比
| 维度 |
传统方式 |
PagedAttention |
| 分配方式 |
预分配连续显存 |
按需分配固定大小 block |
| 内部碎片 |
严重 |
几乎消除 |
| 外部碎片 |
严重 |
基本消除 |
| 显存利用率 |
20% 到 40% |
90% 以上 |
| 前缀共享 |
不支持 |
支持 |
| Copy-on-Write |
不支持 |
支持 |
| 动态批处理 |
不友好 |
天然支持 |
| 吞吐 |
较低 |
提升 2 到 4 倍 |
七、PagedAttention 的代价和限制
1、实现复杂
需要:
- block table 管理;
- 物理 block 分配和回收;
- 引用计数;
- Copy-on-Write;
- 定制化的注意力 kernel。
2、Kernel 需要专门优化
因为 KV Cache 在物理上不连续,标准的注意力 kernel 不能直接用,需要专门实现 PagedAttention kernel。
3、block 大小需要调优
block 太大:
block 太小:
通常需要根据模型和负载调优。
4、对某些场景收益有限
如果请求长度都差不多,且都很短,传统方式浪费不大,PagedAttention 收益就没那么明显。
八、简单评价这道面试题
1、这道题的价值
- 这是大模型推理优化中非常经典的一道题;
- 一道题能考察 KV Cache 管理、显存碎片、分页思想、前缀共享等多个核心概念;
- 区分度好,初级可能只知道 vLLM 快,中级能说清 PagedAttention 原理,高级能讲清 block table、Copy-on-Write 和实际调优;
- 贴近实战,vLLM 是目前最主流的推理框架之一。
2、这道题的不足
- 题目偏具体,如果候选人没用过 vLLM,可能答不上来;
- 没有涉及和 Continuous Batching、Prefix Caching 的配合;
- 对 kernel 实现细节考察不够;
- 没有涉及多卡、分布式推理下的 PagedAttention。
3、建议的追问方向
- PagedAttention 的 block 大小怎么选?太大太小各有什么问题?
- block table 具体怎么设计?
- Copy-on-Write 在什么场景下触发?
- PagedAttention 和 Continuous Batching 怎么配合?
- Prefix Caching 和 PagedAttention 是什么关系?
- PagedAttention 在多卡推理中怎么扩展?
4、总体评价
这是一道很好的大模型推理优化面试题,适合考察候选人对 KV Cache 管理和 vLLM 核心技术的理解。它既能考察操作系统分页思想的迁移,也能延伸到工程实现和性能调优。如果候选人能把 PagedAttention 解决的问题、核心思想、block table 机制、前缀共享和 Copy-on-Write 都讲清楚,基本可以判断其具备大模型推理优化的扎实基础。
评论专区
评论加载中...登录后即可发表评论