跳到主要内容

效率优化 — 让大模型跑得快、装得下

这一章讲三件事: 推理为什么天生费钱(自回归循环);模型怎么压(量化、剪枝、蒸馏)与训练怎么省(FP8);推理怎么提速(推测解码、KV 缓存管理、推理服务系统)。 一句话定位: 第 05 章解决了「训得动」,这一章解决「用得起」。

1. 推理的钱花在哪

先看清对手。大语言模型的推理是自回归的:生成一个词,拼回输入,再生成下一个。麻烦在于:每次迭代耗时确定,但迭代次数(输出长度)事先未知——对比 BERT 那种一次前向就出结果的模型,大模型推理任务的总耗时天然不可预测1

省算力的第一个发明是 KV 缓存:注意力计算每个新词元都要用所有历史词元的键和值,若无状态(不记住任何历史结果)就得每步重算全部历史;把它们缓存起来复用,是所有推理框架的基座。代价是缓存随生成长度线性膨胀2

一本真实的部署账(数字全部来自书里):部署 LLaMA-2-70B,FP16 权重就要约 140GB 显存——至少 6 张 24GB 的 RTX 3090 Ti,或 2 张 80GB 的 A100;而在 2 张 A100 上生成一个词元约 100 毫秒,几百个词元的回答要超过 10 秒3。延迟之外还有吞吐量(每秒出多少词元)和峰值内存(权重 + KV 缓存)两组衡量口径。

低效的根源有三个:模型规模(权重不断从显存搬运进计算单元)、自注意力(预填充阶段随输入长度平方增长)、解码方法(每生成一个词元,全部权重都要从显存走一遍)4。本章的武器各自瞄准其中一环。

2. 替代架构:挑战注意力本身

状态空间(用隐状态描述系统的)模型(SSM,State Space Model——两个方程描述「状态怎么更新、输出怎么读出」)是当前最热的挑战者。

它源自控制论:用一个隐状态 h 描述系统,两个方程决定「状态怎么更新、输出怎么读出」;离散化之后序列处理的形式酷似循环神经网络(一步接一步带记忆的经典网络),但计算和存储对序列长度只有线性复杂度——这是对注意力平方复杂度的正面进攻5

代表是 Mamba:选择性状态空间模型——让模型根据输入内容有选择地传播或遗忘信息(普通 SSM 对所有输入一视同仁,表达力不足);配合贴近硬件的实现方式避免存储中间状态。效果上它在 DNA 建模、音频等长序列任务上超越了此前模型6。衍生工作把混合专家结构引入 SSM(BlackMamba、MoE-Mamba),或用密集连接缓解深层状态退化(DenseMamba)。但要保持清醒:截至本书成稿,SSM 系在通用语言能力上尚未取代注意力——它是「值得跟踪的路线」,不是「已完成的替代」。

3. 模型压缩:量化、剪枝、蒸馏

量化:用更少的比特存数

量化把 FP16 权重换成低比特整数,缩放因子 S 和零点 Z 负责来回换算。关键在分场景:预填充阶段在算大矩阵乘,用权重-激活量化(激活值在线量化,吃上 INT8 张量核心的加速);解码阶段是矩阵乘向量,瓶颈在搬运权重,用仅权重量化(权重离线量化,算的时候再转回 FP16)7

训练后量化(PTQ)的方法谱系,记三个坐标就够:OBQ 是理论起点但复杂度随权重数量立方增长;GPTQ 把它简化成一次性逐行量化,配合分块更新,让千亿模型量化变得实际可行;AWQ 观察到「与激活异常值对齐的权重通道更重要」,对这些通道做保护性重参数化。工程上还有 LUT-GEMM 这类把乘法变成查表的狠招:4-bit 权重乘 4-bit 激活只有 256 种结果,全部预先算好存表8

量化感知训练(QAT)另一条路:训练时就模拟量化误差,效果更好但要烧训练用的钱和卡。QLoRA 是这个方向的实用标杆——4-bit 量化主模型 + LoRA 微调,650 亿参数模型单卡 48GB 显存就能调(第 06 章已讲)9

