一、核心结论
PagedAttention 的 kernel 和传统 Attention kernel 最大的区别在于:
传统 Attention kernel 假设 KV Cache 在显存中是一段连续的、按序列顺序排列的空间;PagedAttention kernel 则把 KV Cache 切成固定大小的 block,通过 block table 做逻辑到物理的映射,允许 KV Cache 在物理显存上离散存储。
这个变化带来的直接结果是:
- 显存碎片大幅减少,利用率从 20%–40% 提升到 90% 以上;
- 支持前缀共享和 Copy-on-Write;
- 能同时服务更多请求,吞吐提升 2–4 倍。
一句话总结:PagedAttention 把操作系统的分页思想搬到了 KV Cache 管理上,让 Attention kernel 从“访问连续内存”变成“通过 block table 访问离散内存”。
二、传统 Attention kernel 的显存访问模式
1、连续预分配
传统推理框架对每个请求:
- 按最大可能序列长度预分配一段连续显存;
- 这段显存存放该请求所有 token 的 K、V;
- K 和 V 通常按层、按头、按 token 顺序排列。
访问时,kernel 直接按连续地址读取。
2、访问模式
对于第 $t$ 个 token 的注意力计算:
- 需要读取前 $t$ 个 token 的所有 K、V;
- 地址是连续的;
- 步长固定。
这种模式对 kernel 友好:
3、问题
连续预分配带来:
- 内部碎片:预分配长度远大于实际长度;
- 外部碎片:不同请求长度不同,显存被切碎;
- 无法共享:相同前缀不能共享;
- 利用率低:20%–40%。
三、PagedAttention kernel 的显存访问模式
1、分块存储
PagedAttention 把 KV Cache 分成固定大小的 block:
- 每个 block 存 $B$ 个 token 的 K、V;
- block 是显存分配的基本单位;
- 逻辑上连续的 KV Cache 在物理上可以离散。
2、Block Table
每个请求维护一张 block table:
$$
\text{逻辑 block } i \rightarrow \text{物理 block } j
$$
kernel 访问时:
- 先查 block table;
- 找到物理 block;
- 再读取 block 内的 K、V。
3、访问模式的变化
传统模式:
PagedAttention 模式:
- 按 block 读取;
- 每个 block 地址来自 block table;
- block 之间不连续。
这相当于把“连续数组访问”变成“间接索引访问”。
4、对 kernel 的影响
- 不能直接用标准连续访存的 kernel;
- 需要定制 kernel,支持 block table 查表;
- 需要处理 block 边界;
- 需要支持不同请求的 block 数量不同。
四、为什么能提升显存利用率
1、几乎消除内部碎片
按需分配:
- 生成新 token 才分配 block;
- 最后一个 block 可能没满,但浪费最多一个 block;
- 平均浪费约 $B/2$。
相比预分配最大长度,浪费大幅降低。
2、消除外部碎片
block 固定大小:
- 任何空闲 block 可以分配给任何请求;
- 不需要连续空间;
- 不会出现“总空间够但没有连续空间”的问题。
3、支持前缀共享
多个请求如果有相同前缀:
- 逻辑 block 指向相同物理 block;
- 引用计数管理;
- 避免重复存储。
典型场景:
- 相同 system prompt;
- few-shot 示例相同;
- 并行采样、beam search。
4、支持 Copy-on-Write
共享 block 被修改时:
- 复制一份新 block;
- 再修改;
- 保证共享安全。
5、利用率提升
综合以上:
- 显存利用率从 20%–40% 提升到 90% 以上;
- 同样显存能服务更多请求。
五、为什么能提升吞吐
1、更多并发请求
显存利用率提升后:
- 能同时容纳更多请求;
- batch size 更大;
- GPU 利用率更高。
2、减少显存分配开销
block 分配和回收是固定大小:
3、支持连续批处理
block 可以灵活分配和回收:
- 新请求随时加入;
- 完成的请求立即释放;
- 和连续批处理天然契合。
4、减少重复计算
前缀共享后:
- 相同前缀只算一次;
- 多个请求复用;
- 节省计算和显存。
5、提升 Decode 阶段效率
Decode 阶段是显存带宽受限:
- 读取 KV Cache 是主要开销;
- PagedAttention 让 KV Cache 布局更紧凑;
- 减少无效读取;
- 提升有效带宽利用率。
6、实测效果
vLLM 论文报告:
- 相比传统方式,吞吐提升 2–4 倍;
- 长序列、大并发下更明显;
- 显存利用率显著提升。
六、PagedAttention kernel 的实现要点
1、Block Table 查表
kernel 中需要:
- 读取 block table;
- 根据逻辑 block 找到物理 block;
- 计算实际地址。
2、Block 内连续访问
虽然 block 之间离散,但 block 内连续:
3、处理变长序列
不同请求:
- block 数量不同;
- 最后一个 block 可能未满;
- 需要边界处理。
4、支持多头
每个头:
- 有独立的 KV;
- block 布局可能按头组织;
- kernel 需要正确处理。
5、和 FlashAttention 结合
现代实现:
- PagedAttention 负责 KV Cache 管理;
- FlashAttention 负责注意力计算;
- 两者结合,兼顾显存和速度。
6、定制 kernel
因为访问模式特殊:
- 不能直接用标准 kernel;
- 需要专门实现;
- 需要针对 GPU 架构优化。
七、和传统 Attention kernel 的对比
| 维度 |
传统 Attention kernel |
PagedAttention kernel |
| KV Cache 布局 |
连续预分配 |
固定大小 block,离散 |
| 地址计算 |
基址 + 偏移 |
block table 查表 |
| 内部碎片 |
严重 |
几乎消除 |
| 外部碎片 |
严重 |
基本消除 |
| 前缀共享 |
不支持 |
支持 |
| Copy-on-Write |
不支持 |
支持 |
| 显存利用率 |
20%–40% |
90% 以上 |
| 吞吐 |
较低 |
提升 2–4 倍 |
| kernel 复杂度 |
简单 |
复杂 |
八、代价和限制
1、实现复杂
- block table 管理;
- 物理 block 分配回收;
- 引用计数;
- Copy-on-Write;
- 定制 kernel。
2、Kernel 需要专门优化
- 间接索引访存;
- block 边界处理;
- 不同 GPU 架构适配。
3、Block 大小需要调优
- 太大:内部碎片增加;
- 太小:block table 变大,管理开销增加。
4、对短请求收益有限
如果请求都很短且长度相近:
- 传统方式浪费不大;
- PagedAttention 收益有限。
九、简单评价这道面试题
1、这道题的价值
- 这是大模型推理优化中非常核心的一道题;
- 一道题能考察 KV Cache 管理、显存访问模式、分页思想和吞吐优化;
- 区分度好,初级可能只知道 vLLM 快,中级能说清 PagedAttention 原理,高级能讲清 kernel 访问模式和 block table;
- 贴近实战,vLLM 是目前最主流的推理框架之一。
2、这道题的不足
- 题目偏具体,如果候选人没用过 vLLM,可能答不上来;
- 没有涉及 kernel 实现细节;
- 对和 FlashAttention 的结合考察不够;
- 没有涉及多卡、分布式推理下的 PagedAttention。
3、建议的追问方向
- PagedAttention 的 block 大小怎么选?
- block table 具体怎么设计?
- Copy-on-Write 在什么场景下触发?
- PagedAttention 和 Continuous Batching 怎么配合?
- PagedAttention 和 FlashAttention 怎么结合?
- PagedAttention 在多卡推理中怎么扩展?
4、总体评价
这是一道很好的大模型推理优化面试题,适合考察候选人对 KV Cache 管理和 vLLM 核心技术的理解。它既能考察操作系统分页思想的迁移,也能延伸到 kernel 实现和性能调优。如果候选人能把 PagedAttention 的显存访问模式、block table 机制、前缀共享和 Copy-on-Write 都讲清楚,基本可以判断其具备大模型推理优化的扎实基础。
评论专区
评论加载中...登录后即可发表评论