11.2 连续批处理与 PagedAttention
连续批处理和 PagedAttention 是现代推理引擎实现高吞吐量的两项核心技术。
11.2.1 静态批处理的低效
传统的静态批处理(Static Batching)将一批请求打包在一起处理,等待所有请求都完成生成后才处理下一批。
问题在于不同请求的生成长度差异巨大——有些可能只需生成 10 个词元,有些可能需要 2000 个。短请求完成后,其占用的 GPU 计算资源和显存在长请求完成之前一直空闲。这导致 GPU 平均利用率仅为 30-50%。
11.2.2 连续批处理的工作原理
连续批处理(Continuous Batching,也称 Iteration-level Batching)在每个解码步检查批次状态:
如果有请求完成生成(输出了结束标记或达到最大长度),立即将其移出批次
如果有等待中的新请求,立即将其插入空出的位置
执行一步解码,所有活跃请求并行计算
这样 GPU 始终保持满负载运行——不存在等待。在请求到达率较高的场景下,连续批处理的吞吐量可以是静态批处理的 2-10 倍。
11.2.3 PagedAttention 的设计
即使有了连续批处理,KV 缓存的显存管理仍然是瓶颈。传统做法是为每个请求预分配足够容纳最大生成长度的连续显存块。由于实际生成长度通常远小于最大值,这导致了严重的内存浪费和碎片化。
PagedAttention(Kwon 等人,2023 年)借鉴了操作系统中虚拟内存的页式管理思想:
将物理显存划分为固定大小的“页”(通常容纳 16-64 个词元的 KV 缓存)
每个请求维护一个逻辑-物理页面映射表
当请求需要更多 KV 缓存空间时,动态分配新页面
请求完成时,释放其占用的所有页面
关键优势:
消除碎片化:页面可以在物理显存中不连续分布
按需分配:不预分配最大长度,只在实际生成时分配
高效共享:多个请求可以共享相同的前缀页面(如系统提示),通过写时复制(Copy-on-Write)避免重复存储
PagedAttention 将 KV 缓存的显存利用率从 60-80% 提升到 90-95%,显著增加了可同时服务的并发请求数。
11.2.4 前缀缓存
前缀缓存(Prefix Caching)是 PagedAttention 的自然延伸——如果多个请求有相同的系统提示或共享的对话上下文前缀,它们的 KV 缓存前缀部分完全相同。前缀缓存将这些共享部分的 KV 缓存只存储一份,所有共享该前缀的请求直接引用。
在生产环境中(如客服机器人,所有对话共享同一个长系统提示),前缀缓存可以将显存占用减少 50% 以上。
最后更新于
