模型量化I—基础概念

最近接了个模型量化的任务,读了几篇比较新的论文,并跑通了几个模型。因为第一次接触这个领域,没有理论基础打底,直接读“大成”性的论文,常常有种云山雾罩的感觉,如空中楼阁,不知道每个结论的来历,理解起来就会比较困难,也不利于开展创造性的工作。于是索性慢下来,花点心思从最基础的内容入手,建立起对该问题系统性的理解。

准备花几个篇幅把模型量化的底层知识梳理一下,本篇作为第一篇,主要是对一些概念的理解。

说起模型量化,不得不提一下模型压缩。模型压缩的必要性想必大家都了解,随着深度学习模型的推广和普及,深度学习模型已经大量应用在如手机、无人机、自动驾驶汽车、智能家居等终端设备上,而这些设备通常受制于存储、带宽、推理速度和功耗等的严格限制,无法进行浮点大模型的部署和推理,因此,需要对大模型进行一定程度的压缩,以满足以上各种限制条件。

深度学习模型的压缩方式主要包括以下几种:

  • 网络裁剪(Network Pruning):也就是模型剪枝,该方法又分为结构化剪枝和非结构化剪枝。

  • 知识蒸馏(Knowledge Distillation):使用精度较高的大模型(Teacher)去“教”小模型,使小模型(Student)获得比直接训练更高的精度。

  • 模型结构设计(Architecture Design):设计适合终端运行的轻量级模型,如MobileNet系列、SqueezeNet等。

  • 模型量化(Parameter Quantization):如将FP32精度的模型转换为FP16、INT8、INT4等精度表示。

模型量化是模型压缩的一种方式,除了直接对大模型量化,也可以将量化和其他模型压缩方式结合在一起使用。

通过模型量化,可以使模型占用更小的存储空间以及传输带宽,有更快的推理速度以及更低的功耗。

一、模型量化基础

神经网络矩阵向量在硬件中的推理逻辑可参考下图。

模型量化I—基础概念_第1张图片

其中,

如果我们要把浮点向量转换为定点向量,则近似公式为:

Sx是量化因子,Xint为量化后的定点化输入向量。因此,量化后的乘加公式可表示为:

模型量化I—基础概念_第2张图片

这里,我们暂时先忽略bias,因为bias的表示一般需要使用更高位(32 bit),并且它的量化因子也依赖于weights和activations的量化因子。

对于累加器,为了防止数据溢出,也需要使用较高的位宽,一般使用32 bit位宽。

存储在32bit位宽中的activations需要存入memory中,以便于作为下一层的输入。为了减少下一层的数据传输带宽和运算复杂度,这些32 bit数据在存储之前需要再次被量化到低位(本篇中以8 bit作为示例),因此,还需要一个requantization的步骤,如下图所示:

模型量化I—基础概念_第3张图片

二、模型量化的分类

根据不同的维度,模型量化有不同的分类。

    • 根据量化方式分类

根据量化方式,模型量化分为训练后量化(PTQ,Post-Training Quantization)和量化感知训练(QAT, Quantization-Aware Training)。

PTQ又分为PTDQ (Post-Training Dynamic Quantization)和PTSQ (Post-Training Static Quantization)。

  • PTDQ:训练收敛后进行量化,其中,Weight被提前量化,Activation在前向推理过程中进行动态量化,每次根据实际运算的浮点数据范围,对每一层计算一次Scale和Zero_Point,然后进行量化。

  • PTSQ:Weight被提前量化,Activation基于之前校准过程中记录下的固定的Scale和Zero_Point进行量化,整个过程不需要再次计算Scale和Zero_Point。

  • QAT:在模型训练过程中模拟量化过程,称为量化感知训练,该方法有利于提高量化模型的精度。

    • 根据量化的数据均匀性分类

根据量化数据的均匀性可将量化分为均匀量化和非均匀量化。其中,均匀量化又称线性量化,是使用最多的量化方式。

考虑零点Zero_Point的情况下,用量化值对真实值的近似公式为:

z为Zero_Point。根据Zero_Point是否为0,均匀量化又分为对称量化和非对称量化。Zero_Point=0时,称为对称量化,Zero_Point≠0时,称为非对称量化。

模型量化I—基础概念_第4张图片
    • 根据量化位宽分类

根据量化位宽分类,可将量化分为:(1) 统一位宽量化,比如所有weights都使用8 bit整数进行量化;(2) 混合精度量化,比如混合使用INT2/INT4/INT8等不同位宽整数进行量化。这在我们后续的文章中会重点讨论。

    • 根据量化参数粒度分类

根据量化参数的粒度进行分类,可将量化分为per-tensor量化和per-channel量化。

(1) per-tensor/per-layer: 每层使用独立的量化参数,这种实现相对简单,也是目前使用最多的量化方案,便于硬件执行。

(2) per-channel/per-axis:权重的每个通道使用单独的量化参数,这种量化粒度比per-tensor更小,通常能带来较高的精度,但是也会带来额外的开销。

你可能感兴趣的:(模型量化,AI芯片,人工智能)