大模型上下文拉长后,显存占用并非线性增长,注意力部分要按平方量级记账。这笔账的核心在 KV 缓存:每个位置的键值对都要常驻显存,长度翻倍,缓存占用跟着翻倍,而注意力的计算量涨得更快,长上下文因此又贵又慢。
KV 缓存随长度怎么涨
每处理一个位置,就要为它存一份键值对,层数越多、隐藏维度越大,单位置占用越高。上下文从两千拉到两万,缓存占用就是十倍量级的增长,一分不带含糊。
用一个直观比例帮助记忆:几千 token 的日常对话,缓存占用还不算起眼;拉到几万 token 的长文档场景,缓存体积就赶上模型参数的一部分,服务方为一段长上下文付出的显存,可能相当于多载入一份小模型的权重。这就是长文档功能常常单独限流、单独计价的底层原因。
这笔账是刚性的。缓存要供生成阶段反复读取,不能随用随丢,只能整份留在显存里,直到会话结束或被淘汰。长度决定了底线,省不下多少。唯一能压缩的是表示精度,把键值对从高精度存成低精度,体积能缩一些,代价是信息有损,长文本末端的细节最先受影响,这项技术在长文本服务里已是常见选项。
一笔平方账怎么算
注意力要为每个位置搭配所有历史位置,搭配数量随长度平方增长。长度翻倍,搭配数量变成四倍,计算量因此按平方级膨胀,这才是长上下文真正的成本大头。
显存占用主要由缓存决定,呈线性;计算量由搭配数决定,呈平方。两条曲线叠在一起,解释了长上下文为什么又贵又慢,也解释了为什么优化都冲着搭配数去。
长度翻倍发生了什么
把上下文从 N 拉到 2N,缓存占用翻倍,注意力计算量变成四倍,而模型参数量一点没变。与模型大小无关。小模型拉长上下文同样要付这笔账,模型小不是通行证。
这也解释了为什么上下文参数从几万提到几十万,背后的工程代价是指数级的:不是简单加显存能解决的,必须配套计算优化,否则机器先撑不住。常见的误判是把上下文上限当成免费额度去用,把全部历史资料一股脑贴进去。实际上上下文用到七成以上,速度与占用就开始明显吃紧,长资料先做摘要再提问,往往比全文直塞更划算。
工程上怎么应对
常见思路有几类:用稀疏或分块注意力削减无效搭配,用缓存管理策略按需换入换出,用更长上下文的专用训练让位置编码适应拉伸后的范围,三路并进。
这些手段各自有取舍,组合使用才能在长度、速度、显存之间找到可用位置。在文心一言、豆包等产品的长文档能力背后,都有这类工程优化的影子。对使用者而言,读懂这条曲线的意义在于提问方式:资料不必全给,给相关的部分,长度下来了,速度与费用也跟着下来。想了解相关手段,可以读KV 缓存的复用、位置插值和FlashAttention。
| 手段 | 解决什么 | 取舍 |
|---|---|---|
| 低精度存键值对 | 把缓存体积缩一些 | 信息有损,长文本末端的细节先受影响 |
| 稀疏或分块注意力 | 削减无效搭配 | 搭配被砍掉,覆盖率下降 |
| 缓存管理策略 | 按需换入换出 | 调度本身也要占资源 |
| 长上下文专用训练 | 让位置编码适应拉伸后的范围 | 要额外投入训练 |
速查表:
- 缓存怎么涨?随长度线性涨,每位置一份键值对
- 计算怎么涨?搭配数随长度平方涨
- 长度翻倍意味着什么?缓存翻倍,计算变四倍
- 应对思路?稀疏化、缓存管理、长上下文训练
关于长上下文显存的三个常问问题
- 显存不够会怎样?:服务会限流、降级或直接拒绝长请求,用户侧表现为长文档功能不可用或排队更久。
- 上下文越长回答越准吗?:不一定,长度只是容量上限,能否用好取决于信息密度与模型能力,堆长度不等于堆质量。
- 这笔账用户能感觉到吗?:能,长上下文请求通常更慢、更贵,背后就是这两条增长曲线在起作用。