剪枝与蒸馏

剪枝分两种粒度。无结构剪枝逐个删权重,稀疏度高但删除位置不规则,硬件吃不到加速——理论省了,实际未必快;SparseGPT(最小化重构损失,一次操作完成)和 Wanda(按「权重幅度×激活范数——向量长度的度量」打分)是代表10结构化剪枝整通道整层地删,硬件友好;LLM-Pruner 先分析模块间的耦合依赖(哪些结构必须一起删),再按重要性排序剪,最后用 LoRA 微调恢复11

知识蒸馏把大模型的能力搬给小模型,按能否访问大模型内部分成白盒与黑盒。白盒路线里有个精彩的反转:标准蒸馏是最小化「学生覆盖教师分布」的正向 KL 散度,但生成任务的输出空间太大,正向 KL 会逼学生在教师分布的空白区域也给出概率——学生会在没人教过的地方瞎编。MiniLLM 反过来用反向 KL 散度:学生只专注教师的主体高概率区,空白区随它去12。黑盒路线(只能看到大模型的输出文本)靠造数据蒸馏,代表 TAPIR:用「模型拟合难度」挑出学生学不会的难题,让教师针对性示范,课程式地由易到难;更简单的 Distilling Step-by-Step 则让教师同时生成标签和推理依据,学生两样都学13

4. FP8 训练:把字节往死里压

训练侧的大杀器是 FP8。两种编码的取舍要记牢:E4M3(4 位指数 3 位尾数)精度高但范围只有 ±448,还取消了无穷大表示以挤出更多可表示数;E5M2 范围大(±57344)但精度粗。实践口径:权重和激活用 E4M3,梯度用 E5M214

低精度的天敌是舍入误差,书里给了一个「大数吃小数」的具体例子:FP16 在区间 [1024, 2048] 内的最小间隔是 1,所以 1024.6 被存成 1025.0,而 1025.0 + 0.4 之后还是 1025.0——小数被大数整个吞掉15。FP8 更窄的动态范围让这个问题尖锐十倍,所以 FP8-LM 框架做了三件事:梯度通信用「自动缩放」动态调因子防上溢下溢(超阈值的数值比例一高就把缩放因子减半);优化器状态精确分级——一阶矩用 FP8(梯度的方向比大小重要,能容忍量化误差),二阶矩保 16 位(平方运算容易下溢),主权重用带缩放的 FP16——每个参数的优化器开销从 16 字节压到 6 字节16;分布式通信全程 FP8,连 ZeRO 都改成分发整张量而不是切片,好让缩放因子不用跟着分片走17

5. 推理提速:方法与系统两路

推测解码:小模型起草,大模型定稿

自回归解码一次只能出一个词元,是延迟的总根源。推测解码的思路是并行化验证:一个小草稿模型一口气猜出 k 个候选词元,大模型一次前向同时验证这 k 个——验证 k 个词元和验证 1 个的成本几乎一样(都是一遍前向),猜对的部分就白赚了18

主走查:一次推测解码的完整回合

提示词:「中国的首都是」(以下数值全部为演示编造):

草稿模型(比如 1B)连猜 4 个词元:「北」「京」「是」「中」

▼ 目标模型(70B)一次前向,同时算这 4 个位置的条件概率
逐个验证:
「北」→ 目标模型也高概率给「北」→ 接受
「京」→ 接受
「是」→ 接受
「中」→ 目标模型此处几乎不会选它 → 拒绝,丢弃后续
从修正分布重新采样一个词元,接回去

结果:一次 70B 前向,产出 4 个词元(平时 1 个)
效率指标叫接受率:平均每步被接受的草稿词元数

