跳转到内容

搜索

为什么按 Token 计费?大模型的推理成本究竟是什么?

拾知 9 min read

Token 是推理计算量的精确代理变量;推理成本的三个层次:模型参数的静态显存占用、KV Cache 的动态显存占用、以及显存带宽而非算力是瓶颈;输入可并行而输出不可,决定了两者的定价差异。

调用大模型 API 时,账单总是按 Token 数结算,而非按请求次数或响应时间。今天系统地想了一遍这背后的逻辑。

Token 为何是计费的最小单位

Token 是大模型的最小计算单元。GPU 每处理一个 Token(无论是理解还是生成),都要将其送过模型的所有神经网络层,完成矩阵乘法。计算量随 Token 数呈平方级或线性增加。

相比之下,按请求计费无法区分「你好」和「帮我分析这份五十页合同」之间数百倍的工作量差异;按时间计费则因服务器并发的存在而失真——同样挂钟一秒内,不同用户实际占用的算力可能天差地别。Token 是目前最能准确映射实际成本的计量粒度。

推理成本的三个层次

显存占用是最大的成本来源。一个 70B 参数的原版模型,仅加载权重就需要约 140GB 显存,目前没有任何单张显卡能够装下,必须依赖多卡(如两张 A100)联合加载。即使采用了 int4 量化技术,也需要占用约 35GB 显存。只要服务在运行,这些显存就必须被「包租」,无法服务其他用户。

模型权重在服务启动时加载一次,之后所有用户的请求都在同一份权重上运行推理——权重是只读的共享数据。模型推理时,需要将每个 Token 的中间计算结果(Key-Value 对)缓存在显存中,供后续计算注意力时复用。这份缓存就是 KV Cache,是每个请求私有的,承载着对话的上下文记忆,不同用户之间完全独立。

KV Cache 的压力随上下文长度线性增长。模型在推理过程中,需要将所有历史 Token 的中间计算结果缓存在显存中,才能高效计算注意力。上下文越长,缓存越大,单卡能同时服务的并发数(batch size)就越低——这是长上下文模型定价更高的根本原因

显存带宽,而非算力(FLOPS),才是推理速度的真正瓶颈。每生成一个 Token,GPU 都需要将数十 GB 规模的模型权重从显存搬到计算单元。这个「搬运」过程的速度上限,决定了模型的生成速率。量化技术(将权重从 fp16 压缩至 int4)能大幅提速,本质上是减少了搬运的数据量,而非减少了运算量本身。

为什么输出 Token 比输入贵三到五倍

这里有一个不对称性值得单独说明。

输入阶段(Prefill) 可以完全并行。Transformer 的 Self-Attention 机制在处理输入时,所有 Token 之间的注意力权重可以同时计算——这些计算之间不存在数据依赖关系,GPU 可以一次性并发完成所有矩阵运算,耗时大致等于处理单个 Token 的时间。

输出阶段(Decode) 则是严格串行的。生成第 N 个 Token 之前,必须先拿到第 N−1 个 Token 的结果,因为新 Token 会被追加进上下文,参与下一步的预测。这种自回归特性是语言生成本身的数学约束,无法绕开。串行意味着 GPU 利用率低,单位 Token 的实际成本更高,定价因此也更高。

总结

  • Token 是 GPU 矩阵运算的最小可计量单元;每多一个 Token,算力消耗至少线性增加,所以 Token 数是目前最公平、最可预测的计费粒度。
  • 模型参数越多推理成本越高:因为占用的显存更多、推理时需要搬运的数据量更多。
  • 长上下文推理成本高:因为占用的 KV Cache 更多,压低了可以支持的并发。
  • 输出 Token 比输入 Token 更贵:因为输出阶段是串行的,GPU 利用率更低。

Footnotes

  1. SM 是 NVIDIA GPU 的基本计算单元,每个 SM 内部包含若干 CUDA 核心(负责实际的浮点运算)、寄存器、L1 缓存和共享内存。一张 H100 SXM 有 132 个 SM,并行计算能力来自这些 SM 同时工作。