GPUFits

显存带宽为什么决定 LLM 推理速度:decode 机制与估算公式

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

RTX 3090 和 RTX 4090 都是 24GB,装同样的模型;但跑 Llama-3.1-8B(Q4_K_M),前者理论约 143 tok/s,后者约 154 tok/s——差距不大。换成 RTX 3060(12GB),同模型掉到约 55 tok/s。三张卡的 CUDA 核心数从 3584 到 16384 差了近 5 倍,速度却几乎按另一个数字排列:显存带宽 360 / 936 / 1008 GB/s。

这不是巧合。这篇文章讲清楚为什么本地推理的 tok/s 几乎被显存带宽一个参数锁死,以及怎么用这个规律买卡、选量化、设预期。文中所有速度均为理论估算 ±30%,口径与站内工具完全一致。

decode 机制:每个 token 重读一遍全部权重

LLM 生成文本是两个交替的阶段:

  • 预填充(prefill):读你的提示词。所有 token 一次性并行处理,是一场大规模矩阵乘,吃 GPU 算力。
  • 解码(decode):一个 token 一个 token 往外吐。每生成一个 token,模型都要做一次完整的前向传播——数学上,就是把全部权重从显存读一遍,乘上当前 token 的激活值,再读一遍 KV 缓存。

关键在 decode 这一步:批量为 1 的单人聊天里,这批权重读进来只服务一个 token,没有任何摊薄。4.9GB 的权重,读一遍就是 4.9GB 的显存流量;生成 100 个 token,就是约 490GB 的流量。显存带宽是你每秒能搬运的字节数上限——于是每 token 的时间下限 = 权重体积 ÷ 带宽,tok/s 的上限就此钉死。这就是 Pope 等人在推理扩展性论文里的核心结论:低批量推理是显存带宽瓶颈(memory-bandwidth bound),不是算力瓶颈。

估算公式:带宽 × 0.75 ÷ 每 token 权重

本站工具用的公式(与 GPU 检查器 同源):

理论 tok/s ≈ 显存带宽(GB/s) × 0.75 ÷ 每 token 需读取的权重(GB)
每 token 权重 = 参数量 × bpw ÷ 8   (MoE 模型按激活参数算,见下文)

0.75 是经验效率系数:权重读取之外还有 KV 缓存、运行时调度和访存不规则性,实测一般落在理论峰值的 60–90% 区间,取中值。所以所有结果都要当理论估算 ±30% 看。

代入 Llama-3.1-8B(Q4_K_M,bpw 4.9):每 token 权重 = 8.03 × 4.9 ÷ 8 ≈ 4.9GB。各卡理论速度:

显卡/Mac带宽8B Q4 理论 tok/s
RTX 3060 12GB360 GB/s约 55
RTX 4070 Ti Super672 GB/s约 103
RTX A6000768 GB/s约 117
RTX 3090936 GB/s约 143
RTX 40901008 GB/s约 154
RTX 50901792 GB/s约 273
Mac mini M4 Pro(273 GB/s)273 GB/s约 42
Mac Studio M3 Ultra(819 GB/s)819 GB/s约 125

再看大模型:Qwen3-32B(Q4_K_M,每 token 20.1GB)在 3060 上约 13 tok/s、4090 上约 38 tok/s、5090 上约 67 tok/s;Llama-3.3-70B(Q4_K_M,每 token 43.2GB)在 M3 Ultra 上约 14 tok/s、A100 上约 35 tok/s、H100 上约 58 tok/s(均为理论估算 ±30%)。

注意表里的 A6000:48GB 专业卡,价格比 4090 贵得多,CUDA 核心也不少,但 decode 反而慢——因为它的带宽(768 GB/s)低于 4090(1008 GB/s)。在 decode 这条赛道上,带宽就是速度,其他参数插不上话。

为什么算力和核心数几乎无关

