Hotdry.

Article

PagedAttention 动态内存分页:vLLM 高吞吐推理的 KV Cache 调度实践

深入解析 vLLM 的 PagedAttention 机制,从内存分页原理到请求调度策略,提供可落地的 KV Cache 管理参数与性能调优清单。

2026-06-12ai-systems

大模型推理服务的核心瓶颈往往不在计算而在内存。当 batch size 增大或序列变长时,KV Cache 的内存占用呈线性膨胀,导致 GPU 显存快速耗尽、吞吐量骤降。vLLM 提出的 PagedAttention 机制借鉴操作系统虚拟内存的分页思想,将连续的 KV Cache 拆解为离散的内存块,配合动态调度策略实现了显存的高效复用。

内存碎片化的根源

传统 LLM 推理采用静态内存分配:为每个请求预留从当前长度到最大生成长度的连续显存空间。这种 "预分配" 策略导致两个问题:一是实际生成长度不确定,预留空间往往大量闲置;二是不同长度的序列造成严重的内部和外部内存碎片。当服务需要同时处理数百个并发请求时,显存利用率可能不足 30%,大量 GPU 计算资源因内存不足而空转。

PagedAttention 的核心洞察在于:KV Cache 的访问模式具有时间局部性,推理过程中只需访问当前位置的 Key 和 Value,无需保持物理连续性。因此可以将 KV Cache 切分为固定大小的块(block),通过块表(block table)维护逻辑到物理的映射关系。

分页机制的核心设计

块粒度与块表

PagedAttention 将 KV Cache 划分为大小固定的块,典型配置为每块存储 16 个 token 的 Key 和 Value 向量。每个序列维护一个块表,记录该序列的 KV 数据分布在哪些物理块上。块表支持动态扩展 —— 当序列生成新 token 时,从全局内存池中分配空闲块并追加到块表尾部。

这种设计的优势在于物理内存的离散化存储。序列的逻辑连续性通过块表维护,物理块可以分散在显存的任意位置,彻底消除了外部碎片。同时,块大小是内存分配的最小单位,内部碎片被限制在一个块范围内(最大 15 个 token 的浪费),相比预分配策略有数量级的提升。

写时复制与内存共享

PagedAttention 实现了块级别的写时复制(Copy-on-Write)机制。当多个序列共享相同的 KV Cache 前缀时(如批量解码中的 beam search 或并行采样),它们可以引用相同的物理块。只有当某个序列需要写入新的 KV 数据时,才触发块的复制操作。

这一机制对自回归生成尤为重要。在 beam search 场景中,多个候选序列从相同的 prompt 开始,仅在生成阶段出现分叉。通过共享 prompt 对应的物理块,显存占用从 "候选数 × prompt 长度" 降至 "prompt 长度 + 分叉部分",内存效率提升与 beam width 成正比。

请求调度与内存复用

调度器架构

vLLM 的调度器维护三个关键数据结构:等待队列(Waiting Queue)、运行队列(Running Queue)和交换队列(Swapped Queue)。新到达的请求首先进入等待队列,调度器根据当前显存状况决定哪些请求可以加入运行队列。

调度决策的核心约束是:运行队列中所有请求的 KV Cache 块总数不能超过 GPU 显存容量。调度器采用贪心策略,从等待队列中按 FIFO 顺序选择请求,累加其预估的块需求,直到触及显存上限。这种 "尽力而为" 的批处理策略最大化了 GPU 利用率,同时保证不触发 OOM。

动态块分配与回收

每个请求的块需求是动态变化的。调度器基于当前序列长度和最大生成长度计算所需块数,但实际分配采用惰性策略 —— 仅在生成新 token 时才申请新块。当请求完成或取消时,其占用的块立即归还到全局内存池,供其他请求复用。

对于长序列场景,vLLM 支持块交换(block swapping)机制:当显存不足时,将部分非活跃的 KV 块卸载到 CPU 内存,需要时再从 CPU 加载回 GPU。这一机制以延迟换吞吐,使得单卡可以服务远超显存容量的并发请求数。

可落地的调优参数

基于 PagedAttention 的内存管理,以下是生产环境的关键配置项:

块大小(block_size):通常设为 16。增大块大小减少块表开销,但增加内部碎片;减小块大小提高内存利用率,但增加元数据管理成本。对于超长序列场景(如 128K context),可尝试 32 或 64 以摊销块表查询开销。

GPU 内存利用率上限(gpu_memory_utilization):建议设为 0.85-0.9。预留 10-15% 显存给 CUDA kernel 的临时分配和系统开销,避免推理过程中因显存碎片导致 OOM。

最大序列数(max_num_seqs):根据模型规模和业务并发模式设定。对于 7B 模型在 24GB 显存上,通常可支持 256-512 个并发序列;70B 模型在 80GB 显存上约为 64-128 个。

交换空间(swap_space):配置为 GPU 显存的 2-4 倍。当启用 prefix caching 或处理变长序列时,充足的 CPU 交换空间允许调度器更激进地预加载和缓存 KV 块。

Prefix caching 开关(enable_prefix_caching):对于多轮对话或重复 prompt 场景务必开启。通过缓存共享前缀的 KV 块,可将首 token 延迟(TTFT)降低 50% 以上。

性能监控要点

部署 PagedAttention 后,建议监控以下指标:

  • GPU 显存利用率:目标保持在 80-90%,过低说明批处理不足,过高可能触发交换导致延迟抖动。
  • 块分配延迟:衡量从内存池获取空闲块的开销,持续高值提示需要增大块大小或优化内存池实现。
  • 交换带宽:监控 CPU-GPU 间的块交换速率,频繁交换表明显存容量成为瓶颈,需考虑模型量化或扩容。
  • KV Cache 命中率:prefix caching 生效程度的直接指标,低于 30% 建议检查业务场景是否适合前缀复用。

技术边界与取舍

PagedAttention 并非万能方案。块表查询引入了额外的 GPU kernel 开销,在序列极短(<32 tokens)或 batch size 极小的场景下,管理开销可能抵消内存收益。此外,块交换机制以延迟换吞吐,对延迟敏感型服务(如实时对话)需要谨慎配置交换策略。

对于多模态模型,KV Cache 的维度更高(包含视觉 token 的 Key/Value),块大小的选择需要重新权衡。建议从 8 开始测试,根据显存碎片率和吞吐表现逐步调整。

PagedAttention 代表了 LLM 推理系统从 "计算优化" 向 "内存优化" 演进的关键一步。通过将操作系统成熟的虚拟内存技术引入深度学习推理,vLLM 在不修改模型结构的前提下实现了数倍的吞吐提升。对于需要支撑高并发 LLM 服务的团队,深入理解并调优这一机制是提升资源效率的必修课。


资料来源

ai-systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com