11.2 连续批处理与 PagedAttention

连续批处理和 PagedAttention 是现代推理引擎实现高吞吐量的两项核心技术。

11.2.1 静态批处理的低效

传统的静态批处理(Static Batching)将一批请求打包在一起处理,等待所有请求都完成生成后才处理下一批。

问题在于不同请求的生成长度差异巨大——有些可能只需生成 10 个词元,有些可能需要 2000 个。短请求完成后,其占用的 GPU 计算资源和显存在长请求完成之前一直空闲。这导致 GPU 平均利用率仅为 30-50%。

11.2.2 连续批处理的工作原理

连续批处理(Continuous Batching,也称 Iteration-level Batching)在每个解码步检查批次状态:

  1. 如果有请求完成生成(输出了结束标记或达到最大长度),立即将其移出批次

  2. 如果有等待中的新请求,立即将其插入空出的位置

  3. 执行一步解码,所有活跃请求并行计算

这样 GPU 始终保持满负载运行——不存在等待。在请求到达率较高的场景下,连续批处理的吞吐量可以是静态批处理的 2-10 倍

11.2.3 PagedAttention 的设计

即使有了连续批处理,KV 缓存的显存管理仍然是瓶颈。传统做法是为每个请求预分配足够容纳最大生成长度的连续显存块。由于实际生成长度通常远小于最大值,这导致了严重的内存浪费和碎片化

PagedAttention(Kwon 等人,2023 年)借鉴了操作系统中虚拟内存的页式管理思想:

  1. 将物理显存划分为固定大小的“页”(通常容纳 16-64 个词元的 KV 缓存)

  2. 每个请求维护一个逻辑-物理页面映射表

  3. 当请求需要更多 KV 缓存空间时,动态分配新页面

  4. 请求完成时,释放其占用的所有页面

关键优势:

  • 消除碎片化:页面可以在物理显存中不连续分布

  • 按需分配:不预分配最大长度,只在实际生成时分配

  • 高效共享:多个请求可以共享相同的前缀页面(如系统提示),通过写时复制(Copy-on-Write)避免重复存储

PagedAttention 将 KV 缓存的显存利用率从 60-80% 提升到 90-95%,显著增加了可同时服务的并发请求数。

11.2.4 前缀缓存

前缀缓存(Prefix Caching)是 PagedAttention 的自然延伸——如果多个请求有相同的系统提示或共享的对话上下文前缀,它们的 KV 缓存前缀部分完全相同。前缀缓存将这些共享部分的 KV 缓存只存储一份,所有共享该前缀的请求直接引用。

在生产环境中(如客服机器人,所有对话共享同一个长系统提示),前缀缓存可以将显存占用减少 50% 以上

最后更新于