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

PagedAttention 源码解析:KV Cache 怎么管理

前言长序列推理的瓶颈不是计算是显存。KV Cache 随序列长度线性增长一个 LLaMA-7B 的请求序列 4096 就要吃掉 2GB 显存。PagedAttention 的做法是把 KV Cache 切成小块按需分配显存利用率从 40% 提到 90%。下面从源码层面解析 PagedAttention 的实现。一、传统 KV Cache 的问题传统 KV Cache 是连续分配的每次请求都预留最大序列长度的空间。# 传统 KV Cache 分配classTraditionalKVCache:def__init__(self,num_layers,num_heads,head_dim,max_seq_len):self.cachetorch.zeros(num_layers,2,# K 和 Vmax_seq_len,# 预留最大长度num_heads,head_dim).npu()defupdate(self,layer_idx,kv_idx,new_k,new_v):# 直接写入预分配的空间self.cache[layer_idx,0,kv_idx]new_k self.cache[layer_idx,1,kv_idx]new_v问题显存浪费实际序列可能只有 100但预留了 4096碎片化多个请求并发时大块连续内存难分配扩展性差batch size 受限于显存不能动态调整二、PagedAttention 的核心思想把 KV Cache 切成固定大小的 blockpage按需分配。逻辑上连续物理上分散。# PagedAttention 的内存管理BLOCK_SIZE16# 每个 block 存 16 个 token 的 KVclassPagedKVCache:def__init__(self,num_blocks,block_size,num_heads,head_dim):# 预分配所有 blockself.kv_blockstorch.zeros(num_blocks,# 总 block 数2,# K 和 Vblock_size,# 每个 block 的序列长度num_heads,head_dim).npu()# 空闲 block 池self.free_blockslist(range(num_blocks))# 每个请求的 block 映射self.request_blocks{}# request_id - [block_ids]Block 映射示意图请求 1token 0-31需要 2 个 block request_blocks[1] [0, 1] 请求 2token 0-15需要 1 个 block request_blocks[2] [2] 请求 3token 0-47需要 3 个 block request_blocks[3] [3, 4, 5] Block 池状态 已使用[0, 1, 2, 3, 4, 5] 空闲[6, 7, 8, ...]三、Block 分配与释放分配 Blockdefallocate_block(self,request_id):为请求分配一个新的 blockifnotself.free_blocks:raiseRuntimeError(No free blocks available)block_idself.free_blocks.pop(0)ifrequest_idnotinself.request_blocks:self.request_blocks[request_id][]self.request_blocks[request_id].append(block_id)returnblock_iddefallocate_blocks_for_sequence(self,request_id,seq_len):根据序列长度分配足够的 blocknum_blocks(seq_lenBLOCK_SIZE-1)//BLOCK_SIZEfor_inrange(num_blocks):self.allocate_block(request_id)returnself.request_blocks[request_id]释放 Blockdeffree_request_blocks(self,request_id):请求结束后释放所有 blockifrequest_idnotinself.request_blocks:returnblock_idsself.request_blocks[request_id]self.free_blocks.extend(block_ids)delself.request_blocks[request_id]print(fFreed{len(block_ids)}blocks for request{request_id})四、Attention 计算的分块实现PagedAttention 的核心是分块计算 Attention不需要把整个 KV Cache 搬到一起。标准 Attentiondefstandard_attention(query,key_cache,value_cache): query: [num_heads, head_dim] key_cache: [seq_len, num_heads, head_dim] value_cache: [seq_len, num_heads, head_dim] # 算整个序列的注意力scorestorch.matmul(query,key_cache.transpose(-1,-2))scoresscores/math.sqrt(head_dim)probstorch.softmax(scores,dim-1)outputtorch.matmul(probs,value_cache)returnoutput问题key_cache和value_cache是整个序列显存占用大。PagedAttentiondefpaged_attention(query,kv_blocks,block_tables,context_lens,block_size): query: [batch, num_heads, head_dim] kv_blocks: [num_blocks, 2, block_size, num_heads, head_dim] block_tables: [batch, max_blocks_per_seq] - 每个请求的 block 映射 context_lens: [batch] - 每个请求的实际序列长度 batch_size,num_heads,head_dimquery.shape outputtorch.zeros_like(query)forbinrange(batch_size):seq_lencontext_lens[b]num_blocks(seq_lenblock_size-1)//block_size# 逐 block 计算注意力forblock_idxinrange(num_blocks):physical_blockblock_tables[b,block_idx]# 获取当前 block 的 K 和 Vk_blockkv_blocks[physical_block,0]# [block_size, num_heads, head_dim]v_blockkv_blocks[physical_block,1]# 计算当前 block 的注意力分数block_scorestorch.matmul(query[b].unsqueeze(0),# [1, num_heads, head_dim]k_block.transpose(-1,-2)# [num_heads, head_dim, block_size])# 处理最后一个 block 的 paddingifblock_idxnum_blocks-1:valid_lenseq_len-block_idx*block_size block_scores[:,:,valid_len:]float(-inf)# 累加到输出block_probstorch.softmax(block_scores,dim-1)output[b]torch.matmul(block_probs,v_block).squeeze(0)returnoutput昇腾优化版本实际实现中用 Ascend C 写 kernel 更高效// PagedAttention kernel简化版templatetypenameT__aicore__voidPagedAttentionKernel(LocalTensorTquery,// 当前 token 的 queryGlobalTensorTkv_blocks,// 所有 KV blockLocalTensorint32_tblock_ids,// 当前请求的 block 映射int32_tnum_blocks,// 当前请求的 block 数int32_tblock_size,LocalTensorToutput// 输出){// 1. 初始化累加器LocalTensorTaccGetBufferT(output_size);LocalTensorfloatexp_sumGetBufferfloat(1);exp_sum[0]0.0f;// 2. 遍历每个 blockfor(inti0;inum_blocks;i){intblock_idblock_ids[i];// 3. 从 GM 搬运当前 block 的 K/V 到 UBLocalTensorTk_blockGetBufferT(block_size*head_dim);LocalTensorTv_blockGetBufferT(block_size*head_dim);CopyIn(kv_blocks[block_id][0],k_block);CopyIn(kv_blocks[block_id][1],v_block);// 4. 计算注意力分数LocalTensorTscoresMatMul(query,k_block.T());// 5. Softmax需要跨 block 累加LocalTensorfloatexp_scoresExp(scores);exp_sum[0]ReduceSum(exp_scores);// 6. 加权求和LocalTensorTweightedMatMul(exp_scores,v_block);accweighted;}// 7. 归一化outputacc/exp_sum[0];}五、Block 大小的选择Block 大小影响显存利用率和计算效率。# 不同 block size 的对比block_sizes[8,16,32,64]forbsinblock_sizes:# 计算显存浪费avg_waste(bs-1)/2# 平均每个请求浪费 (bs-1)/2 个位置# 计算 block 数量开销num_blockstotal_memory/(bs*kv_size_per_token)print(fBlock size{bs}: avg waste{avg_waste}, max blocks{num_blocks})实测数据Block Size显存利用率最大并发请求计算效率895%51285%1692%25691%3288%12894%6480%6496%Block size 越小显存利用率越高但计算效率越低更多的 kernel 启动开销。通常选择 16 或 32 是平衡点。六、与 vLLM 的对比vLLM 是最早实现 PagedAttention 的开源项目昇腾的实现参考了它的设计特性vLLM昇腾 PagedAttention内存管理BlockManagerPagedKVCacheBlock 大小默认 16可配置8-64Attention KernelCUDA kernelAscend C kernel前缀缓存支持支持滑动窗口支持部分支持# vLLM 风格的 APIfromascend_transformer_boostimportPagedAttention# 创建 PagedAttention 实例paged_attnPagedAttention(num_heads32,head_dim128,block_size16,num_blocks1024)# 分配 blockblock_idspaged_attn.allocate(request_id1,seq_len128)# 执行 Attentionoutputpaged_attn.forward(query,key,value,block_ids)# 释放 blockpaged_attn.free(request_id1)七、实际性能对比LLaMA-7BA100 vs 昇腾 910batch16序列2048指标A100 (vLLM)910 (PagedAttention)显存利用率92%90%最大并发请求4845生成速度85 tok/s78 tok/s首 token 延迟45ms52ms昇腾的 PagedAttention 实现与 vLLM 性能接近显存利用率都能到 90% 以上。参考资源vLLM 论文https://arxiv.org/abs/2309.06180PagedAttention 源码https://atomgit.com/cann/ascend-transformer-boost昇腾内存管理最佳实践https://www.hiascend.com/document/detail/zh/CANN/LLM 推理优化指南https://www.hiascend.com/document/detail/zh/CANN/总结PagedAttention 的核心是把 KV Cache 切成 block 按需分配逻辑上连续、物理上分散。Block 大小是关键权衡小 block 显存利用率高但计算效率低大 block 相反。16-32 是常用的平衡点。实现层面BlockManager 负责分配和释放Attention Kernel 负责分块计算。昇腾的 PagedAttention 参考了 vLLM 的设计显存利用率能到 90%与 A100 vLLM 的性能接近。

