跳转至

五十三:vLLM-PagedAttention

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484696&idx=1&sn=f4e624b8a40cba0af217675866115527&chksm=f01eb661c7693f77165246961715200a129c95991c65242e0d381fcba7bac88e52bf51c6ecb3#rd

1. 学习范围

本日主题是 vLLM,重点是PagedAttention,同时覆盖 continuous batching 和 vLLM 推理架构。

img

本日覆盖: - vLLM 的定位和解决的问题。

  • LLM serving 的动态请求特征。

  • Continuous batching。

  • KV cache 内存碎片问题。

  • PagedAttention 的 block/page 思想。

  • Block table、logical block、physical block。

  • vLLM 调度、吞吐、延迟和显存利用率。

  • 常见面试问题和生产化注意事项。

2. vLLM 的定位

vLLM 是高吞吐 LLM 推理服务框架,核心目标是提高大模型服务的吞吐、显存利用率和并发能力。 它重点解决: - KV cache 显存浪费。

  • 请求长度动态变化。

  • batch 低效。

  • 长输出占用缓存。

  • 高并发服务调度。

vLLM 最著名的技术是 PagedAttention,并结合 continuous batching 等机制提升推理效率。

3. LLM Serving 的动态性

LLM 服务与传统 batch inference 不同: - 请求随时到达。

  • prompt 长度不同。

  • 输出长度未知。

  • 有的请求提前结束。

  • 每个请求 KV cache 动态增长。

  • 流式输出要求稳定 ITL。

静态 batch 无法很好处理这种动态负载,因此需要 continuous batching 和高效 KV cache 管理。

4. Continuous Batching

Continuous batching 是动态批处理机制。在每个 decode step,调度器可以把新请求加入 batch,把完成请求移出 batch。 传统 batching:

等一批请求全部完成后再处理下一批
Continuous batching:

每一步动态更新活跃请求集合
它显著提升 GPU 利用率和吞吐,尤其适合请求长度差异大的在线服务。

5. Continuous Batching 的挑战

挑战包括: - 活跃序列长度不同。

  • KV cache 长度不同。

  • 新请求 Prefill 与旧请求 Decode 混合。

  • 完成请求释放缓存。

  • 调度公平性。

  • TTFT 与吞吐平衡。

Continuous batching 必须依赖高效 KV cache 管理,否则动态请求会造成显存碎片。

6. KV cache 碎片问题

img 传统 KV cache 分配常按最大长度或连续空间分配。请求长度不同会造成浪费和碎片。 问题: - 短请求占用过大预留空间。

  • 请求完成后留下不连续空洞。

  • 逻辑序列增长需要连续扩容。

  • 显存利用率低。

PagedAttention 的动机就是用分页方式管理 KV cache。

7. PagedAttention 的核心思想

PagedAttention 借鉴操作系统虚拟内存思想,把每个序列的 KV cache 切成固定大小的 blocks。 img

逻辑上:

sequence tokens -> logical blocks
物理上:

logical blocks -> physical KV blocks
一个请求的逻辑 block 可以映射到非连续的物理 block,因此不需要连续显存。

8. Logical Block 与 Physical Block

Logical block 是某个序列内部的逻辑 token 分块。Physical block 是 GPU 显存中实际存放 KV 的块。 Block table 记录映射关系:

logical block 0 -> physical block 17
logical block 1 -> physical block 42
logical block 2 -> physical block 8
attention kernel 根据 block table 找到历史 K/V。

9. Block Size

Block size 是每个 KV block 存放的 token 数。block size 影响: - 内部碎片。

  • block table 长度。

  • kernel 访问效率。

  • 调度开销。

  • 显存利用率。

太大浪费多,太小管理开销高。需要在显存效率和 kernel 效率之间取舍。

10. Block Manager

Block Manager 负责分配、释放和复用 physical blocks。 职责: - 为新 token 分配 block。

  • 请求结束后释放 block。

  • 维护 free list。

  • 管理引用计数。

  • 支持 prefix sharing 或 copy-on-write。

Block Manager 是 vLLM 显存效率的核心组件之一。

11. PagedAttention 的优势

优势: - 减少 KV cache 内存浪费。

  • 缓解外部碎片。

  • 支持动态增长。

  • 提高并发。

  • 更适合 continuous batching。

  • 支持 prefix cache 和共享。

它让显存利用率更接近真实 token 数,而不是最大预留长度。

12. PagedAttention 的代价

代价包括: - block table 查找开销。

  • kernel 实现复杂。

  • block size 需要调优。

  • 对硬件和 attention kernel 优化要求高。

  • 调试复杂。

