高效模型量化工具包-AIMET(三)

章节三

量化仿真

  为了测试神经网络在量化设备上的运行情况,我们经常在用于训练神经网络的同一通用机器上模拟量化行为。这称为量化仿真

3.1 介绍

图3.1
(固定点操作设备上量化推断的示意图(左) 和 使用浮点运算进行模拟量化(右))

  量化仿真允许用户高效地测试各种量化选项。在本节中,我们首先解释了这一仿真过程的基本原理,然后讨论了有助于弥合仿真与实际设备性能差距的技术。
  AIMET使用户能够自动创建一个量化仿真模型,给定一个PyTorch或TensorFlow模型。AIMET将会向PyTorch或TensorFlow模型图中添加图3.1所示的量化器节点。生成的模型图可以直接用于用户的评估或训练流程中。
AIMET量化仿真可用于以下用例:
• 模拟设备上的推断,无需运行时或目标设备。
• 启用量化感知训练,后续文章会阐述。
• 它被用于AIMET量化的其他特性,例如AdaRound或偏置校正。
工作流程 图3.2展示了使用AIMET量化仿真来模拟目标量化准确性的工作流程。
图3.2 AIMET量化仿真工作流程
• 用户从预训练的浮点FP32模型开始。
• AIMET通过将量化仿真操作插入模型图中创建仿真模型。
• AIMET还配置了插入的仿真操作。在第3.4节中,我们展示了如何通过配置文件控制这些操作的配置。
• AIMET找到了插入的量化仿真操作的最佳量化参数,例如比例/偏移量。为此,AIMET需要用户提供一个回调方法,通过该方法将一些代表性数据样本输入模型。这些样本可以来自训练或校准数据集。通常情况下,大约1,000个样本足以让AIMET找到最佳的量化参数。
• AIMET返回一个量化仿真模型,可以作为原始模型在其评估流程中的直接替代。通过运行此仿真模型通过评估流程产生的量化准确度指标,可以在很大程度上模拟目标准确度。

代码示例
API 通过单个API调用可以创建一个量化仿真模型,如下所示。
调用compute_encodings()生成量化仿真操作的比例/偏移参数。用户现在可以将仿真模型(sim.model)馈送到其评估流程/函数中,如下面的代码示例所示。

#代码块3.1 量化仿真API举例

import torch
from aimet_torch.examples import mnist_torch_model
# Quantization related import
from aimet_torch.quantsim import QuantizationSimModel
model = mnist_torch_model.Net().to(torch.device(’cuda’))
# Create a quantization simulation model
# Adds simulation ops, configures these simulation ops
sim = QuantizationSimModel(model,
dummy_input=torch.rand(1, 1, 28, 28)
default_output_bw=8, default_param_bw=8)
# Find optimal quantization parameters (like scale/offset)
# The callback method should send representative data
# samples through the model. The forward_pass_callback_args
# argument is passed as-is to the callback method
sim.compute_encodings(forward_pass_callback=send_samples,forward_pass_callback_args=None)
# We use sim.model as a drop-in replacement for model in
# an eval pipeline
quantized_accuracy = eval_function(model=sim.model)

使用AIMET量化仿真与PyTorch模型时的注意事项:
• AIMET量化仿真要求模型定义遵循某些准则,详细说明在第7.3节中。
• AIMET还包括一个模型验证器工具,允许用户检查其模型定义并找到可能需要替换的结构。请查看AIMET文档的GitHub链接:https://quic.github.io/aimet-pages/index.html

3.2 实际考虑因素

  批量归一化折叠(BNF) 批量归一化是现代卷积网络的标准组件。批量归一化操作在缩放和添加偏移之前对线性或卷积层的输出进行归一化。对于设备推理,这些操作被折叠到前一个或下一个卷积或线性层中,这一步称为批量归一化折叠。这样可以完全从网络中删除批量归一化操作,因为计算被吸收到相邻的层中。除了减少额外的缩放和偏移的计算开销外,这还防止了额外的数据移动和层输出的量化。
  建议用户在使用AIMET量化仿真之前对批量归一化层进行折叠。这样可以确保使用AIMET产生的模拟量化准确度能够紧密地模拟目标推理准确度。AIMET提供了API,允许用户自动折叠批量归一化层。
  AIMET可以自动检测模型定义中的批量归一化层,并将它们折叠到相邻的卷积层中。此API将在原地折叠批量归一化层。

代码示例
API 以下是一个使用AIMET折叠批量归一化层的代码示例

#代码块3.2 批量归一化折叠API示例

from torchvision import models
from aimet_torch.batch_norm_fold import fold_all_batch_norms
model = models.resnet18(pretrained=True).eval()
fold_all_batch_norms(model, input_shape=(1, 3, 224, 224))

3.3 导出量化编码

  量化仿真不会改变模型参数本身。然而,在创建仿真模型的过程中,AIMET会计算模型中参数和激活的最佳缩放/偏移量量化编码。这些量化编码可以从AIMET导出。目标平台的运行时环境,例如高通神经处理SDK,可以导入这些优化的量化编码,而不需要独立计算量化编码。
图3.3 导出AIMET量化仿真编码的工作流程
  在创建仿真模型之后,AIMET提供了一个导出API,可以导出没有仿真操作的原始FP32模型,以及一个包含优化量化编码的JSON格式文件。请参考AIMET文档了解该编码文件的结构。
  以下是一个代码示例,展示了如何创建和初始化AIMET量化仿真模型。export()方法会生成以下文件:

  1. 一个没有任何仿真操作的PyTorch模型,与最初用于创建量化仿真模型的模型相同。
  2. 量化编码被导出到一个单独的JSON格式文件中,可以由目标平台的运行时环境导入(如果需要)。
  3. 以ONNX格式导出的等效模型。上述编码文件引用了导出的ONNX模型文件中的张量名称。
#代码块3.3 导出量化编码的API示例

import torch
from aimet_torch.examples import mnist_torch_model
# Quantization related import
from aimet_torch.quantsim import QuantizationSimModel
model = mnist_torch_model.Net().to(torch.device(’cuda’))
# Create a quantization simulation model
# Adds simulation ops, configures these simulation ops
sim = QuantizationSimModel(model,
dummy_input=torch.rand(1, 1, 28, 28),
default_output_bw=8,
default_param_bw=8)
# Find optimal quantization parameters (like scale/offset)
# The callback method should send representative data
# samples through the model. The forward_pass_callback_args
# argument is passed as-is to the callback method
sim.compute_encodings(forward_pass_callback=send_samples,
forward_pass_callback_args=None)
# Optionally, the user can export out the quantization
# parameters (like per-layer scale/offset)
sim.export(path=./, filename_prefix=’quantized_mnist’,
dummy_input=torch.rand(1, 1, 28, 28))

3.4 模型中量化仿真操作的配置

  不同的硬件和设备运行时可能对神经网络推断支持不同的量化选择。例如,某些运行时可能支持激活和权重的非对称量化,而其他运行时可能仅支持权重的非对称量化。因此,我们需要在仿真过程中进行量化选择,以最好地反映目标运行时和硬件。
  为此,AIMET采用了一种基于配置的方法来设置插入模型的仿真操作。在前面的代码示例中,QuantizationSimModel API接受一个可选的JSON运行时配置文件作为参数。该配置文件包含六个主要部分,按照特定性逐渐增加,如图3.4所示。该配置文件可以根据具体的硬件配置进行定制。
有关如何使用此配置文件的详细信息,请参考AIMET在GitHub上的文档。
图3.4 AIMET量化仿真配置

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值