相关文章:

PagedAttention 源码解析:KV Cache 怎么管理

前言 长序列推理的瓶颈不是计算,是显存。KV Cache 随序列长度线性增长,一个 LLaMA-7B 的请求,序列 4096 就要吃掉 2GB 显存。PagedAttention 的做法是把 KV Cache 切成小块按需分配,显存利用率从 40% 提到 90%。 下面从源码层面解…...

中介核对对账

...

如何集成OpenClaw?2026年腾讯云部署及配置Token Plan保姆级步骤

如何集成OpenClaw?2026年腾讯云部署及配置Token Plan保姆级步骤。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主…...

202508(第16届)蓝桥杯C++编程青少组(省赛_初/中级)真题以及答案解析

202508(第16届)蓝桥杯C++编程青少组(省赛_初/中级)真题 考试时间:60分钟 总分:400 及格分:240 一、单选题 (共5题,每题20分) 1、下列C++运算符中,优先级最高的是?( ) A:+ B:- C:* D:= 【正确答案】 D 【试题解析】 C++运算符,算数运算符优先级高于赋…...

2026年怎么安装OpenClaw?阿里云部署及配置Token Plan保姆级指南

2026年怎么安装OpenClaw?阿里云部署及配置Token Plan保姆级指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主…...

QQ音乐加密音频一键解密:qmc-decoder让你的音乐重获自由 [特殊字符]

