当前位置: 首页 > news >正文

PagedAttention 与 vLLM 推理加速

1. 背景:LLM 推理的瓶颈在哪里

LLM 推理(如 GPT、LLaMA)采用自回归生成:每次只生成一个 token,每个新 token 都要"看到"之前所有 token 的信息。

输入: "今天天气" Step 1: "今天天气" → "真" 需要看 [今天天气] 的 KV Step 2: "今天天气真" → "好" 需要看 [今天天气真] 的 KV Step 3: "今天天气真好" → "啊" 需要看 [今天天气真好] 的 KV

为了避免每一步都重新计算前面所有 token 的注意力,我们把每层的 Key 和 Value 缓存下来,这就是KV Cache

KV Cache 的显存问题

KV Cache 的大小随序列长度线性增长

KV Cache=2×L×H×D×S×dtype_size\text{KV Cache} = 2 \times L \times H \times D \times S \times \text{dtype\_size}KV Cache=2×L×H×D×S×dtype_size

其中LLL= 层数,HHH= 注意力头数,DDD= 每头维度,SSS= 序列长度。

以 LLaMA-13B 为例:

  • 单条序列、2048 tokens → KV Cache 约1.6 GB
  • 批量处理多条请求时,显存很快耗尽

更大的问题:显存碎片化。传统实现为每条请求预分配一块连续显存用于 KV Cache,但实际序列长度不可预知,导致:

  • 预分配过大 →内部碎片(浪费)
  • 不同请求长度不同 →外部碎片(空隙无法利用)
  • 实测中60%~80% 的 KV Cache 显存被浪费

2. PagedAttention:核心思想

2.1 灵感来源:操作系统的虚拟内存

操作系统如何管理内存?——分页 (Paging)

传统方式(连续分配): 进程A: [████████ ] ← 预分配大块,后面浪费 进程B: [██████ ] ← 同样浪费 空闲: [ ] ← 碎片,无法利用 分页方式: 物理内存: [A][B][A][B][A][空][B][空] ← 按页分配,按需使用 进程A的页表: 页0→物理块0, 页1→物理块2, 页2→物理块4 进程B的页表: 页0→物理块1, 页1→物理块3, 页2→物理块6

PagedAttention 把同样的思路用到 KV Cache 管理上。

2.2 PagedAttention 的工作方式

核心:把 KV Cache 切分为固定大小的"页/块 (Block)",按需分配,不要求连续。

传统 KV Cache(连续分配): 请求1: [K₁V₁ K₂V₂ K₃V₃ K₄V₄ ____________] ← 预分配 8 slots,只用了 4 请求2: [K₁V₁ K₂V₂ ________________________] ← 预分配 8 slots,只用了 2 显存利用率: 6/16 = 37.5% PagedAttention(分页分配): Block 0: [K₁V₁ K₂V₂ K₃V₃ K₄V₄] ← 请求1 的 page 0(满) Block 1: [K₁V₁ K₂V₂ ________] ← 请求2 的 page 0(部分) Block 2: [空闲] ← 可随时分配给新 token 显存利用率: ≈ 100%(只有最后一个 block 有内碎片)

每个 Block 存放固定数量(如 16 个)token 的 KV 向量:

Block=block_size×(Khead_dim+Vhead_dim)\text{Block} = \text{block\_size} \times (K_{head\_dim} + V_{head\_dim})Block=block_size×(Khead_dim+Vhead_dim)

2.3 Block Table(页表)

每条请求维护一个Block Table,记录逻辑页到物理块的映射:

请求 "今天天气真好啊"(7 tokens,block_size=4): Block Table: 逻辑页 0 → 物理块 3 (存 token 0-3 的 KV) 逻辑页 1 → 物理块 7 (存 token 4-6 的 KV,还剩 1 slot) 计算 Attention 时: Q (当前 token) × K (遍历 Block 3, Block 7 中的所有 K) → Attention Scores

物理块在显存中不需要连续,通过页表间接寻址即可。

2.4 关键优势

优势说明
近零浪费只有最后一个 block 可能有少量内碎片,浪费 < 4%
动态增长新 token 生成时按需分配新 block,无需预分配
内存共享多个请求的公共前缀(如 system prompt)可共享同一物理块
高效批处理显存利用率高 → 同时服务更多请求 → 吞吐量提升

3. vLLM:基于 PagedAttention 的推理引擎

3.1 vLLM 是什么

vLLM 是由 UC Berkeley 开发的高性能 LLM 推理服务框架,核心创新就是 PagedAttention。

vLLM = PagedAttention(显存管理) + Continuous Batching(调度) + 高效 CUDA Kernel + OpenAI 兼容 API

3.2 核心技术栈

(1) PagedAttention — 显存管理

如上所述,将 KV Cache 分页管理,将显存利用率从 ~30% 提升到 ~96%。

(2) Continuous Batching — 连续批处理

传统 Batching vs Continuous Batching:

