量化技术,通俗来讲,就是给深度学习模型做“瘦身”——而且是那种效果立竿见影、让人赞叹的高效解决方案。先给出几个核心判断:它不仅能显著缩减模型体积,还能在精度损失极小的前提下,将推理速度推向新高。
本文将从最基础的二进制表示讲起,一路深入解读 INT4、INT8、FP8 等常见量化格式,把模型量化的原理与实现彻底讲透。即使你对这块内容完全陌生,跟着梳理一遍,也能建立起清晰的认知框架。

1. 数字表示基础
1.1 二进制与十进制转换
在计算机的世界里,所有数据归根结底都以二进制形式存在——只包含 0 和 1 两个数字。而我们人类习惯使用的是十进制,由 0 到 9 共十个数字组成。这两者之间的转换,就像在不同语言之间进行翻译。
举例来说,十进制 13 转换成二进制是 1101。转换过程是不断除以 2 并取余数:13 ÷ 2 商 6 余 1,6 ÷ 2 商 3 余 0,3 ÷ 2 商 1 余 1,1 ÷ 2 商 0 余 1。将这些余数从下往上倒序排列,就得到 1101。
反过来,二进制 1101 转十进制也很简单:从右向左,每一位分别对应 2 的 0 次方、1 次方、2 次方、3 次方。计算 1×8 + 1×4 + 0×2 + 1×1,结果等于 13。
1.2 浮点数与整数区别
(一)整数类型(INT)
INT 是 Integer 的缩写,代表整数。像 1、2、3 这类数值,不包含小数部分。
INT4 使用 4 位二进制表示一个整数,INT8 则用 8 位。4 位二进制最多能表示 16 个不同的数值,有符号时取值范围为 -8 到 7,无符号时为 0 到 15。8 位则可以表示 256 个数值,有符号范围是 -128 到 127,无符号范围是 0 到 255。
(二)浮点数类型(FP)
FP 是 Floating Point 的缩写,用于表示带小数部分的数值。
它由符号位、指数位、尾数位三部分组成。FP32 拥有 1 位符号位、8 位指数位、23 位尾数位,表示范围极大。它就像一把可伸缩的卷尺,既能测量微尘,也能丈量山脉。而 INT8 只能表示整数,类似一把刻度固定的直尺。
(三)常用的数据类型
- Float32 (FP32):标准 32 位浮点格式,精度高、动态范围大,绝大多数硬件都原生支持,在模型训练和推理中应用最为广泛。
- Float16 (FP16):16 位浮点格式,精度低于 FP32,但内存占用减半、计算速度提升。不足之处在于数值范围较小,容易发生上溢或下溢,不过可以通过一些技巧来缓解。
- Bfloat16 (BF16):另一种 16 位浮点格式,其指数位数与 FP32 相同,因此动态范围大,但尾数精度比 FP16 还低。适合处理数值跨度较大的场景。
- Int8:8 位整数格式,数值范围有限但内存占用极小。主要用于模型量化,将 FP32 或 FP16 的参数转换为 Int8,能够显著降低内存和算力消耗。
2. 量化概念
2.1 量化定义
量化好比将一幅高精度的画作转换成低精度版本,同时尽量保留其视觉冲击力。在计算机领域,量化是指将模型数据从高精度表示转换为低精度表示,例如从 FP32 转为 FP16 或 Int8。
FP32 精度很高,但存储开销大、计算速度慢。FP16 存储减半、速度提升,但精度随之降低。Int8 存储更小、速度更快,但只能表示整数数值。
2.2 量化目的
量化的核心目标只有一个:降低模型存储与计算负担,同时尽可能减少精度损失。具体来说:
- 减少存储需求:大模型参数动辄数亿甚至数十亿,FP32 每个参数占用 4 字节,量化为 FP16 变为 2 字节,再压缩到 Int8 只需 1 字节,存储空间直接缩减 75%。
- 提高计算效率:低精度计算在硬件优化方面更具优势,推理速度得到显著提升。
- 降低功耗:计算资源减少,能耗自然下降,这对移动端和嵌入式设备尤其重要。
- 减少带宽需求:模型体积变小,在分布式系统之间传输也更快。
3. INT4、INT8量化
3.1 INT4与INT8表示范围
INT4 和 INT8 都属于整数量化,区别在于表示范围和精度水平。
- INT8:8 位整数,取值范围 -128 到 127。在图像处理中,像素值通常为 0 到 255,用 INT8 刚好可以覆盖。
- INT4:4 位整数,取值范围 -8 到 7。范围虽小,但存储效率和速度更优。在精度要求不高的网络层,使用 INT4 能够大幅节省资源。
3.2 量化公式与示例
以 FP32 量化到 INT8 为例,核心公式为:q = round(x / scale),然后将结果裁剪到 INT8 的表示范围 [-128, 127] 内。
缩放因子 scale 根据浮点数的最大绝对值来确定。假设有一组浮点数,先找出其中的最大绝对值,再用这个值计算 scale。
举一个具体例子。假设浮点数组为 [-0.5, 0.3, 1.2, -2.1]:
- 最大绝对值为 2.1
- scale = 127 / 2.1 ≈ 60.476
- -0.5 → -30, 0.3 → 18, 1.2 → 73, -2.1 → -127
最终量化后的 INT8 表示为 [-30, 18, 73, -127]。
量化过程当然会带来精度损失,但通过合理选择 scale,可以在压缩存储和计算的同时,尽可能保持模型性能。
4. FP8、FP16、FP32量化
4.1 FP8、FP16、FP32表示方法
这三种都属于浮点数类型,区别仅在于位数不同:
- FP32:1 位符号 + 8 位指数 + 23 位尾数,取值范围约 1.4×10⁻⁴⁵ 到 3.4×10³⁸,精度约为小数点后 6 位。
- FP16:1 位符号 + 5 位指数 + 10 位尾数,取值范围约 6.1×10⁻⁵ 到 65504,精度约为小数点后 3 位。
- FP8:新兴的低精度浮点格式,指数位为 3 或 4 位,尾数位为 4 或 3 位。表示范围进一步缩小,但极致轻量,适合资源受限的场景。
4.2 量化过程与公式
将 FP32 量化为 FP16 的过程,本质上也是寻找合适的缩放因子 scale。计算方式与 INT8 量化类似:先找出最大绝对值,再根据目标格式的最大值计算 scale。
以上述同样的数组为例,目标 FP16 的最大值为 65504,scale ≈ 31192.38。量化结果为 [-16, 10, 38, -66]。
可以看到,虽然数值从 FP32 变为了 FP16,但整体分布保留得比较好。量化带来的精度损失,通过合理选择 scale 可以控制在可接受范围内。
5. 量化应用与优势
5.1 在深度学习中的应用
量化在深度学习领域覆盖范围很广,这里重点看三个方向:
模型训练加速
FP16 或 FP8 可以显著加快训练速度。以 NVIDIA Hopper 架构 GPU 为例,FP8 Tensor Core 计算能够带来 2 到 3 倍的加速效果。Inflection AI 的 Inflection2 模型就使用了 5000 个 Hopper GPU 以 FP8 混合精度训练,累计算力达到 10²⁵ FLOPs,性能对标 Google 旗舰模型 PaLM 2。
模型推理优化
将 FP32 模型量化为 INT8,存储空间减少 75%,推理速度成倍提升。Google 和 NVIDIA 团队合作,使用 TensorRT-LLM 和 FP8 加速 Gemma 推理,结果显示 FP8 相比 FP16,吞吐量提升了超过 3 倍。
模型压缩与部署
量化后的模型更容易部署到资源有限的环境中。零一万物的实践表明,大模型在 FP8 训练下的吞吐量相比 BF16 提升了 1.3 倍。NVIDIA Transformer Engine 已集成到 PyTorch、JAX、PaddlePaddle 等主流框架中,为量化推理提供硬件级别的加速支持。
5.2 优势与局限性
优势
- 计算效率提升:低精度计算的吞吐量高出数倍,尤其在大模型场景下效果更为明显。
- 存储需求降低:量化后模型体积大幅缩减,节省存储空间。
- 功耗降低:计算资源减少,能耗随之下降,有利于绿色计算。
- 模型优化:量化推动模型在训练和推理环节进一步优化,降低部署成本。
局限性
- 精度损失:低精度格式下精度损失难以完全避免,尤其是 FP8,但合理选择 scale 可以有效缓解。
- 硬件支持有限:FP8 和 FP16 需要特定硬件支撑,如果硬件不支持,其优势将无法发挥。
- 复杂性增加:量化过程本身增加了模型开发与部署的难度,需要额外计算 scale 并进行校准。
- 适用场景有限:在高精度任务如科学计算、金融建模等领域,量化可能导致不可接受的精度损失。
量化技术的本质,就是在精度与效率之间找到最佳平衡点。理解了这一点,你就掌握了模型量化的核心逻辑。在实际应用中,根据具体场景选择合适策略,才能在性能与资源之间实现最优的平衡。
