把 1750 亿参数压到 4 比特几乎不掉点,压完却不一定更快——三年前那篇推理优化综述,最保值的是一句免责声明
Large Transformer Model Inference Optimization
这个专栏最近收的几乎全是 2026 年的新论文。今天这篇是 2023 年 1 月的旧文——Lilian Weng 在 Lil'Log 上写的一份推理优化综述,把当时已知的省钱办法分成蒸馏、量化、剪枝、稀疏化、架构改造五条线,每条线的收益和代价摆在一起看。三年多过去,表里的具体方法换了好几代,但这篇最值得读的从来不是那张方法表,而是它一上来就把约束说清楚了:大模型推理到底贵在哪一头,以及为什么有些看上去最聪明的省法,在真机上一点都不快。
先给结论,也是我读完最想留下的一句:推理贵不贵,不是由「模型有多大」直接决定的,而是由两件事决定——显存里必须一直放着什么,以及有没有人替你把对应的 kernel 写出来。第一条决定上限,第二条决定纸面收益能不能兑现。这两条今天读,比 2023 年还更成立。
账单的两头:显存和串行
文章开头引了一组数字值得单独拎出来:批大小 512、上下文长度 2048 的设定下,光 KV 缓存就要占约 3TB,是模型本身的三倍。KV 缓存是指解码时把每个已生成 token 在各层算出的键、值向量存下来,免得下一个 token 从头再算——用显存换重复计算,且随批量和上下文一起线性膨胀。今天大家说「长上下文很贵」,贵的主要就是这块。
另一头是并行度。自回归解码天生一个 token 接一个 token,这条串行链没法靠堆卡缩短,而注意力开销又随序列长度平方增长。于是能动的只有三个旋钮:少占显存、少算 FLOPs、少等延迟。三者并不同向——把权重卸到 CPU 内存能救显存,换来的是更高延迟,这类取舍全文反复出现。
量化真正的敌人不是精度,是那几十个离群维度
量化这节信息密度最高。多项研究给出同一个观察:训练完再压的简单 8 比特量化(PTQ,压完不再训练)掉点相当厉害,罪魁不在权重,在激活值。只把权重压到 8 比特、激活留全精度,几乎无损;一旦激活也压到 8 比特,不管权重什么精度,结果都明显变差。
原因是激活值的动态范围被少数几个维度撑爆了。早期在小 BERT 上就看到 FFN 输出侧有强离群值;到了十亿参数量级这变成结构性的——Dettmers 等人 2022 年在 OPT 系列上发现,模型一旦超过 67 亿参数,离群特征会在所有层里冒出来,这几个维度的激活幅度可比其余大约 100 倍,且模型越大带极端离群值的层越多。一个通道把整条量程占满,剩下的值全挤在一起,8 比特的档位就白给了。
几条解法各有取舍:LLM.int8() 做混合精度,离群那几维留 FP16、其余走 INT8,代价是运行时得靠经验把离群维认出来;细粒度分组把「一个矩阵一个量程」拆成按注意力头、按 token、按嵌入维分组,ZeroQuant 还把量化算子和前一个算子融进同一个 kernel,省掉来回换算;GPTQ 把量化当成最小化输出误差的优化问题,借二阶信息逐行贪心地压,能把 OPT-175B 压到 3 到 4 比特几乎不掉点,但它只管权重;SmoothQuant 最取巧,用一个等价变换把激活的尺度按比例搬一部分到权重上(α=0.5 是多数模型的甜点),两边都变好压,W8A8 于是成立,硬件效率还高过混合精度。
这段值得和第 58 篇对照读。那篇讲的注意力 sink——模型把大量注意力堆在句首那个没内容的位置上——和这里的离群维度不是同一件事,却是同一种体质的两面:Transformer 内部幅度分布极不均匀,少数几个位置或维度吸走绝大部分量级。可解释性研究把它当线索,量化工程师把它当灾难。
剪枝和稀疏:省下来的必须是硬件认得的形状
剪枝一节最有用的判断在开头:非结构化剪枝能砍掉任意一根连接,压缩率好看,但现代硬件吃不下这种不规则的零,通常换不来真实加速。能落地的是结构化的——保持稠密矩阵乘法的形状,零的位置还得符合 kernel 支持的模式。典型是 N:M 稀疏:每 M 个连续元素里有 N 个为零,A100 的 sparse tensor core 直接支持 2:4。文中有个漂亮的小技巧:剪之前先排列通道顺序,只要相乘两个矩阵配对的轴按同样顺序排,乘积不变,于是能把绝对值大的权重凑到一起保住。
方法本身则朴素得意外:按绝对值直接剪掉最小的那批权重,效果常常不输更复杂的方案;「大而稀疏」通常强过「小而稠密」;重训时把学习率倒回训练早期(learning rate rewinding),效果匹配甚至超过把权重也一起倒回去的彩票假设式做法。把稀疏推到极致的 Scaling Transformer 拿到过 37 倍加速——注意前提是单条样本、不做批处理,批一开很多稀疏收益会被摊掉。
MoE(混合专家:每层备一堆专家网络,每个 token 只激活其中几个)省的是每 token 的计算量,不是显存。文中一个容易被忽略的观察是 Task MoE:按任务而不是按 token 路由,看着更笨,但路由一旦静态,推理服务器只需预载用得上的那几个专家——峰值吞吐 2.6 倍,解码器体积只剩 1.6%。代价在通信:GPU 越多每张卡上的专家越少,all-to-all 的每块数据越碎,NCCL 的点对点通信吃不满 NVLink,于是 DeepSpeed 和 TUTEL 都改成先节点内、再节点间的两级树形,通信总量翻倍反而更快——小批量下瓶颈是延迟不是带宽。这个取舍是全文最值得记住的工程直觉之一。
全文最保值的,是一句免责声明
在量化一节的最开头,Weng 插了一句提醒:理论上最优的量化策略和硬件 kernel 的实际支持之间有落差,比如 INT4 乘 FP16 这类运算缺少 GPU kernel 支持,所以下面列的方法并不都能在真机上带来提速。
三年后回看,这句比它下面任何一个具体方法都保值,因为它正是那把筛子。量化赢在 INT8、FP8 有 tensor core 直接吃;非结构化稀疏输在拿不到硬件;而文中只顺带提过一句的 multi-query attention(多个注意力头共享同一份 K 和 V,2019 年的老想法),今天以 GQA 的形式成了几乎所有开源模型的默认配置——不是因为它最聪明,是因为它直接砍的就是开头那 3TB。一项优化能不能活下来,取决于有没有硬件和 kernel 接得住,而不是它在论文里省了几倍。
这条约束也把专栏里几篇串了起来:第 55 篇讲 agent 在训练数据里几乎没有的新芯片上写出比专家手写更快的算子,松动的正是「有没有人肯为它手写 kernel」这个瓶颈;第 44 篇讲万卡集群里一个不报错的慢节点吃掉 7% 算力,是同一本账的训练侧。这篇 2023 年的旧文,是那本账的推理侧原版。
本文为 AKL AI Club 原创撰写的导读,不是原文翻译;著作权归原文作者所有。 篇目由编辑独立选取,来源均经人工核实。