推理成本与部署
约 14 分钟
训练一次,服务无数次。对真实产品来说,推理成本往往比训练成本更要命。 这一节讲工程上怎么把它降下来。
先看清成本结构:两个阶段
| 阶段 | 做什么 | 瓶颈 |
|---|---|---|
| 预填充(prefill) | 处理输入的全部 token | 算力受限,可并行 |
| 解码(decode) | 一个一个生成输出 token | 显存带宽受限,串行 |
关键认识:解码阶段是串行的,每生成一个词都要把整个模型的权重从显存读一遍。
所以瓶颈往往不是算力,而是显存带宽——GPU 大部分时间在等数据搬运,而不是在算。这个认知决定了后面所有优化的方向。
KV 缓存:最基础的优化
生成第 个词时要算注意力,需要前面所有词的 K 和 V。如果每次都重算,就是巨大的浪费。
做法:把算过的 K、V 存起来,每步只算新词的。
效果:计算量从 降到 。
代价:显存。 KV 缓存的大小随「序列长度 × 批大小 × 层数」增长,长上下文时它甚至会超过模型权重本身占的显存。
这催生了后续的一系列优化:
| 技术 | 思路 |
|---|---|
| MQA / GQA | 多个注意力头共享 K、V,缓存直接缩小数倍 |
| PagedAttention | 借鉴操作系统的分页,按需分配显存,减少碎片 |
| 量化 KV 缓存 | 用低精度存 K、V |
量化:用更少的位数表示权重
模型权重默认是 16 位浮点。量化就是压到 8 位、4 位甚至更低。
| 精度 | 显存 | 效果 |
|---|---|---|
| FP16 | 基准 | 无损 |
| INT8 | 1/2 | 损失很小 |
| INT4 | 1/4 | 有一定损失,多数场景可接受 |
为什么量化如此有效:既然瓶颈是显存带宽,把权重压小一半,读取速度就快一倍——它同时省了显存和时间。
两条路线:
- 训练后量化(PTQ):训完直接压,快,可能掉点
- 量化感知训练(QAT):训练时就模拟量化,效果好但要重训
蒸馏:让小模型学大模型
思路:用大模型(教师)的输出来训练小模型(学生)。
关键在于学什么:不只学最终答案,还学教师输出的完整概率分布。
教师说「这张图是猫的概率 0.9,狗 0.08,狐狸 0.02」
「狗比狐狸更像猫」这个信息,在硬标签「猫」里是丢失的。这些软信息正是蒸馏的价值所在。
现代做法还包括让学生学教师生成的推理过程(思维链蒸馏),效果比只学答案好得多。
其他关键工程技术
| 技术 | 作用 |
|---|---|
| 连续批处理 | 不等整批做完,有请求完成就立刻插入新请求,吞吐量大幅提升 |
| 投机解码 | 用小模型快速草拟几个词,大模型一次性验证,平均每步生成多个词 |
| FlashAttention | 优化注意力的显存读写,不改变数学结果但快很多 |
| 张量并行 / 流水并行 | 模型太大装不下单卡时,切到多卡上 |
投机解码值得多说一句:它利用了「验证比生成便宜」——大模型一次前向可以并行验证多个草拟 token,而生成它们本来要好几步。这又是一个「评价比创作容易」的应用。
成本估算:一个实用的心智模型
单次请求成本 ≈ (输入 token 数 × 单价_in) + (输出 token 数 × 单价_out)
通常输出 token 比输入贵好几倍——因为输出是串行生成的,而输入可以并行预填充。
由此得出两条实用的优化方向:
- 控制输出长度比控制输入长度更省钱
- 能用小模型的环节就别用大模型(如分类、路由、抽取)
一个常见的架构模式:用小模型做意图识别和路由,只把真正需要复杂推理的请求交给大模型。
练习:为什么说「解码阶段是显存带宽受限而不是算力受限」?这个事实如何解释量化能同时省显存和省时间?
大模型推理的瓶颈通常是算力还是显存带宽?KV 缓存解决什么问题、代价是什么?为什么输出 token 比输入贵?
登录 后可看答案