把 decode 一个 token 的时间拆成两段:

  • 读权重:4.9GB ÷ 1008 GB/s ≈ 4.9ms
  • 算矩阵:约 2 × 80 亿 = 16 GFLOP,在 4090 这种百 TFLOPS 级算力上 ≈ 0.16ms

读取耗时是计算的 30 倍。GPU 的绝大部分时间在等显存,核心空转——把核心数翻倍,0.16ms 变成 0.08ms,总耗时几乎不动;把带宽翻倍,4.9ms 变 2.4ms,速度直接翻倍。

用术语说:单人 decode 的算术强度(每读一个字节做几次运算)只有 2–4 FLOP/byte,而现代 GPU 的「拐点」(算力 ÷ 带宽)在几百 FLOP/byte 量级。算术强度远低于拐点 = 铁定的带宽瓶颈。这也是为什么 RTX 4090 升 5090 时,CUDA 核心只多约三分之一、带宽多 78%,decode 速度就按 78% 的比例涨(154 → 273,理论估算 ±30%)——评测里那点 decode 提升,全是 GDDR7 的功劳。

买卡推论:规格表上,显存容量决定装不装得下(用显存计算器 核对),带宽决定跑多快;核心数、TFLOPS 对单人 decode 基本没有参考价值。

例外一:预填充吃算力

规律到 prefill 这里反过来。读一段 4000 token 的提示词,是把 4000 个 token 排成矩阵一次乘完——同一份权重被 4000 个 token 分摊,算术强度暴涨,瓶颈从带宽切回算力。

这解释了两种常见体验:

  • 同一张卡,首 token 延迟(prefill)和生成速度(decode)是两组数字。塞一篇长文档进去等半天、之后逐字流得飞快,就是两段瓶颈各归各管。
  • Agent 场景里每一轮都带着整段历史重新预填充,prefill 占比极高——这正是 Mac(算力弱)做 Agent 别扭、而 H100 这类算力怪兽在服务端值钱的原因之一。更细的取舍见 Mac 还是显卡

例外二:MoE 按激活参数算

混合专家模型(MoE)每个 token 只激活一部分参数。decode 时每 token 需要读的也只是激活的那部分权重(路由命中的专家),所以公式的分子按激活参数算:

  • Qwen3-30B-A3B:总参数 30.5B,激活 3.3B → 每 token 权重 3.3 × 4.9 ÷ 8 ≈ 2.0GB。3060 上理论约 134 tok/s,比它小四倍的 8B 稠密模型还快。
  • gpt-oss-120b:总参数 116.8B,激活 5.1B → 每 token 约 3.1GB,M3 Ultra 上理论约 197 tok/s。
  • DeepSeek-R1:总参数 671B,激活 37B → 每 token Q4 约 22.7GB,H100 上理论约 111 tok/s。

(均为理论估算 ±30%。)这就是 MoE 的工程价值:装模型按总参数付显存,跑速度按激活参数付带宽。大容量低带宽设备(Mac Studio)配 MoE,是这个公式给出的天然甜点。

会扰动公式的四个现实因素

公式是一阶近似,这几个因素会系统性拉偏结果:

  1. 量化档位直接改变分母。Q4_K_M(bpw 4.9)到 FP16(16),每 token 字节数差 3.3 倍,速度也差 3.3 倍——8B 在 4090 上 FP16 理论约 47 tok/s,Q4 约 154 tok/s。量化是提速手段,不只是省显存;质量代价见 量化详解
  2. 长上下文叠加 KV 读取。公式只计权重;上下文拉长后,每 token 还要读整段 KV 缓存,实际速度会再降。128K 上下文的 KV 可达几十 GB(见 KV 缓存详解),长对话后期变慢是物理规律,不是软件 bug。
  3. 多卡等效带宽打 85 折。同型号双卡理想带宽是 2 倍,但卡间通信有开销,本站按 Σ带宽 × 0.85 建模:双 3090 跑 70B Q4 理论约 28 tok/s(理论估算 ±30%)。混合卡更糟——等效带宽取最慢那张。
  4. CPU offload 是断崖。权重放不下的部分走系统内存,等效带宽被拖到 60–100 GB/s(本站取 80),8B Q4 从 4090 上的约 154 掉到约 12 tok/s。值不值得做这个交换,见 CPU offload 是否值得

