什么是量化?

大模型中的量化 (Quantization)

在大模型领域,"量化" 是一种模型压缩技术,旨在通过减少模型中权重和/或激活值的数值精度来降低模型的内存占用、计算复杂度和能耗,同时尽量保持模型的准确性。

为什么需要量化?

  • 模型大小: 大型语言模型 (LLMs) 通常具有数十亿甚至数千亿个参数,这些参数通常以 32 位浮点数 (FP32) 存储,导致模型文件非常大(例如,一个 175B 参数的模型,以 FP32 存储,大约需要 700GB 的存储空间)。

  • 计算成本: FP32 运算需要大量的计算资源和时间。

  • 内存带宽: 加载和处理 FP32 数据需要高内存带宽。

  • 能耗: FP32 运算和高内存带宽需求导致高能耗。

量化通过将 FP32 数值转换为较低精度的表示形式(如 INT8、INT4)来解决这些问题。

量化的基本原理

量化过程通常涉及以下几个步骤:

  1. 确定量化范围: 找到模型权重或激活值的最大值和最小值。

  2. 选择量化级别: 确定要使用的位数(例如,INT8 使用 8 位,INT4 使用 4 位)。

  3. 映射: 将原始 FP32 值映射到选定的量化级别。这通常涉及缩放和舍入操作。

  4. 反量化 (可选): 在某些情况下,为了进行计算,需要将量化后的值转换回 FP32。

量化的类型

  • 训练后量化 (Post-Training Quantization, PTQ): 这是最常用的量化方法。它在模型训练完成后进行,不需要重新训练模型。PTQ 可以进一步分为:

    • 动态量化 (Dynamic Quantization): 在运行时根据每个批次的数据动态确定量化参数(如缩放因子)。

    • 静态量化 (Static Quantization): 使用校准数据集(通常是训练数据的一个子集)来预先计算量化参数,并在推理过程中使用这些固定的参数。

  • 量化感知训练 (Quantization-Aware Training, QAT): 在模型训练过程中模拟量化操作,使模型在训练时就适应低精度计算。QAT 通常可以获得比 PTQ 更好的精度,但需要重新训练或微调模型。

常见的数值精度格式

  • FP32 (32-bit Floating Point): 单精度浮点数。这是深度学习中最常用的数据类型,提供高精度,但计算和存储成本高。

    • 1 位符号位 (sign)

    • 8 位指数位 (exponent)

    • 23 位尾数位 (mantissa/fraction)

  • FP16 (16-bit Floating Point): 半精度浮点数。与 FP32 相比,FP16 减少了内存占用和计算量,但可能会导致精度损失。一些硬件(如 NVIDIA Tensor Cores)对 FP16 有原生支持,可以显著加速计算。

    • 1 位符号位

    • 5 位指数位

    • 10 位尾数位

  • BF16 (BFloat16, Brain Floating Point 16): 另一种 16 位浮点数格式。与 FP16 相比,BF16 具有与 FP32 相同的指数位范围(8 位),但尾数位更少(7 位)。这使得 BF16 在表示范围上更接近 FP32,更容易从 FP32 转换,并且在某些情况下可以获得比 FP16 更好的性能。许多现代硬件(如 Google TPUs、Intel CPUs)都支持 BF16。

    • 1 位符号位

    • 8 位指数位

    • 7 位尾数位

  • INT8 (8-bit Integer): 8 位整数。量化到 INT8 可以显著减少内存占用和计算量。通常需要校准来确定量化范围和缩放因子。INT8 可以是有符号的 (signed) 或无符号的 (unsigned)。

    • 有符号 INT8: 范围为 -128 到 127

    • 无符号 INT8: 范围为 0 到 255

  • INT4 (4-bit Integer): 4 位整数。进一步减少内存占用和计算量,但精度损失更大。通常需要更复杂的量化技术(如分组量化、二值化)来保持模型性能。

    • 有符号 INT4: 范围为 -8 到 7

    • 无符号 INT4: 范围为 0 到 15

总结

格式
位数
类型
优点
缺点

FP32

32

浮点

高精度,深度学习标准格式

内存占用大,计算成本高

FP16

16

浮点

减少内存占用和计算量,部分硬件加速

精度损失,可能需要混合精度训练

BF16

16

浮点

与 FP32 相似的动态范围,易于转换,部分硬件加速

尾数位较少,精度可能低于 FP16

INT8

8

整数

显著减少内存占用和计算量,部分硬件加速

精度损失,通常需要校准

INT4

4

整数

极大地减少内存占用和计算量

精度损失较大,需要更复杂的量化技术

选择哪种精度?

选择哪种精度取决于具体的应用场景、硬件平台和性能要求。一般来说:

  • 追求最高精度: FP32

  • 在精度和速度之间取得平衡: FP16 或 BF16

  • 最大程度地减少内存占用和计算量 (例如,在边缘设备上部署): INT8 或 INT4 (通常需要结合量化技术,如 PTQ 或 QAT)

在实际应用中,通常会尝试多种量化方法和精度,并通过实验来确定最佳方案。

Last updated