大模型量化技术详解:原理、类型与实战应用
1. 什么是量化
量化(Quantization)是大模型领域中的一项关键技术,它通过降低模型参数的精度,将浮点数转换为整数或定点数,从而实现模型的压缩和优化。这样做的主要目的是减少模型的存储需求、加快推理速度,并降低模型的计算复杂度,使得大模型能够更高效地在资源受限的设备上运行,例如移动设备、嵌入式系统或边缘计算场景。
在深度学习模型中,参数通常以 32 位浮点数(FP32)存储。对于拥有数十亿甚至数千亿参数的大模型,这种存储方式会占用巨大的显存和内存。量化通过将高精度浮点映射到低精度整数(如 INT8),可以在几乎不损失精度的情况下显著减少模型体积。
2. 精度格式基础
理解量化首先需要了解计算机中的数据表示单位及常见的数值格式。
2.1 基本单位
- Bit(位):计算机中最小的数据单位,只能存储 0 或 1 两种状态。
- Byte(字节):由 8 个 bit 组成,是常用的数据存储单位。
2.2 常见浮点与整数格式
- FP32 (Single Precision):32 位浮点数,符号位 1 位,指数位 8 位,尾数位 23 位。精度约为 7 位有效数字,常用于训练阶段。
- FP16 (Half Precision):16 位浮点数,符号位 1 位,指数位 5 位,尾数位 10 位。精度约为 3 位有效数字,常用于混合精度训练和推理。
- BF16 (Brain Floating Point):16 位浮点数,符号位 1 位,指数位 8 位,尾数位 7 位。保留了 FP32 的指数范围,适合大模型训练中的梯度稳定性。
- INT8:8 位整数,范围为 -128 到 127。是量化推理中最常用的目标格式,能大幅降低计算量和内存带宽需求。
3. 量化的类型
按照量化方法可以划分为线性量化、非线性量化(如对数量化)等多种方式,目前较为常用的是线性量化。其中线性量化又可以按照对称性划分为对称量化和非对称量化。
3.1 对称线性量化
对称量化的特点是量化后的值中零点必须对应于原始值中的零,即量化操作的零点固定不变。这种方式通常使用两个参数(量化的最小值和最大值)来定义量化的范围,而这个范围是以零为中心对称的。
公式如下: $$ Q = \text{round}(S \times F) $$ 其中 $Q$ 为量化后整数,$F$ 为浮点数,$S$ 为缩放因子(Scale)。
3.2 非对称线性量化
非对称量化不强制要求量化后的零点对应于原始数据中的零点。这种量化方法使用三个参数来定义从原始数值到量化数值的映射关系:量化最小值、量化最大值和零点(Zero-point)。这意味着量化操作可以有一个任意的零点,这个零点被映射到量化范围内的某个整数值上。
非对称量化特别适合于原始数据分布不关于零对称的情况,例如当数据集中包含大量正值或负值时。它允许更灵活的量化范围定义,以适应数据的实际分布,从而减少量化误差,提高量化后的模型精度。
4. 量化的粒度
量化粒度(Quantization Granularity)是量化技术中的一个重要概念,它决定了量化操作的精细程度。量化粒度影响着量化参数的共享方式,即量化的规模和范围。不同的量化粒度可以带来不同的精度和效率的权衡。
4.1 Per-tensor
整个张量或整个层级共享相同的量化参数(scale 和 zero-point)。这种方式的优点是存储和计算效率较高,但可能会导致精度损失,因为一个固定的量化参数难以覆盖所有数据的动态范围。
4.2 Per-channel
每个通道或每个轴都有自己的量化参数。这种方式可以更准确地量化数据,因为每个通道可以有自己的动态范围,但会增加存储需求和计算复杂度。在权重量化中,Per-channel 非常常见。
4.3 Per-group
在量化过程中,将数据分成块或组,每块或每组有自己的量化参数。这是介于 Per-tensor 和 Per-channel 之间的折中方案,常用于激活值量化。
量化粒度的选择取决于模型的特定需求和目标硬件平台的特性。例如,在 TensorRT 中,默认对激活值使用 Per-tensor 量化,而对权重使用 Per-channel 量化。
5. Weight Packing(权重打包)
Weight packing 是量化中的一个概念,它涉及将多个权重参数合并或'打包'成一个量化单元,以减少模型的内存占用和提高计算效率。权重打包技术可以与量化结合使用,通过减少模型参数的数量来进一步压缩模型大小,同时保持模型性能。这通常通过将权重矩阵分解为较小的块,然后对这些块应用量化和编码技术来实现。


