AIMET工具模型量化介绍(2)
AIMET量化模拟
概述
当机器学习模型在量化硬件上运行时,运行时工具(如高通神经处理 SDK)会将模型的浮点参数转换为定点参数。 这种转换通常会导致准确性的损失。 AIMET 模型量化功能有助于缓解这个问题。 AIMET 提供了更改模型以模拟量化硬件效果的功能。 这允许用户然后进一步重新训练模型(称为微调)以恢复准确性的损失。 最后一步,AIMET 提供了导出模型的功能,这样它就可以通过运行时在目标上运行。
用户流程
以上解释了 AIMET 用户可以遵循以利用量化支持的典型工作流程。 步骤如下
- AIMET 用户将在其中一种受支持的训练框架(PyTorch 或 TensorFlow)中创建他们的模型
- 用户训练他们的模型
- 在用户拥有一个工作和训练好的模型后,她/他可以调用 AIMET 量化 API 来创建模型的量化版本。在此步骤中,AIMET 使用用户传入的数据加载器来分析模型并在每层基础上确定最佳量化编码。
- 用户将进一步训练模型的量化版本。用户可以像在步骤 2 中一样重新训练模型。模型将学习对抗量化噪声的影响。请参阅量化感知微调的一些建议。
- 用户使用 AIMET 保存模型和每层量化编码
- 这些可以输入到像 Qualcomm 神经处理 SDK 这样的运行时,以在目标上运行模型(AIMET 将编码导入量化的运行时)
量化噪声
下图解释了当模型的输入、输出或参数被量化和反量化时,量化噪声是如何被引入到模型中的。
由于反量化值可能与量化值不完全相同,因此两个值之间的差异就是量化噪声。
hood下会发生什么
如上所述,在步骤 3 中,AIMET 分析模型并确定每层的最佳量化编码。
为了进行分析,AIMET 通过模型传递一些训练样本并使用钩子捕获从每一层输出的张量。 创建直方图以对每层输出张量中浮点数的分布进行建模。
利用每一层输出张量中浮点数的分布,AIMET 将使用一种称为“增强 TensorFlow”的方案来确定将浮点数转换为定点数的最佳编码。 层的编码由四个数字组成:
- 最小值:低于这些的数字被限制
- 最大值:这些以上的数字被限制
- Delta:定点数的粒度(是所选位宽的函数)
- 偏移:从零开始的偏移
可以使用 min 和 max 计算增量和偏移量,反之亦然,使用等式:
在第 4 步的微调阶段,正向传递中会发生以下情况:
来自给定层的权重首先量化为定点,然后反量化为浮点。 层本身的输出张量也是如此。 AIMET 通过将现有层与在 PyTorch 中添加此功能的自定义层包装在一起,并在 TensorFlow 中的层之间插入量化操作来实现这一点。
在反向传播中,AIMET 会正常反向传播。 这是通过将全分辨率浮点权重作为要在反向传播期间使用的阴影权重来实现的。
在模型中放置量化模拟操作
如果在调用量化模拟 API 时提供,AIMET 允许根据 json 配置文件中指定的一组规则配置量化器放置。 在配置文件中,可以打开和关闭量化器,和/或使用非对称或对称编码进行配置。 此文件的一般用例是让用户匹配他们想要模拟的特定运行时的量化规则。
配置文件包含六个主要部分,具体程度越来越高:
在更一般的部分中定义的规则可以被在更具体的情况下定义的后续规则否决。 例如,可以在“defaults”中指定没有要量化的层,然后在“op_type”部分中打开特定层的量化。
建议用户从下面的默认配置文件开始
aimet_common/quantsim_config/default_config.json
量化感知微调的建议
以下是一些通用指南,可帮助通过量化感知训练 (QAT) 提高性能或加快收敛速度:
-
初始化:
通常,在应用 QAT 之前首先应用训练后量化(跨层均衡 (CLE) 和偏差校正)可能是有益的。 如果 INT8 性能与 FP32 基线相比大幅下降,这尤其有益。 -
超参数:
epoch数:一般15-20个epoch就足够收敛了
学习率:与 FP32 模型在收敛时的最终学习率相当(或高一阶)。 AIMET 中的结果是学习 1e-6 阶。
学习率计划:每 5-10 个时期将学习率除以 10