常见误区

  • 「核心多的卡跑 LLM 一定快」——只在 prefill 和批量吞吐场景成立。单人 decode,768 GB/s 的 A6000 就是跑不过 1008 GB/s 的 4090。
  • 「显存大 = 速度快」——容量和带宽是两个独立参数,恰好常一起涨而已。24GB 的 3060(假设存在)不会比 12GB 的 3060 快。
  • 「3090 改水冷超频能追上 4090」——超显存确实能挤出几个百分点的带宽,但 936 到 1008 的 8% 差距,和换卡无关的框架开销都会盖过它。别为 decode 速度折腾超频。
  • 「公式说 150 tok/s,我只跑到 120,卡有问题」——±30% 是标称口径,框架、驱动、上下文长度都在里面。先对照 ollama ps / nvidia-smi 确认没有 offload 到 CPU,那才是数量级级别的损失。
  • 「服务端 API 几百 tok/s,我本地太慢」——API 服务商靠大批量把带宽摊到几十上百个并发上,算术强度完全变了。单人 tok/s 和数据中心 tok/s 不是同一种东西,不必比。

动手:三步估出任意组合的速度

  1. 算每 token 权重:参数量(MoE 用激活参数)× bpw ÷ 8。bpw 查 量化详解 里的表,或直接按 Q4_K_M = 4.9。
  2. 查带宽:显卡规格页或 Apple 官网,单位 GB/s。套公式:带宽 × 0.75 ÷ 每 token 权重。
  3. 不想手算:打开 GPU 检查器,选显卡和模型,显存判定和理论速度一次给全;再配显存计算器 确认上下文拉满后还装得下。

记住两件事就够用了:decode 速度 = 带宽 ÷ 每 token 字节数,上下浮动三成;prefill 和长上下文是另一套账。买卡前把这两个公式各算一遍,比看任何评测都快。

常见问题

为什么 CUDA 核心数差很多的两张卡,跑同一个 8B 模型速度只差带宽比?

单人 decode 是显存带宽瓶颈,不是算力瓶颈。每个 token 要重读全部权重(8B Q4 约 4.9GB),而实际计算量只有约 16 GFLOP——在 4090 上读取要 4.9ms,计算只要 0.16ms,速度自然由读取端决定。RTX 4090 换 5090,CUDA 核心只多约三分之一,带宽多 78%,decode 速度就按比例快 78%(理论估算 ±30%)。

量化到 Q4 为什么比 FP16 快三倍多?

因为每 token 要读的字节数变少了。同一个 8B 模型,FP16 每 token 读 16GB,Q4_K_M 只读 4.9GB——在 4090 上理论速度从约 47 tok/s 提到约 154 tok/s(理论估算 ±30%)。量化不只是省显存,更是提速手段,代价是一定的质量损失。

我的实测 tok/s 和你们的估算差了 20%,正常吗?

正常。公式里的 0.75 是经验效率系数,实际受框架(llama.cpp/vLLM/MLX)、驱动、采样参数、散热降频影响,我们标注的口径就是理论估算 ±30%。它适合用来横向比较硬件和预判量级,不适合当精确承诺。

带宽一样但核心更多的卡,任何场景都没区别吗?

有——预填充(prefill)阶段。读提示词是大规模并行矩阵乘,吃算力;处理长文档、Agent 反复带长上下文重新预填充时,核心数和算力差距会直接体现为等待时间。decode 吃带宽、prefill 吃算力,这是两条规律,别拿一条去套另一条。

买卡跑本地 LLM,规格表上最该看哪个数?

先看显存容量(决定装不装得下,见显存计算器),再看显存带宽(决定跑多快)。核心数、TFLOPS 对单人聊天的 decode 速度几乎没有参考价值——它们只在预填充和批量吞吐场景里兑现。

来源