当前位置: 首页 > 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.gsyq.cn/news/1346138.html

相关文章:

  • 如何用silk-v3-decoder轻松解锁微信QQ语音文件:音频格式解放指南
  • 别再瞎找了!2026年顶尖AI论文平台榜单,免费高效产出合规稿
  • 京东宿迁具身智能数据采集社区启运:以真实数据破局产业瓶颈,传感器筑牢感知底座
  • 终极AI音乐创作工具:5分钟生成专业级歌曲翻唱
  • 免费获取B站4K超清视频:解锁大会员专享内容的完整方案
  • FineReport网络报表bug
  • Windows热键侦探:一键揪出占用你快捷键的“元凶“
  • 抖音无水印下载器:3分钟学会批量下载视频、图集和直播
  • 我的光环境检测设备
  • 用 NFS 将 Git 提交挂载为文件夹:项目开发问题与用途全揭秘
  • 如何实现高效的Web自动化测试?
  • 在Node.js后端服务中接入Taotoken调用大语言模型
  • 后端接口错误码到底该怎么设计?我见过最烂的和最优雅的两种方案
  • 浙江话AI语音项目最后通牒:2024Q3起ElevenLabs将关闭非ISO方言模型上传通道,现在必须掌握这5个迁移预案
  • FastAPI + Redis 实现接口限流:从固定窗口到滑动窗口的完整实践
  • 分享一个专门用于 SAP 开发的 Claude Code Skill 插件集合
  • Py Eddy Tracker深度解析:海洋中尺度涡旋高效识别与追踪的完整解决方案
  • 406_C++_磁盘检查流程安全重构分析:从 system/popen 到 fork/exec 的防命令注入升级
  • 独立开发者如何借助taotoken以更低成本启动ai项目
  • NotebookLM关键词提取失效?5个致命误区正在毁掉你的研究效率,立即自查!
  • 昇腾CANN实战:FlashAttention 在昇腾NPU上的实现与性能调优
  • 如何利用猫抓浏览器扩展高效嗅探和下载网页媒体资源
  • 分布式ID生成方案详解与实战
  • 新手程序员必备:收藏这份GPT大模型学习指南,从入门到精通!
  • 2026年AI编程助手综合实力排行榜
  • APP聊天服务器基本配置完成
  • 2026趋势:Gemini 3.1 Pro 音频-文本跨模态理解在教育场景中的应用可行性
  • 2026年1-3年级学习机推荐榜单:低龄AI伴学与护眼配置测评
  • 高层次人才认定与评审,选择哪家第三方机构的评价报告更稳妥?
  • Taotoken 模型广场如何帮助开发者快速进行模型选型与测试