GPUFits

长上下文的显存代价:线性增长、架构差异与按需定长

更新于 2026-09-10 · 核实于 2026-09-10

模型卡上的「支持 128K 上下文」是一句架构描述,不是一句使用承诺。真正决定你能开多长上下文的,是你的显存减去权重之后还剩多少——剩下的部分,按每 token 固定单价被 KV 缓存逐字节买走。

这篇回答三个问题:上下文变长时显存怎么涨、为什么不同模型的「长上下文税」差出十倍、以及你手上的任务到底该开多长。KV 缓存本身的机制(为什么每层都要存、GQA 怎么省、MLA 怎么压缩)在 KV 缓存详解 里有完整推导,本文专注算成本账。

线性增长:没有拐点,只有单价

KV 缓存的公式里,上下文长度是唯一的变量,其余全是架构常数:

KV 缓存 = 每 token 成本(架构决定)× 上下文长度(你决定)

这意味着增长曲线是一条过原点的直线。以 Llama-3.1-8B 为例(fp16 KV,每 token 131,072 字节):

上下文KV 缓存对照
4K(Ollama 默认)0.5 GB几乎无感
8K1.1 GB约等于一杯咖啡
16K2.1 GB开始值得注意
32K4.3 GB接近 Q4 权重(4.9GB)
64K8.6 GB超过权重
128K(原生上限)17.2 GB权重的 3.5 倍

开 q8 KV 缓存,表中所有数字减半,斜率不变。这就是全部数学:上下文翻几倍,KV 就涨几倍。

换个角度读这张表:Qwen3-32B 的每 token 成本是 Llama-8B 的两倍(256 KB vs 128 KB),所以 32B 模型开 8K 上下文,比 8B 模型开 32K 还贵。「模型多大」和「上下文多贵」是两笔独立的账。

架构决定税率:每 token KV 成本榜

把站点收录的模型按每 token KV 成本排序(fp16,按本站计算器同款公式):

模型架构要点每 token32K 时128K 时
gpt-oss-20b24 层 × 8 KV 头 × 64 维48 KB1.6 GB6.4 GB
Muse-Glimmer-30B52 层 × 2 KV 头52 KB1.7 GB7.0 GB
DeepSeek-R1MLA 压缩潜向量69 KB2.3 GB9.2 GB
gpt-oss-120b36 层 × 8 KV 头 × 64 维72 KB2.4 GB9.7 GB
Qwen3-30B-A3B48 层 × 4 KV 头96 KB3.2 GB12.9 GB
Llama-3.1-8B32 层 × 8 KV 头128 KB4.3 GB17.2 GB
Qwen3-8B36 层 × 8 KV 头144 KB4.8 GB19.3 GB
Mistral-Small-3.2-24B40 层 × 8 KV 头160 KB5.4 GB21.5 GB
Qwen3-32B64 层 × 8 KV 头256 KB8.6 GB34.4 GB
Llama-3.3-70B80 层 × 8 KV 头320 KB10.7 GB42.9 GB
Gemma-3-27B62 层 × 16 KV 头496 KB16.6 GB66.6 GB

三个值得记住的事实:

  • 参数量和 KV 成本基本无关。 30B 的 Qwen3-30B-A3B(4 个 KV 头)每 token 比 8B 的 Llama 便宜 25%;671B 的 DeepSeek-R1 靠 MLA 把成本压到 69 KB,不到 Llama-3.3-70B 的四分之一。决定价格的是层数 × KV 头数 × 头维度这三个架构常数。
  • GQA 的分组比例就是税率。 同样 8 个 KV 头,Gemma-3 给了 16 个,成本直接翻倍。选模型时 num_key_value_heads 值得和参数量一起看。
  • 滑窗和混合架构的实际占用低于公式值。 gpt-oss 一半层只保留固定窗口,Gemma-3 每 6 层里 5 层是 1024 滑窗,Muse-Glimmer 是 3:1 的滑窗/全局混合——窗口层和线性层的 KV 不随上下文增长。本站计算器对它们仍按标准公式算(宁保守勿乐观),所以表中对这几款是高估。

机制层面的完整解释(GQA 论文、MLA 的 576 维潜向量、滑窗如何叠加 RoPE)见 KV 缓存详解

长上下文不只贵,还慢

显存只是第一笔账,速度是第二笔。生成阶段(decode)每产出一个 token,显卡都要把全部权重和整段 KV 缓存从显存读一遍。上下文越长,每 token 要读的 KV 越多,生成越慢。

拿 RTX 4090(带宽 1008 GB/s,效率系数 0.75)跑 Llama-3.1-8B Q4_K_M(权重 4.9GB)算一遍(理论估算 ±30%):

上下文每 token 读取量(权重 + KV)理论速度
短上下文(KV 忽略)4.9 GB约 154 tok/s
32K9.2 GB约 82 tok/s
128K22.1 GB约 34 tok/s

上下文从近乎零拉到 128K,生成速度跌到原来的五分之一。注意本站速度工具只计权重读取,所以超长上下文下实际 tok/s 会低于工具估算值——差得越远,说明 KV 占比越高。

读入侧(prefill)也有代价:计算量约等于 2 × 参数量 × 提示词 token 数。8B 模型读一段 100K token 的提示词约需 1.6×10¹⁸ 次浮点运算,RTX 4090 按有效 40 TFLOPS 粗算要约 40 秒(理论估算,实际受框架影响很大)。长上下文的真实体验是:发完一条长文档,先等 prefill,再用变慢的速度看输出。

