神经网络量化笔记

目录

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

相关推荐
文心快码BaiduComate1 小时前
百度云与光本位签署战略合作:用AI Agent 重构芯片研发流程
前端·人工智能·架构
风象南1 小时前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
曲幽2 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers
Mintopia2 小时前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮3 小时前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬3 小时前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia3 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区4 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两6 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
敏编程6 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python