传统 Static Batching: 时间 → ████████████████ 请求1(长) ████░░░░░░░░░░░░ 请求2(短,但必须等批次结束) ████████░░░░░░░░ 请求3(中,同样等待) ↑ 短请求完成后 GPU 空转,浪费算力 Continuous Batching: 时间 → ████████████████ 请求1 ████ 请求2(完成后立即换入请求4) ████████████ 请求4(插入) ████████ 请求3 ████████ 请求5(插入) ↑ 请求完成后立刻替换,GPU 始终满载
  • 不需要等一个批次全部完成,某条请求生成完毕后立即换入新请求
  • 显著提升 GPU 利用率和整体吞吐量
(3) KV Cache 共享 — Prefix Caching

多个请求共享相同的 system prompt 时,KV Cache 可以共享物理块

请求1: [System Prompt] + "帮我写代码" 请求2: [System Prompt] + "翻译这段话" 请求3: [System Prompt] + "总结文章" 物理块 0-5: System Prompt 的 KV Cache(共享,只存一份) 请求1 → 物理块 0-5 (共享) + 物理块 10-11 (独占) 请求2 → 物理块 0-5 (共享) + 物理块 12 (独占) 请求3 → 物理块 0-5 (共享) + 物理块 13-14 (独占) 节省显存 = 2 × (System Prompt KV Cache 大小)

通过Copy-on-Write:只要请求还在读取共享块就不复制,写入新 token 时才分配新块。


4. 性能对比

指标HuggingFace TransformersText Generation Inference (TGI)vLLM
吞吐量 (tokens/s)1× (基准)~3-5×~8-24×
显存利用率~30%~60%~96%
批处理方式StaticContinuousContinuous
KV Cache 管理连续分配连续分配PagedAttention

6. 一图总结

LLM 推理瓶颈 │ ├─ 显存瓶颈:KV Cache 占用大且碎片化 │ └─ 解决 → PagedAttention(分页管理,按需分配) │ ├─ 计算瓶颈:自回归串行生成慢 │ └─ 解决 → Speculative Decoding(小模型猜测 + 大模型验证) │ └─ 调度瓶颈:短请求等长请求,GPU 空转 └─ 解决 → Continuous Batching(请求完成即替换) 三者结合 = vLLM → 吞吐量提升 8~24 倍
http://www.jsqmd.com/news/864557/

相关文章:

  • 如何用silk-v3-decoder轻松解锁微信QQ语音文件:音频格式解放指南
  • WinUtil:Windows系统优化终极指南,10分钟完成专业级配置
  • 京东宿迁具身智能数据采集社区启运:以真实数据破局产业瓶颈,传感器筑牢感知底座
  • 5分钟学会免费备份微博:Speechless插件完整使用指南
  • 预测未来--Herry
  • 一眸科技 | 情感认知智能,让AI更懂人心
  • CATLASS 算子开发:AICore 抽象硬件架构
  • 终极AI音乐创作工具:5分钟生成专业级歌曲翻唱
  • 免费获取B站4K超清视频:解锁大会员专享内容的完整方案
  • IDEA 中 Build、Maven、Run 三者的本质区别 —— 为什么你的代码在 IDE 能编译却在 CI/CD 失败?
  • FineReport网络报表bug
  • 课程管理|基于Javavue的在线课程管理系统(源码+数据库+文档)
  • 免费歌词下载神器:163MusicLyrics 终极使用指南,轻松获取网易云和QQ音乐歌词
  • Midscene.js:视觉驱动的跨平台AI自动化测试框架深度解析
  • 宁波有面子的婚宴场地
  • 鸿蒙 HarmonyOS 6 | Pura X Max 鸿蒙原生适配 10:横屏下页面从上下结构改为左右结构
  • 抖音无水印下载器:3分钟学会批量下载视频、图集和直播
  • 用 NFS 将 Git 提交挂载为文件夹:项目开发问题与用途全揭秘
  • 我的光环境检测设备
  • 如何永久保存你的微信聊天记忆?WeChatMsg终极解决方案
  • OpenPLC Editor终极指南:如何用开源工具实现工业自动化编程
  • 3步掌握ESP32-A2DP蓝牙音频传输核心原理
  • MySQL主从复制与高可用架构
  • d2s-editor:暗黑破坏神2存档编辑器的终极免费Web工具指南
  • 普通人年薪翻倍跳板:收藏这份AI大模型应用开发工程师成长指南
  • NodeMCU PyFlasher:告别命令行困扰,3步搞定ESP8266固件烧录的智能方案
  • 后端接口错误码到底该怎么设计?我见过最烂的和最优雅的两种方案
  • Betaflight飞控固件2026完全指南:从入门到精通的7个实用技巧
  • NotebookLM智能摘要失真问题(底层token切分逻辑与人工校准SOP)
  • 终极指南:如何免费获取Cursor Pro功能,轻松突破试用限制