保证生成质量不变的关键在接受准则:按两个模型概率的比值 min(1, p/q) 决定接受与否,数学上可以证明最终输出分布与直接用大模型采样完全一致——白赚速度,不损质量19。SpecInfer 再进一步:草稿不是一条线,是一棵词元树,并行验证多条候选;配套的小模型比目标模型小 100-1000 倍,平均能连对约 4 个词元20

KV 缓存管理:三种策略

缓存不能只进不出,书里给了三种管理术。KIVI 把缓存压到 2-bit:键缓存有少数通道幅值特别大,就按通道量化;值缓存没有这个毛病,按词元量化——峰值内存降到 2.6 倍少,生成质量几乎不损21H2O 干脆扔掉不重要的缓存:少数「重命中」词元被注意力反复使用,保留它们加最近词元,其余逐出。StreamingLLM 发现一个反直觉现象叫注意力吸槽:模型把大量注意力倾倒在序列开头几个词元上,哪怕它们语义不重要——那就永远保留这几个「吸槽」当锚点,再配滑动窗口,模型就能无限流式地生成下去22

系统层:调度与框架

传统推理系统按批次执行,一个批次全完成才调度下一批,长任务会堵住短任务,即头部(排在队首的)阻塞问题。Orca 改成迭代级调度:每批只跑一次迭代(每作业生成一个词元),完成的随时离场、新作业随时加入。FastServe 再加多级反馈队列,抢占后立刻把已生成的词元返回给用户23。而部署侧的事实标准是 vLLM:它的 PagedAttention 借鉴操作系统分页,把 KV 缓存切成固定大小的块、允许非连续存放——现有系统因内存碎片和过度预留浪费的 60%~80% 显存被基本收回,吞吐量达到普通推理框架的 24 倍;2025 年发布的 V1 版本进一步统一了调度并集成 FlashAttention 324

6. 作者的判断与证据

  • 有证据的: 部署账(140GB/6 张 3090 Ti/100ms)、优化器 16→6 字节、KIVI 2.6 倍、vLLM 24 倍与 60%-80% 浪费,全部有文献出处。
  • 作者的判断: 「FP8 正逐渐成为下一代低精度主流格式」是成稿时点的判断;FP4 的工作书里提了一句(2025 年 1 月),定性为前沿信号。
  • 书里的坦白: 无结构剪枝「实际收益可能较为有限」——作者明确提醒理论稀疏度不等于实际加速。

7. 边界与局限

  • Mamba 系的评测集中在 DNA/音频等长序列任务,通用语言基准上的对比书里没有给全。
  • FP8 训练的数字来自 FP8-LM 框架论文,「训练速度提升一倍」是理想条件下的上限值。
  • 推测解码的收益强依赖草稿模型与目标模型的分布一致性和任务的「可预测性」:代码、格式化文本收益大,高创造性的自由文本接受率会掉——书里只字未提这个适用边界(我们按机制归纳)。
  • 推理服务系统一节以研究原型(Orca、FastServe)为主,工业界更常用的连续批处理实现只在 vLLM 部分顺带出现。

8. 可带走的

  1. 推理成本的结构性原因:自回归循环——每个词元都要完整跑一遍模型,输出长度不可预测;
  2. KV 缓存是推理显存的第二大项(仅次于权重),它随生成长度线性膨胀——所有推理优化都绕不开它;
  3. 量化分场景:预填充量化激活吃张量核心,解码只量化权重省搬运;GPTQ/AWQ 是 PTQ 的两个坐标;
  4. QLoRA 是个人微调的入场券:4-bit 量化 + LoRA,65B 模型单卡 48GB;
  5. 无结构剪枝的稀疏度是纸面富贵,位置不规则硬件吃不到——要加速选结构化剪枝;
  6. 蒸馏要用反向 KL(MiniLLM):正向 KL 会逼学生在教师没教过的地方也输出概率,生成任务尤其如此;
  7. FP8 的分工:权重激活用 E4M3(精度),梯度用 E5M2(范围);优化器状态 16 字节压到 6 字节是训练省钱的下一站;
  8. 推测解码白赚速度不损质量(min(1, p/q) 保证分布一致),对代码和格式化文本收益最大;
  9. vLLM 的 PagedAttention 把碎片浪费的六到八成显存收回来,自建推理服务先试它再自己造轮子。

