第36章:PagedAttention Kernel 与 KV Cache 内存布局
1. 项目背景
某AI Infra团队在vLLM的PagedAttention Kernel中发现了性能回归:从v0.7升级到v0.8后,70B模型的TPOT(每Token生成时间)从45ms恶化到58ms,涨幅近30%。团队怀疑是新版PagedAttention Kernel的访存模式发生了改变——可能是Block Table的查找路径变长了,或者是Warp级别的并行粒度被调整了。
但他们面临一个问题:团队中没有人能读懂PagedAttention的CUDA Kernel源码。csrc/attention/下有多个.cu文件,每个数百行——充满了threadIdx、blockIdx、__shared__、warp shuffle等GPU内核术语。他们不知道从哪里开始读,也不知道用什么工具来profiling Kernel的性能。
更根本的问题在于:PagedAttention的"分页"思想在概念层面是清晰的(Block、Block Table),但Kernel实现中的Block、Warp、Thread这些概念和vLLM逻辑层的Block(16 Token的KV Cache单元)是完全不同的层级——理解这种"概念的嵌套"是读懂PagedAttention Kernel的关键。
痛点:PagedAttention是vLLM性能的基石。它的Kernel实现了"从分散的物理Block中读取K/V张量,计算注意力分数"的核心逻辑。不理解这个Kernel,就无法进行底层的性能优化、无法支持新硬件架构、也无法诊断注意力
