BN折叠及其量化

本文详细介绍了BN(Batch Normalization)折叠的概念,这一过程源于BN在训练和推断阶段的实现差异。在量化过程中,特别是量化感知训练时,保持训练和推断的一致性至关重要。通过BN折叠,可以实现训练阶段的CONV+BN操作的整合,以适应量化需求。文章提供了训练阶段的BN折叠改造方法,并展示了量化后的流程。最后,给出了BN折叠在量化实现的代码示例,鼓励读者深入研究相关文献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍量化过程中的BN折叠;

以下图片引用自 Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

BN折叠

首先介绍BN折叠;BN折叠源自 BN模块在训练阶段和推断阶段的实现差异;

如下图所示:以conv+BN为例,图1为训练阶段的BN,图2为推断阶段的BN

图1:训练阶段的BN
图1:训练阶段的BN

图2:推断阶段的BN,BN被折叠刀CONV中

可以证明这样的折叠是合理的,注意图2中的w指的是卷积核;

\\ O_f = \gamma * \frac{\sum(W * I) + b_{conv} - \mu}{\sigma} + b_{bn} \\ O_f =\sum( \frac{\gamma}{\sigma}*W*I) + \frac{\gamma}{\sigma}*(b_{conv} - \mu) + b_{bn} \\ => W' = \frac{\gamma}{\sigma}*W \\ => b'_{conv} = \frac{\gamma}{\sigma}*(b_{conv} - \mu) + b_{bn} \\ => b'_{conv} = \frac{\gamma}{\sigma}*(- \mu) + b_{bn} = b_{bn}- \frac{\gamma\mu}{\sigma} \space\ \space\ \space\ if \space\ \space\ b_{conv} == 0


量化中的BN折叠

对量化来说,尤其是量化感知(伪量化),我们需要保持训练阶段的伪量化和上述图2的推断阶段的量化实现是一致的,因此对训练阶段的CONV+BN二阶段步骤进行折叠,如下图3:

图3:训练阶段的BN折叠改造,思想源自图2所示实现
​​​

图3的设计思想源自图2,基本思想是训练阶段求\mu/\sigma的EMA(即图中moment及其前后步骤)拿掉后要和图2一致;

根据图3所示BN折叠,就可以对训练阶段该折叠做后训练量化或者伪量化,如下图4

图4:BN折叠后训练阶段的(伪)量化过程


代码实现

以下代码块来自github distiller,没有完整的上下文实现,感兴趣的读者可以移步阅读

图5:BN折叠量化实现


总结

  • 以上简要介绍了BN折叠及其量化,思想比较巧妙,感兴趣的读者可以根据文中提到的文献进一步深入阅读,谢谢
  • 理解有误的地方欢迎指正
在PyTorch中,BN(Batch Normalization)量化过程相对复杂。首先,由于通常会在卷积后面接一个BN,并且在前向推理时为了加速经常会将BN的参数融合到卷积的参数中,因此在训练模拟量化中也需要按照这个流程进行。具体来说,首先需要将BN的参数和卷积的参数融合在一起,然后对这个参数进行量化。这个过程可以参考德澎的PPT。 另外,代码实现中包含两个版本,一个是不融合BN的训练模拟量化,一个是融合BN的训练模拟量化。而为什么融合之后结果如上图所示,可以通过下面的公式来解释。 如果你想实现将模型进行量化,可以按照以下步骤进行操作: 1. 导入必要的库,并定义模型结构。 2. 定义一个自定义的模型类,包含线性(nn.Linear)、GRU(nn.GRU)和ReLU(nn.ReLU)。 3. 在forward方法中,按照顺序对输入数据进行线性、GRU和ReLU操作。 4. 创建模型的实例,并将其设置为评估模式(eval)。 5. 使用torch.quantization.quantize_dynamic函数对模型进行动态量化,并指定要量化的NN算子(nn.Linear和nn.GRU)。 6. 可选地可以将权重量化为float16或qint8。 7. 保存或加载量化模型的状态字典。 8. 可以使用torch.jit.save和torch.jit.load函数来保存和加载脚本化量化模型。 9. 可以通过获取量化模型的参数来进一步处理。 以上是关于PyTorch中BN量化的一些解释和步骤,希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pytorch模型量化](https://blog.csdn.net/DeepLearning_/article/details/127720783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Pytorch模型量化](https://blog.csdn.net/qq_34218078/article/details/127521819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值