# PagedAttention：KV 不连续，为什么仍然能读对？

中文合成旁白 · 1280×720 · 20 fps · 112.84 秒

**00:00:00,000 · KV 为什么增长**
分页注意力解决的核心问题，是历史 KV 缓存怎么存。先看它为什么会不断增长。

**00:00:07,641 · KV 为什么增长**
每处理一个新位置，就产生新的 K 和 V，加入缓存；注意力读取历史与当前位置的 KV。请求越长，缓存越大。

**00:00:17,706 · 最大长度预留**
假设三个请求，当前长度是十七、三十三和八。有效数据一共占五十八个 token 槽位。

**00:00:25,775 · 最大长度预留**
如果每个请求都按最大长度六十四预留，就分配了一百九十二个槽位，其中一百三十四个暂时空着。

**00:00:34,030 · 分页与块表**
分页把每个请求的逻辑位置切成小块。每块十六个位置，三个请求只需要二块、三块和一块。

**00:00:42,734 · 分页与块表**
合计六个块，也就是九十六个槽位。有效数据仍是五十八，已分配块里的空闲降到三十八。

**00:00:51,017 · 分页与块表**
同一个请求的物理块可以不相邻。块表记住逻辑块对应的物理块，注意力内核按表找到数据。

**00:00:59,033 · 分页与块表**
例如读取 A 的第十七个位置。它属于第二个逻辑块，块内偏移为零。查表后，去物理块二读取。

**00:01:07,875 · 增长与回收**
A 从十七增长到十八，还能写进已有的第二块。从三十二到三十三，才需要申请第三个块。

**00:01:16,456 · 增长与回收**
请求 C 结束后，它的物理块五可以回到空闲池。确认设备不再访问这块后，新请求才能复用。

**00:01:25,024 · 收益与边界**
省下缓存空间，就有机会承载更多并发请求，提高服务吞吐。但单个请求不保证因此更快。

**00:01:33,784 · 收益与边界**
分页没有压缩每个 KV 元素，也没有自动完成前缀复用。最后一个块的空闲和块表开销仍然存在。

**00:01:42,386 · 收益与边界**
记住这条路线：逻辑位置，查块表，找到物理块。系统分配和注意力内核，必须使用同一套映射。

## 教学假设
容量例子：A/B/C 长度为 17/33/8，最大预留各 64，块大小 16。单位为 token 槽位，不是字节；未计块表与空闲池。A 的逻辑块映射为 [7,2]，B 为 [4,9,1]，C 为 [5]。物理分散不改变逻辑顺序。

## 原始资料
- [PagedAttention 原始论文](https://arxiv.org/abs/2309.06180)