本文深入探讨了 KV 缓存在大模型推理中的核心作用。针对大模型如 Ds、Qwen、GPT 等的高效服务需求,文章详细解释了 KV 缓存如何通过复用先前计算好的注意力状态来避免重复计算,显著降低延迟并提升模型吞吐。文章还介绍了 KV 缓存的工作原理、内存成本计算方法以及不同注意力架构(MHA、GQA、MQA)下 KV 缓存的应用差异,并通过实际代码实验展示了 KV 缓存对模型性能的显著提升效果。对于想要提升大模型服务效率的程序员和开发者来说,本文提供了宝贵的优化思路和实践指导。
从 Token 到吞吐:LLM 中 Key-Value 缓存的重要性
针对大模型比如Ds,Qwen,GPT等等要把它们高效地服务起来并不容易,每生成一个 token 都需要昂贵计算,而且随着序列长度增长,推理时间也会增加。随着像现在智能体的发展,龙虾,Coding模型等等的出现,对于Token的依赖和消耗是一个天文数字。
在 LLM 服务优化中,最有影响力的优化技术之一就是Key-Value(KV)Cache。这个简单却非常重要的方法可以让模型复用先前已经计算好的注意力状态,从而避免在逐 token 生成文本时重复做同样的计算。是一项早期最为基础的优化手段。
什么是 KV Cache?
当 Transformer 处理文本时,它依赖self-attention来理解 token 之间的关系。简单来说,每个新 token 都会回看所有历史 token,以确定上下文和语义。这会涉及为每个 token 计算key与value表示,因此称为Key-Value(KV)对。
在推理阶段,特别是自回归模型(大部分文本llm模型)中,模型一次只生成一个 token。若不做缓存,每个新 token 都要对到当前为止的整个序列重算注意力——这个操作会随序列长度呈二次增长。
KV cache正是为了解决这个低效点。它会把之前解码步骤中计算好的 key/value 张量存起来,这样模型在生成新 token 时不必全部重算。模型只需为最新 token 计算 key/value,然后追加到已有缓存中。
KV caching 让 LLM 能“记住”它已经建立好的内部注意力上下文,通过查询替代计算,用空间来换取时间。
它是如何工作的
在每个 Transformer 层里,自注意力机制会产生三个矩阵:queries(Q)、keys(K)和values(V)。在推理期间:
模型为当前 token 计算query(Q)。
历史keys和values不再重算,而是从KV cache中读取。
然后用“新 query 与所有缓存 keys/values”做注意力计算,得到下一步输出。
当前 token 的新 key 与 value 会被加入缓存,供后续步骤使用。
从直观上,你可以这样理解:
图 2–10[1] 使用 KV cache 加速 LLM 生成。只处理新 token,同时复用先前已计算的 key-value 对,减少重复计算。
没有缓存时,模型每一步都要重建过去。
有了缓存后,我们只需查过去。这会把大量重复计算变成每个 token 的小增量更新,从而降低延迟、提升吞吐。
KV cache 驻留在 GPU 显存中,按层、按注意力头存储,并随着序列长度(到目前为止有多少 token)、模型宽度和层数增长。
在大模型的长对话中,KV cache 的内存成本可用下式计算(单位:字节):
设b为 batch size,t为总序列长度(prompt + completion),n_layers 为 decoder block/attention 层数,n_heads 为每层注意力头数,d_head 为注意力层隐藏维度,p_a 为精度。多头注意力(MHA)模型的 KV cache 单 token 内存开销(字节)例如 LLaMA 2 7B(MHA)如下:
模型参数(MHA):
b = 1(batch),n_layers = 32,n_heads = 32,hidden_size = 4096 ⇒ d_head = 4096/32 = 128,p_a = 2 字节(FP16/BF16)。
单 token 系数(MHA):
2 × 32 × 32 × 128 × 2 = 524,288 字节 ≈每 token 512 KiB(b = 1)。
当 t = 2,048 的总 KV:
512 KiB × 2,048 =1,048,576 KiB=1,024 MiB≈1 GiB。
当 t = 4,096 的总 KV:
512 KiB × 4,096 =2,097,152 KiB=2,048 MiB≈2 GiB。
在模型固定时,KV 内存会随 batchb与 token 数t线性增长。
MHA、MQA 与 GQA 的差异
KV 内存会随“每层需要存多少套独立 K/V”而增长。在经典MHA中,每个注意力头都有自己的 K 与 V,因此每个头都要存一套 KV——这就是我们后续对比分析的基线。
在GQA中,多个 query heads 会分组共享同一套 KV;如果模型有 32 个 query heads 但只有 8 个 KV heads,那么你实际存的是 8 套 KV 而不是 32 套。这意味着 KV 内存大约是 MHA 的 1/4。
MQA把共享做到极致:所有query heads 在每层共享一套KV。若仍有 32 个 query heads,那就是 MHA KV 内存的1/32。整体 KV 公式不变——只需要把“head 数”替换成“KVhead 数”。
更少的 KV heads 意味着更少的存储开销、解码时更少的 KV 读取,这通常会降低成本,并减少长输出与大 batch 场景下的延迟。
使用 Qwen 模型测试KVCache对比实验
为了理解 KV Cache 带来的性能与吞吐提升,我们来分析生成 100 个 token 的过程,并观察每个 token 的生成耗时。
在下面代码中,我们给一个初始 prompt,让 LLM 继续补全。下面使用的是大家熟悉的 Transformers 和 PyTorch。
1from transformersimportAutoModelForCausalLM,AutoTokenizer2import time3import torch45model_name="Qwen/Qwen2.5-0.5B"6tokenizer=AutoTokenizer.from_pretrained(model_name)7model=AutoModelForCausalLM.from_pretrained(model_name)89prompt="""How might the next wave of communication tools shape our relationships, societies, and sense of identity?"""1011max_new_tokens=1001213idx=tokenizer(prompt,return_tensors="pt").input_ids.to(model.device)14start_time=total_time=time.time()15times=[]1617for _inrange(max_new_tokens):18idx_cond=idx19withtorch.no_grad():20outputs=model(idx_cond)21logits=outputs.logits2223logits=logits[:,-1,:]24probas=torch.softmax(logits,dim=-1)2526idx_next=torch.multinomial(probas,num_samples=1)27print(" Next token is:",tokenizer.decode(idx_next[0]))28time_cost=time.time()-start_time29times.append(time_cost)3031ifnot first_token_generated:32print(f"Time taken for generating the first token: {time_cost:.4f} seconds")33first_token_generated=True34else:35print(f"Time taken for generating a token: {time_cost:.4f} seconds")3637start_time=time.time()3839idx=torch.cat((idx,idx_next),dim=1)4041ifidx_next.item()==tokenizer.eos_token_id:42print("\n[Generation completed - EOS token reached]")43break4445generated_text=tokenizer.decode(idx[0],skip_special_tokens=True)46print(f"Total time take for next token: {time.time() - total_time:.4f} seconds")47print(generated_text)跑完上面的代码后,你会看到一个明显趋势:随着生成 token 变多,每 token 耗时会上升。原因是每个新 token 都需要“回看”更长上下文。自注意力步骤会把当前 query 与之前所有 key/value 做比较,因此计算量会随序列长度增长。
有了 KV caching 后,我们不再重算历史 key/value,而是复用它们。即便如此,模型每一步仍需要读取更多的 KV ,因此每 token 耗时通常仍会随“已生成 token 数”大致线性增长(常受内存带宽限制)。若没有 KV caching,模型每一步都要为整段历史重算 key/value——代价会增长得更快(本质上近似二次),生成会明显变慢。
现在我们运行同样的代码,只改动少量部分来开启KV cache,并测量吞吐提升(tokens/s)。
1import torch2from transformersimportAutoTokenizer,AutoModelForCausalLM34model_name="Qwen/Qwen2.5-0.5B"5tokenizer=AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)6model=AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True,use_cache=True)\7.to("cuda"iftorch.cuda.is_available()else"cpu")89model_name="Qwen/Qwen2.5-0.5B"10tokenizer=AutoTokenizer.from_pretrained(model_name,trust_remote_code=True)11model=AutoModelForCausalLM.from_pretrained(model_name,trust_remote_code=True).to("cuda"iftorch.cuda.is_available()else"cpu")1213prompt="""How might the next wave of communication tools shape our relationships, societies, and sense of identity?"""1415num_interations=10016times_with_cache=[]1718first_token_generated=False19input_ids=tokenizer(prompt,return_tensors="pt").input_ids.to(model.device)20idx=input_ids21start_time=total_time=time.time()2223#(1)DefineKey/ValueCacheforfaster generation24past_key_values=None2526for _inrange(num_interations):27print("input_ids size: "+str(input_ids.size()))28withtorch.no_grad():29outputs=model(input_ids=input_ids,30past_key_values=past_key_values,#(2)UseKV-cache from previous iteration31use_cache=True,#(2)EnableKV caching32max_new_tokens=100,33min_new_tokens=100)3435logits=outputs.logits36#(3)UpdateKVCache37past_key_values=outputs.past_key_values38torch.cuda.synchronize()3940logits=logits[:,-1,:]41probas=torch.softmax(logits,dim=-1)42generated_token_id=torch.multinomial(probas,num_samples=1)#Sampleinstead of argmax4344#(4)Updateinput_idswithonly thenewtoken(using KV-cache)45input_ids=generated_token_id4647print("Next token:",tokenizer.decode(generated_token_id[0],skip_special_tokens=True))48idx=torch.cat((idx,generated_token_id),dim=1)4950time_cost=time.time()-start_time51times_with_cache.append(time_cost)52ifnot first_token_generated:53print(f"Time take for first token: {time_cost:.4f} seconds")54first_token_generated=True55else:56print(f"Time take for next token: {time_cost:.4f} seconds")57start_time=time.time()5859ifgenerated_token_id.item()==tokenizer.eos_token_id:60print("\n[Generation completed - EOS token reached]")61break6263generated_text=tokenizer.decode(idx[0],skip_special_tokens=True)64print(f"Total time take for next token: {time.time() - total_time:.4f} seconds")65print(generated_text)6667free_gpu(model=model)下面是开启与不开启 KV cache 时 token 生成时间的对比:
在不使用缓存时,生成时间会持续上升,因为模型每一步都要重复处理越来越长的上下文。开启 KV cache 后,模型会复用已计算好的 key/value,而不是每步重算——因此在首 token 计算完后,生成会更稳定且明显更快。
通过这个例子,你现在可以直观感受到 KV cache 如何提升 LLM 性能——实现更低的每 token 的延迟与更高的整体吞吐。
总结
KVCache本质上是在序列增长时避免重复计算。它存储已计算的 key/value,让模型复用注意力上下文,而不必每一步重建从而降低延迟并提升吞吐。
它的内存成本是可预测的:模型固定时,成本与 batch(b)和 token 数(t)线性相关,可用文中给出的简单公式估算。
架构也很关键:MHA 为每个 head 存一套 KV(基线);GQA/MQA 在 head 间共享 KV,可按“KV heads / 总 heads”的比例缩小 cache 以及带宽需求。
那么如何学习大模型 AI ?
对于刚入门大模型的小白,或是想转型/进阶的程序员来说,最头疼的就是找不到系统、全面的学习资源,要么零散不成体系,要么收费高昂,白白浪费时间走弯路。今天就给大家精心整理了一份全面且免费的AI大模型学习资源包,覆盖从入门到实战、从理论到面试的全流程,所有资料均已整理完毕,免费分享给各位!
核心包含:AI大模型全套系统化学习路线图(小白可直接照做)、精品学习书籍+电子文档、干货视频教程、可直接上手的实战项目+源码、2026大厂面试真题题库,一站式解决你的学习痛点,不用再到处搜集拼凑!
👇👇扫码免费领取全部内容👇👇
1、大模型系统化学习路线
学习大模型,方向比努力更重要!很多小白入门就陷入“盲目看视频、乱刷资料”的误区,最后越学越懵。这里给大家整理的这份学习路线,是结合2026年大模型行业趋势和新手学习规律设计的,最科学、最系统,从零基础到精通,每一步都有明确指引,帮你节省80%的无效学习时间,少走弯路、高效进阶。
2、大模型学习书籍&文档
理论是实战的根基,尤其是对于程序员来说,想要真正吃透大模型原理,离不开优质的书籍和文档支撑。本次整理的书籍和电子文档,均由大模型领域顶尖专家、大厂技术大咖撰写,涵盖基础入门、核心原理、进阶技巧等内容,语言通俗易懂,既有理论深度,又贴合实战场景,小白能看懂,程序员能进阶,为后续实战和面试打下坚实基础。
3、AI大模型最新行业报告
无论是小白了解行业、规划学习方向,还是程序员转型、拓展业务边界,都需要紧跟行业趋势。本次整理的2026最新大模型行业报告,针对互联网、金融、医疗、工业等多个主流行业,系统调研了大模型的应用现状、发展趋势、现存问题及潜在机会,帮你清晰了解哪些行业更适合大模型落地,哪些技术方向值得重点深耕,避免盲目学习,精准对接行业需求。值得一提的是,报告还包含了多模态、AI Agent等前沿方向的发展分析,助力大家把握技术风口。
4、大模型项目实战&配套源码
对于程序员和想落地能力的小白来说,“光说不练假把式”,只有动手实战,才能真正巩固所学知识,将理论转化为实际能力。本次整理的实战项目,涵盖基础应用、进阶开发、多场景落地等类型,每个项目都附带完整源码和详细教程,从简单的ChatPDF搭建,到复杂的RAG系统开发、大模型部署,难度由浅入深,小白可逐步上手,程序员可直接参考优化,既能练手提升技术,又能丰富简历,为求职和职业发展加分。
5、大模型大厂面试真题
2026年大模型面试已从单纯考察原理,转向侧重技术落地和业务结合的综合考察,很多程序员和新手因为缺乏针对性准备,明明技术不错,却在面试中失利。为此,我精心整理了各大厂最新大模型面试真题题库,涵盖基础原理、Prompt工程、RAG系统、模型微调、部署优化等核心考点,不仅有真题,还附带详细解题思路和行业踩坑经验,帮你精准把握面试重点,提前做好准备,面试时从容应对、游刃有余。
6、四阶段精细化学习规划(附时间节点,可直接照做)
结合上述资源,给大家整理了一份可直接落地的四阶段学习规划,总时长约2个月,小白可循序渐进,程序员可根据自身基础调整节奏,高效掌握大模型核心能力,快速实现从“入门”到“能落地、能面试”的跨越。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
硬件选型
带你了解全球大模型
使用国产大模型服务
搭建 OpenAI 代理
热身:基于阿里云 PAI 部署 Stable Diffusion
在本地计算机运行大模型
大模型的私有化部署
基于 vLLM 部署大模型
案例:如何优雅地在阿里云私有部署开源大模型
部署一套开源 LLM 项目
内容安全
互联网信息服务算法备案
…
👇👇扫码免费领取全部内容👇👇
3、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】