PagedAttention · KV缓存分页 · 显存碎片
连续批处理下,请求长短不一、随时进出,KV缓存要按最大长度预分配——大部分预分配空间空着,还碎片化。
传统做法:每个请求预分配一块连续KV缓存(按max_seq_len)。问题有三:①预分配浪费(实际生成长度常远小于max,预留的空着);②碎片化(请求结束释放的块大小不一,新请求塞不进);③写爆OOM(凑不齐连续大块,明明总剩余够却分配失败)。实测传统KV缓存显存利用率只有20~40%。
PagedAttention的洞见:attention计算不需要KV在物理上连续。把KV缓存切成固定大小block(如16个token一块),每个请求用一个block table记录自己用了哪些block——逻辑上连续,物理上离散。需要更多就再申请一个block,用完就还回池子。这就是OS虚拟内存的分页机制,搬到了GPU显存上。
点「跑一批请求」,看传统连续分配(碎片化、OOM)和PagedAttention分页(紧凑、无碎片)的显存利用率差距。同样32格显存,传统塞不下时Paged还能继续接。
组合效果:vLLM在相同硬件下,吞吐量是HF Transformers的 14~24倍,显存利用率从20%拉到80%+。这是为什么2023年后几乎所有线上大模型服务都迁移到vLLM/TGI/SGLang——PagedAttention成了推理引擎的标配。后续SGLang的RadixAttention进一步把前缀缓存做到极致,复杂Agent场景再加速。
固定block按需分配,利用率20%→80%+。
多请求共享前缀KV页,写时复制,省n倍。
常见prompt KV缓存复用,首token延迟砍半。
用多少占多少,长短请求混跑无压力。