因此 PagedAttention 是系统工程优化,不只是一个简单数据结构。

13. vLLM Scheduler

img vLLM 调度器决定哪些请求进入本轮执行,包括 Prefill 和 Decode。 调度考虑: - 新请求等待时间。

  • 活跃序列数量。

  • KV block 可用量。

  • token budget。

  • prompt 长度。

  • 最大并发。

  • 是否流式输出。

调度器要在 TTFT、TPOT、吞吐和公平性之间平衡。

14. Prefill 与 Decode 调度

vLLM 需要处理新请求的 Prefill 和已有请求的 Decode。 典型冲突: - 大 Prefill 提高 TTFT 压力。

  • Decode 需要稳定逐 token 输出。

  • KV block 不足时新请求无法进入。

调度器可能使用 token budget 或 chunked prefill 来避免大 prompt 阻塞 Decode。

15. Chunked Prefill

Chunked prefill 把长 prompt 的 Prefill 拆成多个 chunk 执行,避免一次大 Prefill 长时间占用 GPU。 收益: - 降低 Decode 卡顿。

  • 改善公平性。

  • 控制单轮 token budget。

代价: - TTFT 可能变化。

  • 调度更复杂。

  • 中间状态管理更多。

16. Prefix Caching

vLLM 支持通过缓存共享前缀来减少重复 Prefill。对于相同系统 prompt 或长模板,多请求可以复用前缀 KV。 关键问题: - cache key。

  • hash。

  • 权限隔离。

  • 引用计数。

  • copy-on-write。

Prefix caching 与 PagedAttention 的 block 管理天然相关。

17. Parallel Sampling

并行采样或多候选生成中,多个输出共享同一 prompt 前缀。Paged block 可以让多个序列共享 prefix blocks,然后在分叉后使用新 blocks。 这类似 copy-on-write:共享不变前缀,变化部分单独写入。

18. vLLM 的吞吐优势来源

吞吐提升来自: - continuous batching 提升 GPU 利用率。

  • PagedAttention 提升 KV 显存利用率。

  • 动态调度减少空闲。

  • prefix caching 减少重复 Prefill。

  • 优化 attention kernel。

核心是同时提升算力利用和显存利用。

19. vLLM 与普通 Transformers 推理

普通 Transformers 推理更适合单请求或小批量离线推理。vLLM 更适合在线高并发 serving。 差异: - 动态 batch。

  • KV 分页管理。

  • 请求调度器。

  • 服务接口。

  • 多请求并发优化。

20. 性能指标

评估 vLLM 应关注: - TTFT。

  • TPOT。

  • tokens/s。

  • requests/s。

  • active sequences。

  • KV block usage。

  • cache hit rate。

  • GPU utilization。

  • P95/P99 latency。

  • OOM / preemption。

不能只看平均 tokens/s。

21. 常见失败模式

常见失败包括: - block size 配置不合适。

  • KV block 不足。

  • 长 prompt 阻塞 Decode。

  • prefix cache 权限隔离不足。

  • 过高并发导致 P99 恶化。

  • 过度追求吞吐导致 TTFT 变差。

  • 长尾请求占用大量 block。

  • 调度策略不适合业务 SLO。

22. 生产化建议

生产使用 vLLM 时应: - 按业务负载压测。

  • 设置最大 prompt/output 长度。

  • 监控 KV block。

  • 监控 P95/P99 TTFT/TPOT。

  • 区分流式和非流式 SLO。

  • 小心 prefix cache 的隔离。

  • 为长请求设置策略。

  • 比较不同 block size 和调度配置。

23. 核心总结

vLLM 的核心是为在线 LLM serving 解决动态 batch 和 KV cache 管理问题。Continuous batching 让请求可以动态加入和退出 batch,PagedAttention 用分页方式管理 KV cache,降低碎片和浪费,提高并发和吞吐。 面试表达时应突出: - vLLM 不是模型,而是推理服务框架。

  • PagedAttention 解决 KV cache 内存管理问题。

  • Continuous batching 解决动态请求调度问题。

  • 二者结合提升高并发在线推理吞吐。

24. 参考资料

  • vLLM PagedAttention documentation: https://docs.vllm.ai/en/stable/design/paged_attention.html

  • vLLM documentation: https://docs.vllm.ai/

  • vLLM diagram overview: https://fy2462.github.io/2024/09/vllm-diagram-overview/

  • Continuous batching 介绍: https://zhuanlan.zhihu.com/p/654259045

  • 10 分钟速通 vLLM: https://www.bilibili.com/video/BV1kx4y1x7bu/

            预览时标签不可点
    

    <div class="