QQ音乐加密音频一键解密:qmc-decoder让你的音乐重获自由 🎵 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾有这样的经历?从QQ音…...

仿真数据与真实数据:机器人训练的数据策略选择

仿真数据与真实数据:机器人训练的数据策略选择摘要:仿真数据和真实数据各有优劣,如何选择和配比直接影响训练效果和项目成本。本文从数据特性、适用场景、配比策略三个维度给出系统分析,并提供Sim-to-Real迁移的工程化方案。关键词…...

C# WinForms七巧板图形编程实战:坐标系、变换与交互

1. 为什么是七巧板——一个被低估的图形编程练兵场很多人看到“C#开发七巧板游戏”第一反应是:这不就是个儿童益智玩具的简单复刻?画几个多边形、拖来拖去完事?我带过三届Unity和WinForms方向的实习工程师,几乎所有人第一次独立完…...

融合UFF与机器学习势:高通量筛选MOF吸附剂的高效精准方案

1. 项目概述:当经典力场遇上机器学习势,如何实现MOF吸附剂的精准高效筛选?在材料研发的前沿,尤其是像金属-有机框架(MOFs)这样拥有近乎无限结构可能性的领域,我们常常面临一个“大海捞针”的困境…...

全球首个通用智能人“通通“走向现实——具身智能落地的工程师视角

