神经网络量化笔记

目录

1.量化原理和参数量

2.参数量计算举例

3.CBN计算过程

4.为什么权重是-128到128但是激活是0-255?

5.这样的不对称量化范围有几个优点:

6.BN(BatchNormalization)层有两个主要参数:

7.Calibration

8.混合精度量化

9.量化感知训练的基本思路:

10.量化实战


1.量化原理和参数量

  1. 量化: 将浮点数值映射到一个固定的整数范围内,通常是 [0, 255] 或 [-128, 127]。这需要确定一个量化因子和零点偏移。

    • 量化因子 = (最大值 - 最小值) / (最大整数值 - 最小整数值)

    • 零点偏移 = 最小整数值 - 最小值 / 量化因子

  2. 反量化: 将量化后的整数值映射回浮点数值,公式如下:

    • 浮点数值 = (整数值 - 零点偏移) * 量化因子
  3. 量化感知训练: 有时我们还需要在训练过程中考虑量化的影响,这就是量化感知训练。它可以在不损失模型精度的情况下进行量化。

2.参数量计算举例

假设我们有一个 3x3 的卷积层,输入特征图大小是 32x32,输入通道数是 3,输出通道数是 16。

  1. 原始模型中的权重和激活:

    • 权重: 16 x 3 x 3 x 3 个浮点数值

    • 激活: 32 x 32 x 16 个浮点数值,无下采样下,输出fm也是32*32

  2. 确定量化范围:

    • 权重的最大值为 1.5,最小值为 -1.5

    • 激活的最大值为 6.0,最小值为 -6.0

  3. 计算量化参数:

    • 权重的量化因子 = (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

  4. 量化过程:

    • 将权重值乘以量化因子并四舍五入成整数值, 再加上零点偏移

    • 将激活值乘以量化因子并四舍五入成整数值

  5. 量化模型的存储:

    • 权重: 16 x 3 x 3 x 3 个 int8 整数值

    • 激活: 32 x 32 x 16 个 uint8 整数值

    • 量化参数: 2个浮点数值(量化因子和零点偏移)

  6. 量化模型的计算:

    • 卷积运算使用 int8 乘法和 int32 累加

    • 激活使用 uint8 查表和 int32 转换

3.CBN计算过程

  1. 对input的fm做conv,

  2. Conv后的结果做bias,每个通道一个bias,

  3. 再对bias后的结果做BN,一个缩放一个平移因子。

  4. 再对BN后的结果做relu,H*W*C个参数

4.为什么权重是-128到128但是激活是0-255?

  1. 权重的量化范围通常为 -128 到 127 (或 -256 到 255):

    • 权重可能包含正负值,所以需要一个对称的范围来覆盖正负值。

    • 选择 -128 到 127 是一个常见的选择,因为它可以用 int8 类型来表示,占用空间小。

  2. 激活的量化范围通常为 0 到 255:

    • 激活值是经过非线性激活函数(如 ReLU)处理后的结果,通常都是非负值。

    • 使用 0 到 255 的范围可以利用 uint8 类型来表示,比使用有符号的 int8 更加高效。

5.这样的不对称量化范围有几个优点:

  1. 权重的对称范围可以更好地保留正负值信息,有利于保持模型精度。

  2. 激活的非负范围适合使用无符号整数表示,节省存储空间和计算资源。

  3. 在 CPU 或 GPU 上进行 int8 乘法和 uint8 加法计算,通常比使用完全对称的 int8 计算更加高效。

6.BN(BatchNormalization)层有两个主要参数:

  1. 缩放系数 gamma:

    • gamma 是一个1D张量,长度等于BN层的通道数。

    • gamma 参数用于对BN层的输出进行缩放,以恢复网络的表达能力。

  2. 偏移量 beta:

    • beta 也是一个1D张量,长度等于BN层的通道数。

    • beta 参数用于对BN层的输出进行平移,以恢复网络的表达能力。

这两个参数 gamma 和 beta 是在训练过程中学习得到的。

关于是否需要量化这两个参数:

  1. 通常情况下, gamma 和 beta 参数不需要量化:

    • 因为它们是浮点数参数,不会占用太多存储空间。

    • 量化这两个参数也不会对模型性能带来太大影响。

7.Calibration

Calibration在量化神经网络中指的是确定量化参数的过程。具体来说,calibration包括以下几个主要步骤:

  1. 确定量化范围:

    • 找到网络参数(权重、偏置)和激活值(feature map)的最大最小值,确定量化范围。

    • 这可以通过统计一些代表性的输入样本得到。

  2. 确定量化步长:

    • 根据量化范围和目标量化位宽,计算出合适的量化步长。

    • 通常使用均匀量化,即步长固定。

  3. 校准零点偏移(optional):

    • 对于非对称量化,需要校准零点偏移,以使量化后的0点对应原始数据的0点。

    • 这样可以减小量化误差。

  4. 保存量化参数:

    • 将确定的量化范围、步长、零点偏移等参数保存下来,在inference时使用。

上述就是calibration的基本流程。不同的calibration方法可以针对特定网络结构和数据分布进行优化,以达到更好的量化效果。

你提到的B.1 Simple Calibration和B.2 Advanced Calibration是TI工具链提供的两种校准选项:

  • Simple Calibration是一种简单高效的校准方式,适用于大多数常见网络。

  • Advanced Calibration则提供了一些高级选项,如bias校准、直方图统计等,可以进一步优化量化效果。

总之,calibration是量化过程中非常重要的一步,直接影响到量化后的模型精度。选择合适的校准方式需要结合具体任务和硬件环境进行权衡。

  1. 偏差校准(Bias Calibration):

    • 这是一种用于提高低精度模型(如8位量化模型)准确性的技术。

    • 在量化之前,会对模型的权重和激活值进行偏差校准,以消除由量化引入的系统性偏差。

    • 偏差校准通过统计分析模型的输出结果,并计算出一个校正因子,从而抵消量化引入的偏差。

    • 校正因子会被应用到量化后的权重和激活值上,以减少精度损失。

  2. 直方图统计校准(Histogram Statistics Calibration):

    • 这也是一种量化前的校准技术,旨在缓解量化带来的精度损失。

    • 它通过统计分析模型的权重和激活值的分布直方图,来计算合适的量化参数。

    • 直方图统计校准会估算出最佳的量化范围和量化步长,以最大限度地保留原始数据的统计特性。

    • 这种方法可以自适应地确定每一层的最佳量化参数,从而提高量化模型的整体精度。

8.混合精度量化

  1. 如果某一层掉点很多,可以用混合精度量化推理,需要做Calibration

  2. 手动选择混合精度层:

    • 用户可以手动指定哪些层应该使用 16 位精度,其余层使用 8 位精度。

    • 用户可以通过 advanced_options:output_feature_16bit_names_list 和 advanced_options:params_16bit_names_list 参数来编译模型。

    • 用户可以选择只提升参数/权重到 16 位,或同时提升激活和参数到 16 位。

    • 并非所有层都支持精度的更改,只有部分层支持(如 TIDL_ConvolutionLayer、TIDL_BatchNormLayer 等)。

  3. 自动选择混合精度层:

    • 这是一个更高级的特性,可以自动选择应该设置为 16 位的层。

    • 用户可以设置 advanced_options:mixed_precision_factor 参数,该参数定义了性能损耗的上限。

    • 算法会自动选择最有影响力的层设置为 16 位,以达到用户指定的性能损耗上限。

    • 该方法会使用高级偏差校准作为算法的一部分。

    • 推荐设置 accuracy_level=1、calibration_frames=50 和 calibration_iterations=50 作为编译参数。

9.量化感知训练的基本思路:

  • QAT 是一种训练模型时就考虑量化因素的方法。

  • 在训练过程中,模型参数会被优化以适应 8 位定点推理的损失LOSS。

  • 这需要对训练框架做一些支持和修改,以便在训练期间模拟量化的效果。

  1. QAT 模型的特点:

    • 在 QAT 模型中,特征映射范围值会被嵌入到模型中。

    • 因此,对于 QAT 模型,不需要使用高级校准特性,如偏差校准或直方图统计校准。

    • QAT 模型采用一些特殊的算子,如 CLIP、Minimum、PACT 和 ReLU6 等

  2. 问题:量化操作(如取整)是不可微分的,为了在反向传播过程中计算梯度,QAT采用了梯度近似的技术。常见的方法包括直接通过量化操作传递梯度(即假设量化操作的梯度为1)或使用"直通估计"(Straight Through Estimator, STE)。

10.量化实战

使用onnxruntime量化:

onnxruntime-inference-examples/quantization/image_classification/cpu at main · microsoft/onnxruntime-inference-examples · GitHub

使用torch量化

https://pytorch.ac.cn/docs/stable/quantization.html

相关推荐
云微客AI剪辑矩阵系统几秒前
矩阵新玩法,云微客AI矩阵系统开启新营销大门
人工智能·ai·矩阵·云微客
lose and dream_117 分钟前
【 2024!深入了解 大语言模型(LLM)微调方法(总结)】
大数据·人工智能·opencv·机器学习·语言模型·自然语言处理·架构
十年一梦实验室16 分钟前
【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类
开发语言·c++·笔记·数码相机·计算机视觉
IT·陈寒21 分钟前
Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)
java·python·kotlin
x-cmd21 分钟前
[240704] 苹果获得 OpenAI 董事会观察员席位 | mySCADA myPRO 发现可在设备上远程执行代码漏洞
人工智能·安全·chatgpt·微软·openai·cve·苹果
庞德公28 分钟前
解锁Diffusion Model: 初识Stable Diffusion、DALL-E、Imagen
人工智能·stable diffusion·imagen·dall-e
AI大模型-王哥32 分钟前
神经网络入门:从零到训练
人工智能·深度学习·神经网络·大模型·ai大模型
知识分享小能手42 分钟前
从新手到高手:Scala函数式编程完全指南,Scala 访问修饰符(6)
大数据·开发语言·后端·python·数据分析·scala·函数式编程
elderingezez1 小时前
2024年用scrapy爬取BOSS直聘的操作
爬虫·python·scrapy
点云侠1 小时前
matlab 干涉图仿真
开发语言·人工智能·算法·计算机视觉·matlab