目录
6.BN(BatchNormalization)层有两个主要参数:
1.量化原理和参数量
-
量化: 将浮点数值映射到一个固定的整数范围内,通常是 [0, 255] 或 [-128, 127]。这需要确定一个量化因子和零点偏移。
-
量化因子 = (最大值 - 最小值) / (最大整数值 - 最小整数值)
-
零点偏移 = 最小整数值 - 最小值 / 量化因子
-
-
反量化: 将量化后的整数值映射回浮点数值,公式如下:
- 浮点数值 = (整数值 - 零点偏移) * 量化因子
-
量化感知训练: 有时我们还需要在训练过程中考虑量化的影响,这就是量化感知训练。它可以在不损失模型精度的情况下进行量化。
2.参数量计算举例
假设我们有一个 3x3 的卷积层,输入特征图大小是 32x32,输入通道数是 3,输出通道数是 16。
-
原始模型中的权重和激活:
-
权重: 16 x 3 x 3 x 3 个浮点数值
-
激活: 32 x 32 x 16 个浮点数值,无下采样下,输出fm也是32*32
-
-
确定量化范围:
-
权重的最大值为 1.5,最小值为 -1.5
-
激活的最大值为 6.0,最小值为 -6.0
-
-
计算量化参数:
-
权重的量化因子 = (1.5 - (-1.5)) / (127 - (-128)) = 0.011764705882352941
-
权重的零点偏移 = -128 * 0.011764705882352941 = -1.5
-
激活的量化因子 = (6.0 - (-6.0)) / (255 - 0) = 0.023529411764705882
-
激活的零点偏移 = 0 * 0.023529411764705882 = 0
-
-
量化过程:
-
将权重值乘以量化因子并四舍五入成整数值, 再加上零点偏移
-
将激活值乘以量化因子并四舍五入成整数值
-
-
量化模型的存储:
-
权重: 16 x 3 x 3 x 3 个 int8 整数值
-
激活: 32 x 32 x 16 个 uint8 整数值
-
量化参数: 2个浮点数值(量化因子和零点偏移)
-
-
量化模型的计算:
-
卷积运算使用 int8 乘法和 int32 累加
-
激活使用 uint8 查表和 int32 转换
-
3.CBN计算过程
-
对input的fm做conv,
-
Conv后的结果做bias,每个通道一个bias,
-
再对bias后的结果做BN,一个缩放一个平移因子。
-
再对BN后的结果做relu,H*W*C个参数
4.为什么权重是-128到128但是激活是0-255?
-
权重的量化范围通常为 -128 到 127 (或 -256 到 255):
-
权重可能包含正负值,所以需要一个对称的范围来覆盖正负值。
-
选择 -128 到 127 是一个常见的选择,因为它可以用 int8 类型来表示,占用空间小。
-
-
激活的量化范围通常为 0 到 255:
-
激活值是经过非线性激活函数(如 ReLU)处理后的结果,通常都是非负值。
-
使用 0 到 255 的范围可以利用 uint8 类型来表示,比使用有符号的 int8 更加高效。
-
5.这样的不对称量化范围有几个优点:
-
权重的对称范围可以更好地保留正负值信息,有利于保持模型精度。
-
激活的非负范围适合使用无符号整数表示,节省存储空间和计算资源。
-
在 CPU 或 GPU 上进行 int8 乘法和 uint8 加法计算,通常比使用完全对称的 int8 计算更加高效。
6.BN(BatchNormalization)层有两个主要参数:
-
缩放系数 gamma:
-
gamma 是一个1D张量,长度等于BN层的通道数。
-
gamma 参数用于对BN层的输出进行缩放,以恢复网络的表达能力。
-
-
偏移量 beta:
-
beta 也是一个1D张量,长度等于BN层的通道数。
-
beta 参数用于对BN层的输出进行平移,以恢复网络的表达能力。
-
这两个参数 gamma 和 beta 是在训练过程中学习得到的。
关于是否需要量化这两个参数:
-
通常情况下, gamma 和 beta 参数不需要量化:
-
因为它们是浮点数参数,不会占用太多存储空间。
-
量化这两个参数也不会对模型性能带来太大影响。
-
7.Calibration
Calibration在量化神经网络中指的是确定量化参数的过程。具体来说,calibration包括以下几个主要步骤:
-
确定量化范围:
-
找到网络参数(权重、偏置)和激活值(feature map)的最大最小值,确定量化范围。
-
这可以通过统计一些代表性的输入样本得到。
-
-
确定量化步长:
-
根据量化范围和目标量化位宽,计算出合适的量化步长。
-
通常使用均匀量化,即步长固定。
-
-
校准零点偏移(optional):
-
对于非对称量化,需要校准零点偏移,以使量化后的0点对应原始数据的0点。
-
这样可以减小量化误差。
-
-
保存量化参数:
- 将确定的量化范围、步长、零点偏移等参数保存下来,在inference时使用。
上述就是calibration的基本流程。不同的calibration方法可以针对特定网络结构和数据分布进行优化,以达到更好的量化效果。
你提到的B.1 Simple Calibration和B.2 Advanced Calibration是TI工具链提供的两种校准选项:
-
Simple Calibration是一种简单高效的校准方式,适用于大多数常见网络。
-
Advanced Calibration则提供了一些高级选项,如bias校准、直方图统计等,可以进一步优化量化效果。
总之,calibration是量化过程中非常重要的一步,直接影响到量化后的模型精度。选择合适的校准方式需要结合具体任务和硬件环境进行权衡。
-
偏差校准(Bias Calibration):
-
这是一种用于提高低精度模型(如8位量化模型)准确性的技术。
-
在量化之前,会对模型的权重和激活值进行偏差校准,以消除由量化引入的系统性偏差。
-
偏差校准通过统计分析模型的输出结果,并计算出一个校正因子,从而抵消量化引入的偏差。
-
校正因子会被应用到量化后的权重和激活值上,以减少精度损失。
-
-
直方图统计校准(Histogram Statistics Calibration):
-
这也是一种量化前的校准技术,旨在缓解量化带来的精度损失。
-
它通过统计分析模型的权重和激活值的分布直方图,来计算合适的量化参数。
-
直方图统计校准会估算出最佳的量化范围和量化步长,以最大限度地保留原始数据的统计特性。
-
这种方法可以自适应地确定每一层的最佳量化参数,从而提高量化模型的整体精度。
-
8.混合精度量化
-
如果某一层掉点很多,可以用混合精度量化推理,需要做Calibration
-
手动选择混合精度层:
-
用户可以手动指定哪些层应该使用 16 位精度,其余层使用 8 位精度。
-
用户可以通过 advanced_options:output_feature_16bit_names_list 和 advanced_options:params_16bit_names_list 参数来编译模型。
-
用户可以选择只提升参数/权重到 16 位,或同时提升激活和参数到 16 位。
-
并非所有层都支持精度的更改,只有部分层支持(如 TIDL_ConvolutionLayer、TIDL_BatchNormLayer 等)。
-
-
自动选择混合精度层:
-
这是一个更高级的特性,可以自动选择应该设置为 16 位的层。
-
用户可以设置 advanced_options:mixed_precision_factor 参数,该参数定义了性能损耗的上限。
-
算法会自动选择最有影响力的层设置为 16 位,以达到用户指定的性能损耗上限。
-
该方法会使用高级偏差校准作为算法的一部分。
-
推荐设置 accuracy_level=1、calibration_frames=50 和 calibration_iterations=50 作为编译参数。
-
9.量化感知训练的基本思路:
-
QAT 是一种训练模型时就考虑量化因素的方法。
-
在训练过程中,模型参数会被优化以适应 8 位定点推理的损失LOSS。
-
这需要对训练框架做一些支持和修改,以便在训练期间模拟量化的效果。
-
QAT 模型的特点:
-
在 QAT 模型中,特征映射范围值会被嵌入到模型中。
-
因此,对于 QAT 模型,不需要使用高级校准特性,如偏差校准或直方图统计校准。
-
QAT 模型采用一些特殊的算子,如 CLIP、Minimum、PACT 和 ReLU6 等
-
-
问题:量化操作(如取整)是不可微分的,为了在反向传播过程中计算梯度,QAT采用了梯度近似的技术。常见的方法包括直接通过量化操作传递梯度(即假设量化操作的梯度为1)或使用"直通估计"(Straight Through Estimator, STE)。
10.量化实战
使用onnxruntime量化:
使用torch量化