大模型推理框架 vLLM 为什么吞吐高?PagedAttention 和连续批处理是什么?

第 1229 题 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. 问题一:KV Cache 的显存浪费
  3. PagedAttention:像虚拟内存一样管理 KV Cache
  4. 问题二:静态批处理的等待
  5. 连续批处理:按迭代调度
  6. 其他常见优化
  7. 落地时关注的指标

面试怎么回答

vLLM 吞吐高主要靠两点。一是 PagedAttention:传统做法按最大长度给每个请求预分配连续显存存 KV Cache,浪费和碎片很严重;PagedAttention 借鉴虚拟内存分页,把 KV Cache 切成固定大小的块,用块表映射到不连续的物理块,按需分配,相同前缀的请求还能共享物理块,显存利用率大幅提升,能容纳更多并发请求。二是连续批处理:静态批处理要等一批里最长的请求结束,短请求空等;连续批处理按每一步生成调度,完成的请求立即离开、新请求立即加入,GPU 始终忙碌。落地时用真实请求长度分布压测吞吐、首 Token 和每 Token 延迟的 P99、显存和 KV Cache 使用率。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

私有化部署大模型时,vLLM 几乎是绕不开的推理框架之一。面试官问它为什么吞吐高,其实是在考两个核心技术:PagedAttention 和连续批处理。这两个思路,数据开发同学用操作系统和调度的知识就能理解。

问题一:KV Cache 的显存浪费

传统做法给每个请求按「最大可能长度」预先分配一块连续的显存存放 KV Cache:

  • 请求实际输出可能很短,大部分预留的显存没用上;
  • 不同长度的请求分配和释放后,显存产生碎片;
  • 结果是显存明明还有很多,能同时处理的请求却很少。

PagedAttention:像虚拟内存一样管理 KV Cache

借鉴操作系统的分页机制:

  • 把 KV Cache 切成固定大小的块(block),每块存若干个 Token 的 K、V;
  • 每个请求维护一张「块表」,记录逻辑上的第几块对应物理显存里的哪一块;
  • 按需分配:生成到需要新块时才分配,不预留;
  • 物理块不需要连续,几乎没有碎片;
  • 共享:多个请求的相同前缀(比如同一个系统提示),可以指向同一组物理块,采用写时复制。

效果是显存利用率大幅提高,同样的显存能装下多得多的请求,批次更大,吞吐更高。

问题二:静态批处理的等待

传统的静态批处理:凑够一批请求一起处理,要等这一批里最长的请求生成完,整批才结束,新请求才能进来。短请求生成完了也只能空等,GPU 被浪费。

连续批处理:按迭代调度

  • 调度的粒度从「一批请求」变成「每一步生成」;
  • 每一步之后,已经完成的请求立即离开,排队的新请求立即加入;
  • 批次里始终是活跃的请求,GPU 利用率高。

这就像调度系统里,任务完成后立即释放资源给下一个任务,而不是等一整批任务都完成。

其他常见优化

现代推理框架还提供前缀缓存、量化、推测解码、张量并行等能力,用于进一步提升性能或支持更大的模型。

落地时关注的指标

  • 吞吐(每秒 Token 数、每秒请求数);
  • 首 Token 延迟和每 Token 延迟的 P50、P99;
  • 显存利用率、KV Cache 使用率、排队长度。

用自己业务的真实请求长度分布去压测,比看公开的基准数据更有参考价值。