TellWorldAI 世界档案
问档案English

首页›原理

原理

量化(Quantization)

量化把语言模型的权重和激活值用更低的数值精度存储,从而降低推理所需的内存和带宽。LLM.int8() 与 GPTQ 等方法让超大规模模型能够跑在远小的硬件上。

量化在做什么

训练好的语言模型是一大堆数字。在普通的检查点里,这些数字——每一个权重,以及模型运行时产生的每一个激活值——都以 16 位或 32 位浮点数保存。量化把这些权重和激活值用更低的数值精度存下来,使推理所需的内存和带宽低于 16 位或 32 位检查点[1][2]。

省下来的东西很直观。生成每一个词元(token)时,模型都要把权重从显存里搬出来,与激活值相乘。如果每个数字只占原来的四分之一甚至八分之一,同一个模型就能塞进更小的设备,运算单元每次操作搬运的数据也更少。真正决定一个模型能开多大、回答有多快的,往往不是纯算力,而是显存容量和显存带宽。

怎么工作

基本做法是:把一组高精度数字映射到一张粗得多的低精度格点上——通常用整数表示——同时保存一个缩放系数,记下相邻格点之间差多少。举例来说,8 位整数只能表示 256 个不同的值,于是一组权重被压缩到这 256 个档位里,缩放系数单独留着,用来大致还原原来的数值大小。运行时先用低精度数值做乘法,再把缩放系数乘回去,模型处理的始终是压缩后的数字,而不是原始浮点数。

难点在于权重并不是均匀分布的。少数数值远大于其余数值,如果整个张量共用一个缩放系数,这些大值就会决定格点的疏密,把大量小值挤成一团。LLM.int8() 用向量级量化(vector-wise quantization)来应对:它为每个内积单独设置归一化常数,而不是整个张量只用一个[1]。

LLM.int8()

Dettmers 等人在 2022 年 8 月发表了 LLM.int8(),这是一套针对 Transformer 前馈层和注意力投影层的 Int8 矩阵乘法流程,把推理所需的内存减半,同时保持与全精度一致的表现[1]。用这个方法,一个 175B 参数的 16 位或 32 位检查点可以被加载、转换为 Int8 并立刻使用,而不出现性能下降[1]。

这套方法还专门处理了离群值。它把涌现出来的离群特征维度单独隔离出来,交给 16 位矩阵乘法处理,而超过 99.9% 的数值仍然以 8 位相乘[1]。作者表示,这一结果让 OPT-175B 和 BLOOM 这样的模型可以在配消费级 GPU 的单台服务器上使用[1]。

GPTQ

Frantar 等人在 2022 年 10 月发表了 GPTQ,这是一种基于近似二阶信息的一次性权重量化方法[2]。8 位方案已经把内存减半,GPTQ 走得更远:它能在约 4 个 GPU 小时内把一个 1750 亿参数的模型量化到每个权重 3 位或 4 位,相对于未压缩的基线只有可忽略的精度下降[2]。

作者报告说,它的压缩收益是此前提出的一次性量化方法的两倍以上;按他们的说法,这第一次让一个 175B 参数的模型在单块 GPU 内完成生成式推理[2]。压缩也带来了速度:GPTQ 相对 FP16 的端到端推理加速在 NVIDIA A100 上约为 3.25 倍,在 A6000 上约为 4.5 倍[2]。

局限

收益并非没有边界。在 2 位或三值权重的极端情形下,GPTQ 的作者报告的是「尚可」的精度,而不是可忽略的下降,这标出了训练后量化(post-training quantization)的实际极限[2]。两种方法共同说明的道理是:低精度推理真正好用的区间在那条底线之上——模型可以大幅压缩,同时不丢掉全精度版本的质量。

引用本页: 量化(Quantization). TellWorld, https://www.tellworld.net/zh/learn/quantization. 更新于 2026-11-07