9. 原文地图

主题原书章原文位置
自回归与不可预测10 效率优化text/10-ch10.txt:311(搜「自回归模式」)
KV 缓存与两阶段10 效率优化text/10-ch10.txt:326(搜「键值缓存」)
部署账10 效率优化text/10-ch10.txt:343(搜「140 GB」)
三大低效根源10 效率优化text/10-ch10.txt:352(搜「模型规模」) · text/10-ch10.txt:364(搜「解码方法的影响」)
指标体系10 效率优化text/10-ch10.txt:370(搜「首词元延迟」)
SSM 与 Mamba10 效率优化text/10-ch10.txt:417(搜「状态空间模型」) · text/10-ch10.txt:466(搜「改进的选择机制」)
量化两阶段10 效率优化text/10-ch10.txt:515(搜「权重-激活量化」) · text/10-ch10.txt:532(搜「仅权重量化」)
GPTQ/LUT-GEMM10 效率优化text/10-ch10.txt:573(搜「GPTQ」) · text/10-ch10.txt:582(搜「LUT-GEMM」)
AWQ10 效率优化text/10-ch10.txt:601(搜「AWQ」)
QLoRA/QAT10 效率优化text/10-ch10.txt:631(搜「QLoRA」)
剪枝两类10 效率优化text/10-ch10.txt:652(搜「无结构剪枝」)
SparseGPT/Wanda10 效率优化text/10-ch10.txt:666(搜「SparseGPT」) · text/10-ch10.txt:675(搜「Wanda」)
无结构硬件受限10 效率优化text/10-ch10.txt:367(搜「不规则」)
LLM-Pruner10 效率优化text/10-ch10.txt:694(搜「LLM-Pruner」)
正向 KL 空白区10 效率优化text/10-ch10.txt:753(搜「空白区域」)
MiniLLM 反向 KL10 效率优化text/10-ch10.txt:756(搜「MiniLLM」)
TAPIR/MFD10 效率优化text/10-ch10.txt:809(搜「TAPIR」)
FP8 两种编码10 效率优化text/10-ch10.txt:887(搜「E4M3」) · text/10-ch10.txt:898(搜「E5M2」)
大数吃小数10 效率优化text/10-ch10.txt:912(搜「大数吃小数」)
自动缩放10 效率优化text/10-ch10.txt:958(搜「自动缩放」)
优化器 6 字节10 效率优化text/10-ch10.txt:1010(搜「6 字节」)
FP8 ZeRO 整张量10 效率优化text/10-ch10.txt:1073(搜「贪婪策略」)
推测解码两步10 效率优化text/10-ch10.txt:1109(搜「推测解码」) · text/10-ch10.txt:1126(搜「接受率」)
推测采样公式10 效率优化text/10-ch10.txt:1130(搜「核采样」)
SpecInfer10 效率优化text/10-ch10.txt:1167(搜「SpecInfer」)
KIVI/H2O/吸槽10 大语言模型效率优化text/11-ch11.txt:21(搜「KIVI」) · text/11-ch11.txt:42(搜「动态评估每个词元的重要性」) · text/11-ch11.txt:49(搜「注意力吸槽」)
Orca/FastServe10 大语言模型效率优化text/11-ch11.txt:86(搜「迭代级」) · text/11-ch11.txt:105(搜「Skip-join」)
vLLM PagedAttention10 大语言模型效率优化text/11-ch11.txt:142(搜「PagedAttention」)