全球首个通用智能人"通通"走向现实——具身智能落地的工程师视角 工程师视角深度剖析 | 2026年5月24日 一、什么是"通通"?——先把这个概念说清楚 2026年初,北京通用人工智能研究院(简称"通研院")…...

国密滑块登录实战:SM2+SM4密码链路全解析

1. 这不是“加个密”那么简单:滑块登录里藏着的国密链路真相你有没有试过,在某个政务类App或银行类Web端拖动滑块完成登录后,页面瞬间跳转,但控制台Network面板里却找不到任何明文密码字段?甚至抓包发现,提…...

雪球md5__1038签名逆向:从Chrome调试到Node.js稳定复现

1. 这不是“破解”,而是对前端加密逻辑的常规逆向工程实践你打开雪球网的行情接口,抓到一个带md5__1038xxx参数的请求,复制下来一试——换台电脑、换个时间、甚至只是刷新一下页面,参数就失效了。后端直接返回403 Forbidden或{&qu…...

原生态部署librenms

为什么写这个?1、别的帖子都要钱,我真看不惯。2、要了钱程序还搭不起来,恶心。3、法布施是智慧聪明才艺地修因。正题开始:一、部署目标 本次 LibreNMS 部署以官方推荐架构为基础,目标是搭建一套结构清晰、运行稳定、便…...

URP Renderer Feature深度解析:生命周期、避坑指南与工业级实现

1. 这不是“加个脚本”就能搞定的渲染扩展——URP Renderer Feature 的真实定位与误用重灾区很多人第一次在URP项目里点开“Renderer Features”面板时,下意识会把它当成“Unity旧版Post-Processing Stack的平替”或者“一个能塞自定义Shader的快捷入口”。我见过太…...

别再乱买电源线!服务器供电踩坑后果惨重

选服务器电源线,一定要把控好接口匹配、电流大小、安全认证、线缆长度和材质用料五大核心要点,任何一项忽略,都极易造成设备损坏,甚至引发电路起火,机房用电安全不容忽视,选睿阜更安心。先对接口&#xff1…...

属性访问相关的魔法方法

核心概念与作用 这一系列函数主要用于动态操作对象的属性和方法,是 Python 反射(Reflection)机制的核心工具,常见的有: hasattr(obj, name):检查对象 obj 是否有指定名称(字符串)的…...

CANN ops-nn:基础神经网络算子的统一实现层

个人主页:ujainu 文章目录 前言仓库定位:为什么需要一层"统一实现"算子不是"公式翻译",是对硬件的谈判Conv2D:im2col 转矩阵乘BatchNorm:推理折叠成逐元素运算Interpolate:双线性插值的…...

10分钟上手asc-tools:昇腾NPU算子开发工具集

前言 要做昇腾NPU算子开发,但不知道从哪入手?Ascend C代码写完了,不知道怎么编译、怎么调试、怎么验证?asc-tools就是为这个场景准备的。 asc-tools是昇腾官方提供的算子开发工具集,包含了编译工具(ascen…...

如何在本地部署大模型-ollama_(保姆级教程)

一、部署方式选择 部署方式上手难度核心特点适用场景Ollama⭐命令极简,自动适配环境,自带 API 接口新手日常本地调用、快速测试LM Studio⭐图形化操作,无需敲代码,兼容 OpenAI 接口不想使用命令行、纯可视化使用Text Generation …...

Masson染色原理、步骤、判读及常见问题

Masson染色是组织病理检测中经典的三色染色技术,由法国医生Claude L. Masson研发,是病理实验中区分胶原纤维与其他软组织成分的手段。在慢性炎症、机化及瘢痕形成过程中,胶原纤维会随着病理进展而出现。早期在H-E染色切片中,这些纤…...

聊天机器人搭建05

【从零搭建聊天机器人】05 自动化运维:使用 GitHub Actions 实现 CI/CD 云端自动部署 写在前面 欢迎来到《从零搭建聊天机器人》系列教学的第五章,也是我们系统架构中最具“现代化工程师”色彩的一课! 在传统的日常更新中,你不仅要…...

传奇 3 光通版手游官网下载:传奇 3 光通版最新官方下载渠道

《传奇 3 光通版》别称传奇 3 怀旧服、传奇 3 经典 1.45 版、传奇 3 单职业,由安徽游昕携手忆往游戏联合运营的正版传奇 MMORPG 手游。一比一复刻经典玛法大陆场景,比奇城、盟重要塞、祖玛神殿、神秘神舰悉数还原,保留战法道经典三职业构架&a…...

科技助力,具身智能体在幼儿园科技启蒙中的应用

具身机器人通过互动式学习、多感官体验和情境化教学,为幼儿科技启蒙提供创新支持。其应用可围绕以下方向展开:互动游戏设计 开发基于肢体动作的交互游戏,如通过机器人模仿幼儿舞蹈动作,激发参与兴趣。语言与逻辑训练 利用机器人讲…...

祖玛游戏核心原理:状态机驱动的链式消除系统

1. 祖玛游戏的本质:不是“打珠子”,而是状态机驱动的链式消除系统很多人第一次听说要实现祖玛,第一反应是“不就是把彩色球连成三个以上就炸掉吗?”——这个理解对了一半,但恰恰漏掉了祖玛区别于其他消除类游戏的核心骨…...

P15729 [JAG 2024 Summer Camp #2] Add Add Add 题解

P15729 [JAG 2024 Summer Camp #2] Add Add Add Link: https://www.luogu.com.cn/problem/P15729 题目描述 给定两个长度为 NNN 的正整数序列 (A1,A2,…,AN)(A_1, A_2, \ldots, A_N)(A1​,A2​,…,AN​) 和 (B1,B2,…,BN)(B_1, B_2, \ldots, B_N)(B1​,B2​,…,BN​)。对于 …...

模拟神经计算电路:噪声与非均匀性挑战下的网络架构优化与再训练策略

1. 项目概述与核心挑战在材料科学、药物发现乃至自动驾驶的实时决策中,我们常常需要模型以极高的速度处理海量数据,进行预测或推理。传统的数字计算机在执行这类任务时,面临着功耗和计算延迟的瓶颈。于是,一个极具吸引力的替代方案…...

安卓Qwen Chat 国际版 无限AI生图 图生视频

最新 2.0.0 国际版限制更少应用名称:Qwen Chat 应用版本:2.0.0 应用大小:25 MB 适用平台:Android 使用说明: 软件介绍 Qwen Chat是一款强大的多功能AI助手应用,旨在提高您的工作效率和学习体验。&am…...

2026年上海AI Agent智能体开发公司全景解析:从技术底座到产业落地的能力坐标

引言:先把结论放在这里。2026年的上海,AI Agent智能体早已不是概念展厅里的抽象模型,而是直接进入业务流程、改写生产力公式的现实工具。面对“上海AI Agent智能体开发公司哪家好”或者“上海智能体软件开发公司推荐”这类问题,很…...

总结模式的智能化升级

📋 本文目录 一、前言 二、从工具到智能系统的升级 三、工具链完整演示 四、智能总结Agent整合实战 五、智能总结系统的核心价值 六、总结与展望 一、前言 1.1 本节内容简介 我们已经有了5个好用的总结工具,但问题来了:工具是死的&am…...

天赐范式第53天:当伙伴没有上下文的时候——说我皮肤好~算子包装

我是第一天就开始包装算子用来算CFD的吗,这套技术理论不是多个领域模拟击穿的吗?没发论文就说没发论文,别扯没用的~谁生下来就会叫爸爸呀!伙伴:兄弟,我建议认栽,切回v27 MAC版:bashd…...