跳转到内容

PagedAttention 怎么管理 KV?它和 FlashAttention 是一回事吗?

PagedAttention 把 KV cache 分成固定大小的块,按需分配。一个请求的逻辑块可以映射到不连续的显存块,注意力 kernel 按映射读取数据,减少连续大块预留造成的浪费。

请求每生成一些 Token,就申请新的块;结束后释放。若每个请求一开始按最大输出长度留空间,短输出会浪费很多显存。分页可以改善这种浪费,但最后一个未填满的块仍有内部碎片。

请求 A 逻辑块0、1、2物理块映射7、2、9请求 B 逻辑块0、1物理块映射4、6注意力 kernel按映射读取 KV请求结束归还块到空闲池新请求按需分配

FlashAttention 通过分块与数据复用,减少注意力计算时对显存的读写,避免完整保存庞大的注意力矩阵。PagedAttention 关注服务中 KV 的存放和访问。两者可以在适当实现中配合使用,不能把“分页”理解为把注意力计算量消掉。

分页也不改变每个 KV 元素需要的字节数。输出持续增长,已分配的块照样会增加;显存不足时仍需要限制准入、抢占或其他策略。

小块可能减少尾部浪费,但映射、管理和访问开销也会变化。块大小与 kernel、模型结构和负载有关,不能只看碎片率。

实现支持时,相同前缀的只读块可复用;修改共享尾部需要复制或等效隔离。引用计数和释放规则要正确,否则可能提前释放其他请求仍在使用的 KV。

资料

核对于 2026-10-13。阿里 DashInfer SpanAttention、PagedAttention 原始论文、FlashAttention 原始论文。物理块编号为示意,不是实际地址。