重温 vLLM 中的 PagedAttention
vLLM introduced PagedAttention, which borrows the paging abstraction that operating systems use for RAM and applies it to the GPU’s KV cache. During LLM inference, the KV cache – the stored key and value tensors for all previous tokens – is the dominant memory consumer. Managing it efficiently is the central challenge of high-throughput inference.vLLM 引入了 PagedAttention 技术该技术借鉴了操作系统为内存RAM设计的分页抽象机制paging abstraction并将其应用于 GPU 的 KV 缓存。在大语言模型推理过程中KV 缓存——即所有先前 token 的存储KV张量——是主要的内存消耗者。高效管理 KV 缓存是高吞吐量推理的核心挑战KV Cache 计算公式BF16 每个数值占 2 ByteMHA → MQA → GQAMHA 多头注意力原始标准LLaMA1 7B/13B 用Multi-Head AttentionQ、K、V 头数量完全相等40 个 Q 头 40 个 K 头 40 个 V 头。推理时 KV Cache 要存和 Q 一样多的 KV 头显存占用极大就是 KV 公式里的 H 会很大MQA 多查询注意力极端简化Multi-Query Attention很多 Q 头 共享同一组 K/V 头。例40 个 Q 头共用 1 个 K 头 1 个 V 头。KV Cache 极小但精度掉得比较明显GQA 分组查询注意力LLaMA2/3 70B、大模型主流方案Grouped-Query AttentionGQA 分组查询注意力MHA 和 MQA 的折中方案把全部 Query 头分成若干组每一组内所有 Q 头共用同一对 K/V 头KV 头数量远少于 Q 头但比 MQA 的单 KV 头多精度损失可控Llama3-70B 真实配置Query 头总数128 个分成 16 组每组 8 个 Q 头每组对应 1 组 KV 头所以 KV 头 H 8GQA 优点KV 头变少KV Cache 显存占用暴跌推理吞吐大幅提升相比 MQA分组保留更多 KV 信息模型能力、生成质量衰减很小训练、推理框架原生支持vLLM、TensorRT-LLM、Transformers缺点训练成本比纯 MHA 略高小模型7B 及以下一般不用 GQA收益不明显还是 MHAKV Cache Fragmentation 的问题fragmentationˌfræɡmenˈteɪʃnn. 破碎分裂分段储存传统推理系统会为每条请求序列的 KV Cache 预分配一块连续显存contiguous memory分配大小按模型支持的最大序列长度预留。这种朴素分配方式会造成两类显存浪费内部碎片Internal fragmentation一条实际只生成 500 个 token 的对话却独占一块预留 4096 token 容量的连续显存块剩余 3596 个 token 对应的缓存空间全程闲置造成显存空洞浪费。外部碎片External fragmentation大量对话请求执行完毕释放显存后空闲显存会分裂成大量零散、不连续的小块。此时若新到来一条长序列请求即便整体空闲显存总量充足也找不到一块足够大的连续内存来完成分配导致请求无法执行。工程实测采用这种简单预分配方案时GPU 显存实际利用率通常仅 20%–40%PagedAttention – Virtual Memory for KV Cachesanalogousəˈnæləɡəsadj. 相似的类似的器官同功的PagedAttention (Kwon et al., 2023) borrows the paging abstraction from operating systems. Instead of one contiguous block per sequence, the KV cache is carved into fixed-size pages (blocks), and an indirection table—analogous to a CPU page table—translates each sequence’s logical token positions into scattered physical GPU memory addresses.PagedAttentionKwon 等2023借鉴了操作系统中的分页抽象机制。与每个序列sequence对应一个连续区块不同KV缓存被划分为固定大小的页面块并通过一个间接表类似于CPU的页表将每个序列中逻辑令牌的位置映射到分散的GPU物理内存地址上Block size块大小通常每块存储 16 个 token可配置调参。单块存储元素总量公式16 × 2 × L × H × d16块内 token 数量2Key Cache Value Cache 两份缓存Block table块映射表每条对话序列独立维护一张映射表建立逻辑块编号 → GPU 显存池内物理块编号的对应关系作用逻辑上连续的 KV 序列底层可以分散存储在不连续的物理显存块中Physical block pool物理块显存池提前预分配一批固定尺寸的显存块统一管理空闲块链表分配操作复杂度为 O(1)需要新块时直接从空闲链表头部取出一块即可无内存拷贝开销Attention kernel注意力计算内核计算注意力时依靠块映射表从多个不连续的物理显存位置收集分散的 KV 块数据完成计算Llama3-70B BF16 中L80,H8,d128BF16 每个元素占 2 Byte单块总字节为5MB4096 token 总 KV 显存单序列总块数256块PagedAttention的好处近乎零显存浪费Near-zero waste内部碎片被严格限制每条序列最多只会存在1 块未填满的分页最后一块。若分页大小为 16 token单条序列最坏仅浪费 15 个 token 对应的 KV 空间损耗可忽略不计同时彻底消除外部碎片 —— 所有分页尺寸统一、可互相复用对比传统方案传统预分配整块 4096token 缓存短会话会浪费数千 token 空间分页仅末尾一块有少量空洞动态按需分配Dynamic allocation序列随着 token 生成按需申请分页无需提前预知整条对话最终长度。这对大模型生成任务至关重要因为模型输出 token 数量无法提前确定优势不用上线前强制设定全局最大序列长度不会为未知长文本预留大量闲置显存前缀共享 Prefix sharing写时复制 copy-on-write多条拥有相同前置文本的会话例如统一系统提示词可以共用这套前缀对应的物理分页。多条会话的块映射表仅需同时指向同一批物理显存块当某条会话在前缀后生成新内容、需要修改共享分页时会触发写时复制机制单独拷贝一份分页供该会话独立使用场景固定 1000 token 系统提示词同时在线 128 位并发用户沿用 Llama3-70B 单 token 占用 327680 字节参数不开启前缀共享所有用户独立存储系统提示词 KV 缓存128 × 1000 × 327680 ÷ 10^9 ≈ 42 GB开启前缀共享仅存储 1 份系统提示词 KV 缓存 1 × 1000 × 327680 ÷ 10^9 ≈ 0.33 GB显存节省共享前缀部分显存占用直接缩减约 128 倍显存交换抢占Preemption via swapSwap 交换vLLM PagedAttention 原生支持当 GPU 显存耗尽时vLLM 可对低优先级会话执行抢占将该会话全部 KV 分页交换至 CPU 内存也可直接丢弃分页后续需要时重新计算 KV。该功能仅在分页架构下可行传统连续整块分配方案交换时必须拷贝整块巨大缓存开销极高落地价值实现 GPU 显存软扩容提升系统并发承载上限避免直接 OOM 报错GPU 显存全部物理块被占满新序列需要分配 KV 块但空闲链表为空框架挑选低优先级 / 长时间无交互的会话做抢占Preemption把该会话对应的全部物理 KV 块批量拷贝到 CPU 主内存同时在块表标记 “已交换到 CPU”释放这批 GPU 物理块分给新进来的请求若被抢占会话恢复交互再把它的 KV 块从 CPU 内存拷贝回 GPU恢复推理优缺点优点不用直接拒绝新请求提升整体并发承载上限缺点CPU ↔ GPU 内存拷贝存在 PCIe 带宽延迟恢复生成时会卡顿频繁 swap 吞吐会明显下跌重计算Recompute备选方案不长期占用 CPU 内存不把 KV 缓存存在 CPU直接丢弃被抢占序列的所有 KV 块等会话再次交互时重新前向走一遍模型从头算出全套 KV Cache代替从 CPU 加载适用上下文很短、重计算成本低于 PCIe 传输开销的场景代价需要重复执行 Transformer 层计算消耗算力PCIeThe Host-Device LinkPCIe is used for:• CPU ↔ GPU data transfers (model loading, CPU offloading)• Cross-node GPU communication when NVLink is unavailable (rare, very slow)• NVMe storage access (via CPU)Host主机端CPU 系统主内存 DRAMDevice设备端GPU、NVMe SSD、网卡等 PCIe 外设PCIeHost 和 Device 之间唯一的高速物理互联链路Host-Device Link

