深度学习入门

推理成本与部署

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 比输入贵好几倍——因为输出是串行生成的,而输入可以并行预填充。

由此得出两条实用的优化方向

  1. 控制输出长度比控制输入长度更省钱
  2. 能用小模型的环节就别用大模型(如分类、路由、抽取)

一个常见的架构模式:用小模型做意图识别和路由,只把真正需要复杂推理的请求交给大模型。

练习:为什么说「解码阶段是显存带宽受限而不是算力受限」?这个事实如何解释量化能同时省显存和省时间?

小纸条

大模型推理的瓶颈通常是算力还是显存带宽?KV 缓存解决什么问题、代价是什么?为什么输出 token 比输入贵?

登录 后可看答案