一、根本原因:两个阶段的计算机制截然不同

大模型的推理分为两个阶段:

输入阶段(Prefill)   →   输出阶段(Decode)
  并行处理所有 Token        逐个串行生成 Token
  矩阵 × 矩阵 运算          矩阵 × 向量 运算
  算力瓶颈                  访存瓶颈

二、输入阶段:算力瓶颈,成本低

输入的所有 Token 一次性并行喂入模型:

输入: "你好,请介绍一下北京"
      ↓
[你][好][,][请][介][绍][一][下][北][京]
      ↓ 并行计算,权重只加载一次
      一次前向传播,生成 KV Cache 

从计算量角度看:

计算量(FLOPS) ∝ N × d²   → 随 Token 数线性增长
访存量(Bytes) ∝ d²        → 权重只加载一次,固定不变

N 个 Token 共享同一份权重,访存成本被大量摊薄
→ GPU 算力跑满,访存带宽反而不是瓶颈

权重加载一次,计算 N 次,单个 Token 的访存成本极低,GPU 利用率接近 100%,处理效率极高。


三、输出阶段:访存瓶颈,成本高

输出 Token 必须逐个串行生成,每个 Token 都依赖前一个:

生成第1个token "北":加载全部权重(140GB)→ 计算 1 个向量 → 输出
生成第2个token "京":加载全部权重(140GB)→ 计算 1 个向量 → 输出
生成第3个token "是":加载全部权重(140GB)→ 计算 1 个向量 → 输出
...
输出 N 个 Token = 搬运 N × 140GB 数据,只做极少量计算 

从计算量角度看:

计算量(FLOPS) ∝ 1 × d²   → 每步极小,固定不变
访存量(Bytes) ∝ d²        → 每步都要完整加载一次权重

每次搬运巨量数据,只做极少计算
→ 显存带宽被打满,GPU 算力大量闲置

❗ 权重每步重新加载,只计算 1 次,访存成本无法摊薄,GPU 利用率仅 10%~30%,效率极低。


四、用算术强度量化两者差距

算术强度 = 计算量(FLOPS) / 访存量(Bytes)

与硬件屋脊点对比(以 A100 为例):
屋脊点是硬件算力与带宽的"平衡临界值":

Ridge Point = 峰值算力 / 峰值带宽
            = 312 TFLOPS / 2 TB/s
            = 156 FLOPS/Byte
阶段算术强度与屋脊点对比瓶颈GPU利用率
输入(N=1000)~1000 FLOPS/Byte>> 156算力瓶颈接近 100%
输出(N=1)~1 FLOPS/Byte<< 156访存瓶颈10%~30%
算术强度低于屋脊点 → 访存瓶颈,带宽是短板
算术强度高于屋脊点 → 算力瓶颈,计算是短板
大模型输出阶段算术强度极低(~1),远低于屋脊点(156),带宽永远是瓶颈,这正是输出 Token 更贵的硬件本质原因。

五、两种瓶颈的直观类比

📖 输入:把整本数学书从仓库搬出来,然后做完书里所有的题——搬一次书,做大量计算,值!

✍️ 输出:把整本数学书从仓库搬出来,只做一道加法题,再放回去;下一个 Token 再搬一次……——每次搬书只做一题,极度浪费搬运成本!


六、以 GPT-4.1 为例

模型输入价格输出价格倍数
GPT-4.1$2 / 1M tokens$8 / 1M tokens

输出价格是输入的 4 倍,本质上是在为以下成本买单:

输出 Token 的额外成本
├── 串行解码,无法并行 → 推理次数 × N
├── 每步重新加载全部权重 → 显存带宽持续打满
├── KV Cache 随输出长度线性膨胀 → 显存压力持续增加
└── GPU 占用时长远超输入 → 服务器资源成本更高

总结

输入(Prefill)输出(Decode)
计算方式并行,矩阵×矩阵串行,矩阵×向量
瓶颈类型算力瓶颈访存瓶颈
权重加载一次,N Token 共享每步一次,无法摊薄
GPU 利用率接近 100%10%~30%
单 Token 成本

一句话总结:输入是"搬一次书做 N 道题",输出是"每道题都要重新搬一次书"。访存成本无法摊薄,是输出 Token 更贵的根本原因。

更多推荐