三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

怎么理解Paged KV 改善内存管理,但不减少每 token 的 KV 数据宽度

怎么理解Paged KV 改善内存管理,但不减少每 token 的 KV 数据宽度

这句判断非常精准,它点出了“系统工程管理”“算法/架构压缩”在优化 KV Cache 时的本质区别。


一图厘清两者的分工

维度Paged KV(如 PagedAttention)架构/量化压缩(如 MLA、GQA、FP8)
优化对象内存分配与调度机制(怎么高效利用显存空间)数据物理体积(怎么把单个 Token 的特征变小)
解决的核心痛点内存预分配浪费、显存碎片化、无法共享前缀显存带宽(Bandwidth)与容量暴增
单 Token 占用字节数完全不变(原来是1.15 KB1.15\text{ KB}1.15KB,存进去依然是1.15 KB1.15\text{ KB}1.15KB大幅缩减(如从2.05 KB2.05\text{ KB}2.05KB砍到0.57 KB0.57\text{ KB}0.57KB
形象比喻聪明的仓库货架管理系统极致的抽气真空压缩袋

具体怎么理解“不减少每 Token 的数据宽度”?

  • 数据宽度由模型与精度决定:假设模型在 BF16 精度下,1 个 Token 计算出的KKK向量加VVV向量需要占据1,152 字节的物理空间。
  • Paged KV 并没有改变这 1,152 字节的内容:它没有对数据做降维、截断或低比特量化。这个 Token 进显存前是 1,152 字节,写进 Paged 显存页里依然是实打实的 1,152 字节

Paged KV 改变的到底是什么?

它改变的是“空间怎么给”,而不是“东西有多大”:

  • 传统连续分配(没用 Paged KV)
    为了防止生成过程中显存不够,系统必须提前给每个请求预留可以装下max_seq_len(比如 128k)的连续巨大显存块

  • 结果:哪怕请求最终只生成了 10 个 Token(实际只需要 11.5 KB),剩下的 128k 空间也被死死占住,其他人用不了。利用率可能不足 10%

  • 分页分配(用了 Paged KV)
    借鉴操作系统的虚拟内存机制,把显存切成固定大小的“页”(Block,如一个 Block 存 16 个 Token)。

  • 结果:生成 1 个 Token,就只往 Block 里放 1 个 Token;装满 16 个才去申请下一个离散的 Block。

  • 消除了按最大长度预留的虚高浪费,也消除了外不连续造成的显存碎片,使显存实际利用率提升到接近 100%。


总结

Paged KV 解决的是“明明显存还有空地方,却因为碎片或虚占导致装不下”的尴尬;而 MLA、GQA 或 FP8 解决的是“把单个 Token 占用的数据体量彻底砍小”的硬核压缩。两者是在不同维度协同发挥作用。

← 返回列表