Footnotes

  1. 出处:「10 大语言模型效率优化」第 311 段(text/10-ch10.txt:311,搜「自回归模式」)。

  2. 出处:「10 大语言模型效率优化」第 326 段(text/10-ch10.txt:326,搜「键值缓存」)。

  3. 出处:「10 大语言模型效率优化」第 343 段(text/10-ch10.txt:343,搜「140 GB」)。

  4. 出处:「10 大语言模型效率优化」第 352 段(text/10-ch10.txt:352,搜「模型规模」)与第 364 段(text/10-ch10.txt:364,搜「解码方法的影响」)。

  5. 出处:「10 大语言模型效率优化」第 417 段(text/10-ch10.txt:417,搜「状态空间模型」)。

  6. 出处:「10 大语言模型效率优化」第 466 段(text/10-ch10.txt:466,搜「改进的选择机制」)与第 476 段(text/10-ch10.txt:476,搜「DNA」)。

  7. 出处:「10 大语言模型效率优化」第 515 段(text/10-ch10.txt:515,搜「权重-激活量化」)与第 532 段(text/10-ch10.txt:532,搜「仅权重量化」)。

  8. 出处:「10 大语言模型效率优化」第 573 段(text/10-ch10.txt:573,搜「GPTQ」)、第 601 段(text/10-ch10.txt:601,搜「AWQ」)与第 587 段(text/10-ch10.txt:587,搜「256」)。

  9. 出处:「10 大语言模型效率优化」第 631 段(text/10-ch10.txt:631,搜「QLoRA」)。

  10. 出处:「10 大语言模型效率优化」第 666 段(text/10-ch10.txt:666,搜「SparseGPT」)与第 675 段(text/10-ch10.txt:675,搜「Wanda」)。

  11. 出处:「10 大语言模型效率优化」第 694 段(text/10-ch10.txt:694,搜「LLM-Pruner」)。

  12. 出处:「10 大语言模型效率优化」第 753 段(text/10-ch10.txt:753,搜「空白区域」)与第 756 段(text/10-ch10.txt:756,搜「MiniLLM」)。

  13. 出处:「10 大语言模型效率优化」第 809 段(text/10-ch10.txt:809,搜「TAPIR」)与第 857 段(text/10-ch10.txt:857,搜「Step-by-Step」)。

  14. 出处:「10 大语言模型效率优化」第 887 段(text/10-ch10.txt:887,搜「E4M3」)与第 898 段(text/10-ch10.txt:898,搜「E5M2」)。

  15. 出处:「10 大语言模型效率优化」第 912 段(text/10-ch10.txt:912,搜「大数吃小数」)。

  16. 出处:「10 大语言模型效率优化」第 1010 段(text/10-ch10.txt:1010,搜「6 字节」)。

  17. 出处:「10 大语言模型效率优化」第 1073 段(text/10-ch10.txt:1073,搜「贪婪策略」)。

  18. 出处:「10 大语言模型效率优化」第 1109 段(text/10-ch10.txt:1109,搜「推测解码」)。走查中的词元与概率为演示编造。

  19. 出处:「10 大语言模型效率优化」第 1130 段(text/10-ch10.txt:1130,搜「核采样」),即原书式 (10.21)-(10.22) 的机制。

  20. 出处:「10 大语言模型效率优化」第 1167 段(text/10-ch10.txt:1167,搜「SpecInfer」)与第 1171 段(text/10-ch10.txt:1171,搜「4 个词元」)。

  21. 出处:「10 大语言模型效率优化」第 21 段(text/11-ch11.txt:21,搜「KIVI」)与第 35 段(text/11-ch11.txt:35,搜「2.6 倍」)。

  22. 出处:「10 大语言模型效率优化」第 42 段(text/11-ch11.txt:42,搜「动态评估每个词元的重要性」)与第 49 段(text/11-ch11.txt:49,搜「注意力吸槽」)。

  23. 出处:「10 大语言模型效率优化」第 86 段(text/11-ch11.txt:86,搜「迭代级」)与第 105 段(text/11-ch11.txt:105,搜「Skip-join」)。

  24. 出处:「10 大语言模型效率优化」第 142 段(text/11-ch11.txt:142,搜「PagedAttention」)与第 147 段(text/11-ch11.txt:147,搜「60%」)。