相关新闻

Vscode 如何配置远程环境的 ssh 连接

Vscode 如何配置远程环境的 ssh 连接

1. 在 Vscode 的扩展插件安装栏内,检索并安装 Remote - SSH,未安装过该插件的 Vscode 编辑器左侧将出现用于管理远程连接 SSH 的新图标(见步骤 2):2. 点击左侧用于管理远程连接 SSH 的新图标,再点击 SSH 栏…

2026/10/5 13:17:36 阅读更多 →
Poller模块的设计与实现

Poller模块的设计与实现

前言: 在上一文中,我们完成了 Channel 模块的代码设计与实现。通过 Channel,我们优雅地将文件描述符(fd)、感兴趣的事件掩码以及对应的业务回调函数绑定在了一起。 但是,当我们审视 Channel 的代码时&#…

2026/10/13 1:07:09 阅读更多 →
3步快速集成Android离线人脸识别SDK的完整指南

3步快速集成Android离线人脸识别SDK的完整指南

3步快速集成Android离线人脸识别SDK的完整指南 【免费下载链接】FaceAISDK_Android Android on_device Face Recognition 、 Liveness detection and 1:N & M:N Face Search SDK 端侧可离线人脸识别 活体检测 以及1:N M:N 人脸搜索SDK 项目地址: https://gitcode.com/Gi…

