为什么大模型的输出 要比输入token 贵?
·
一、根本原因:两个阶段的计算机制截然不同
大模型的推理分为两个阶段:
输入阶段(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× |
输出价格是输入的 4 倍,本质上是在为以下成本买单:
输出 Token 的额外成本
├── 串行解码,无法并行 → 推理次数 × N
├── 每步重新加载全部权重 → 显存带宽持续打满
├── KV Cache 随输出长度线性膨胀 → 显存压力持续增加
└── GPU 占用时长远超输入 → 服务器资源成本更高
总结
| 输入(Prefill) | 输出(Decode) | |
|---|---|---|
| 计算方式 | 并行,矩阵×矩阵 | 串行,矩阵×向量 |
| 瓶颈类型 | 算力瓶颈 | 访存瓶颈 |
| 权重加载 | 一次,N Token 共享 | 每步一次,无法摊薄 |
| GPU 利用率 | 接近 100% | 10%~30% |
| 单 Token 成本 | 低 | 高 |
一句话总结:输入是"搬一次书做 N 道题",输出是"每道题都要重新搬一次书"。访存成本无法摊薄,是输出 Token 更贵的根本原因。
更多推荐
所有评论(0)