按任务选上下文长度

上下文不是越大越好,是够用就好。多开的每一 K 都在收显存税和速度税:

任务建议上下文依据
日常对话、写作、翻译4–8K几十轮对话用不满 8K
RAG 问答8–16K5–10 个片段 × 500–800 token + 问题 + 输出
单文件/小项目代码8–16K一个文件加相关上下文
整库代码分析、长文档总结32K+百页 PDF 约 6–7 万 token(粗略换算:一页英文约 500 词 × 1.3 token),要么开 64K+,要么分段处理
Agent / 多轮工具调用按峰值 × 2 预留历史记录只增不减,留增长空间
自托管 API 服务单会话长度 × 并发数每个会话各存一份 KV,见下文

两个具体提醒:

  • 先检查默认值。 Ollama 默认上下文只有 4096 token(旧版本 2048)——很多人以为自己在用 128K 模型,实际窗口只有 4K。改法:/set parameter num_ctx 16384 或 Modelfile 里 PARAMETER num_ctx 16384;llama.cpp 用 -c 参数;LM Studio 在加载面板里调。
  • 设小不伤质量。 窗口是记忆长度不是能力,超出的旧内容被丢弃。对短任务主动调小窗口,省显存还提速,没有任何质量代价。

算出你的上下文预算

把公式倒过来用,就是你的显卡能买到的上下文长度:

可用上下文 = (显存 − 权重 − 1.5GB 固定开销)÷ 每 token KV 成本

几个典型组合(Q4_K_M 权重,fp16 KV):

显卡模型剩余预算fp16 可用上下文开 q8 KV 后
12GB(RTX 3060)Llama-3.1-8B(4.9GB)5.6 GB约 41K约 83K
16GB(4070 Ti Super)Qwen3-8B(5.0GB)9.5 GB约 62K,但原生上限 32K → 全窗口轻松余量更多
24GB(3090/4090)Llama-3.1-8B(4.9GB)17.6 GB约 131K → 刚好覆盖原生 128K(总需求 23.6GB,紧张档)从容
24GB(3090/4090)Qwen3-32B(20.1GB)2.4 GB约 9K约 18K;原生 32K 需 25.9GB,单卡不够

判定口径:总需求 ≤ 可用显存 × 80% 为舒适,≤ 100% 为紧张。不想手算就开显存计算器,选模型、拉上下文滑块,KV 那条柱会实时变长;想直接知道自己的卡能跑什么,用 GPU 兼容性检查器

做自托管服务的话,把「单会话 KV × 并发数」代入同一公式:24GB 卡跑 Qwen3-32B,剩余 2.4GB 预算,4 个并发会话每个只能分到约 2K 上下文——这就是为什么多用户场景要么加卡(见多卡指南),要么选 KV 便宜的模型。

要点回顾

  • KV 缓存随上下文严格线性增长,每 token 单价由架构常数决定,选型时就能看到。
  • 参数量不决定长上下文成本,KV 头数、层数、MLA/滑窗才决定。同规模模型能差 3 倍,跨规模能差 10 倍。
  • 长上下文同时收两笔税:显存(线性)和 decode 速度(KV 占比越高越慢,理论估算 ±30%)。
  • 按任务定长,不按上限定长。聊天 4–8K,RAG 8–16K,长文档和整库代码才需要 32K+。
  • 显存不够时的顺序:q8 KV → 降权重量化档 → 换架构或加卡。权重量化和 KV 量化是独立开关,细节见量化指南KV 缓存详解

买卡前、选模型前、设 num_ctx 前,先算这笔账。

常见问题

上下文每翻一倍,显存多花多少?

每个模型有一个固定的「每 token KV 成本」。Llama-3.1-8B 是 131,072 字节/token(fp16),所以上下文从 8K 翻到 16K,多花 1.1GB;从 64K 翻到 128K,多花 8.6GB。完全线性,没有拐点。

上下文设小了会伤模型质量吗?

不会。上下文窗口只是记忆长度,不改变模型本身的能力。超出窗口的旧内容被丢弃,仅此而已。对不需要长记忆的任务,主动把窗口调小是纯赚:省显存、提速,零质量代价。

长上下文会让生成变慢吗?

会。生成阶段每出一个 token 都要把整段 KV 缓存从显存读一遍。RTX 4090 跑 Llama-3.1-8B(Q4):不计 KV 时约 154 tok/s,32K 上下文时约 82 tok/s,128K 时约 34 tok/s(均为理论估算 ±30%)。上下文翻四倍,速度大约腰斩。

RAG 到底需要多长的上下文?

按检索片段总量算,不要按模型上限算。5–10 个片段 × 每段 500–800 token,加上问题和输出,8–16K 通常足够。盲目开 128K 只是把显存和速度浪费在永远用不到的窗口上。

多用户并发时 KV 缓存怎么算?

每个并发会话各存一份完整 KV,互不共享。总 KV = 单会话 KV × 并发数。Qwen3-32B 开 4 个 32K 并发,光 KV 就约 34GB(fp16)——做自托管服务时,先定并发数,再定上下文长度。

显存不够开长上下文,先动哪个开关?

第一步开 q8 KV 缓存(占用减半,质量代价可忽略);第二步降一档权重量化;都不行再考虑换 KV 更省的架构或加卡。注意权重量化和 KV 量化是两个独立开关,权重 Q4 不会让 KV 自动变小。

来源