2026/10/3 21:40:21 阅读更多 →

最新新闻

goInception:MySQL 审核与回滚工具实战

goInception:MySQL 审核与回滚工具实战

简介:goInception 是一款集 SQL 审核、执行、备份与回滚语句生成于一体的 MySQL 运维工具,面向数据库管理员、后端开发与运维工程师,尤其适合需要规范 SQL 上线流程、降低误操作风险的团队。它通过对 SQL 进行语法解析,按自定义规…

2026/10/13 8:12:33 阅读更多 →
人口结构变化与AGI:开发者价值重估和智能体工作流

人口结构变化与AGI:开发者价值重估和智能体工作流

最近一段时间,很多开发者朋友都在聊同一个矛盾体:一边是大模型每隔几个月就有一次“能力跃迁”,各种智能体、自动化工具层出不穷,甚至有人说初级程序员要“毕业”了;另一边是宏观数据不断提醒我们,劳动力供…

2026/10/13 8:12:33 阅读更多 →
Agent成本优化:用分类器和向量检索替代大模型判断

Agent成本优化:用分类器和向量检索替代大模型判断

我用一个“不会说话”的模型,砍掉了 Agent 里五分之四的大模型调用先说结论:我改造了一个内部使用的多工具 Agent,把它每天的大模型调用量从日均十多万次降到了两万次左右。没有牺牲明显的回答质量,用户可感知的延迟反而下降了近一…

2026/10/13 8:12:33 阅读更多 →
大语言模型应用落地的完整路径:选型、提示词与工程化实践

大语言模型应用落地的完整路径:选型、提示词与工程化实践

聊到大语言模型落地,很多人的第一反应是“把提示词写漂亮点”。等到真正动手做项目,才发现事情远没有这么简单。这个系列前两篇讲了底层原理和提示词基础,这一篇就直接聚焦策略与最佳实践:模型怎么选、流程怎么搭、从零到上线要补…

2026/10/13 8:12:33 阅读更多 →
AI番茄整枝机器人 Qt信创完整项目( 适配温室打杈/侧枝修剪)

AI番茄整枝机器人 Qt信创完整项目( 适配温室打杈/侧枝修剪)

# AI番茄整枝机器人 Qt信创完整项目( 适配温室打杈/侧枝修剪) ## 项目定位 **信创国产平台(统信UOS/银河麒麟x86/aarch64)** 温室番茄AI自动整枝控制系统,针对番茄侧芽、徒长侧枝识别+修剪机械臂联动,替代人工打杈;多线程YOLO视觉识别、串口伺服剪刀控制、整枝产量统计、…

2026/10/13 8:12:33 阅读更多 →
本地部署大语言模型快速启动:选模型、搭环境、跑推理全指南

本地部署大语言模型快速启动:选模型、搭环境、跑推理全指南

上个月有个做独立开发的朋友问我,想在自己电脑上跑一个大语言模型试水,结果光是看教程就花了两天,越看越乱,最后连模型都还没下载完。这个场景我太熟悉了。大语言模型快速启动这件事,真正的瓶颈往往不是模型本身&#…

2026/10/13 8:11:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →