• 神经网络量化笔记


    目录

    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

  • 相关阅读:
    在分布式事务场景下,如何设计一个高可靠的跨系统转账
    携程OceanBase开源实践——索引统计功能实现
    如何找回回收站清空的文件?
    2.Golang 热加载开发
    Html 引入element UI + vue3 报错Failed to resolve component: el-button
    KingbaseES应对表年龄增长过快导致事务回卷
    开发工程师必备————【Day14】数据库查询表关键字及多表查询思路
    生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN
    记一次线上websocket返回400问题排查
    【Vue】安装并使用vue-cli搭建SPA项目
  • 原文地址:https://blog.csdn.net/weixin_50161877/article/details/140012625