本系列文章

Intel Distiller工具包-量化实现1

Intel Distiller工具包-量化实现2

Intel Distiller工具包-量化实现3


回顾

  • 上面文章中介绍了Distiller及Quantizer基类,后训练量化器;基类定义了重要的变量,如replacement_factory(dict,用于记录待量化module对应的wrapper);此外定义了量化流程,包括 预处理(BN折叠,激活优化等)、量化模块替换、后处理 等主要步骤;后训练量化器则在基类的基础上实现了后训练量化的功能;
  • 本文继续介绍继承自Quantizer的子类量化器,包括
    • PostTrainLinearQuantizer(前文)
    • QuantAwareTrainRangeLinearQuantizer(本文)
    • PACTQuantizer(后续)
    • NCFQuantAwareTrainQuantizer(后续)
  • 本文代码也挺多的,由于没法全部贴出来,有些地方说的不清楚的,还请读者去参考源码;

QuantAwareTrainRangeLinearQuantizer

  • 量化感知训练量化器;将量化过程插入模型代码中,对模型进行训练;该过程使得模型参数对对量化过程有所拟合,所以最终得到的模型的效果 一般要比 后训练量化模型要好一些;
  • QuantAwareTrainRangeLinearQuantizer的类定义如下:可以看到比后训练量化器的定义简单不少;
  • 构造函数:前面都是检查和默认设置;核心是红框中 对 参数、激活值 设置的 量化感知 方式;
  • activation_replace_fn:这是对激活值做量化感知的实现方式,和前文后训练量化使用的 模块替换方式 一样,即返回一个 wrapper,这里是 FakeQuantizationWrapper
  • FakeQuantizationWrapper:定义如下,forward中输入先经过原module计算(得到的是原来的激活输出),然后对输出(下一个module的输入)做伪量化(fake_q);
  • FakeLinearQuantization:定义如下,该module做的事是 对输入做伪量化;具体细节包括 训练过程确定 激活值的范围并更新scale、zp(infer则直接使用训练过程最后的scale、zp);使用 LinearQuantizeSTE(straight-through-estimator) 实现伪量化;
    class FakeLinearQuantization(nn.Module):def __init__(self, num_bits=8, mode=LinearQuantMode.SYMMETRIC, ema_decay=0.999, dequantize=True, inplace=False):""":param num_bits::param mode::param ema_decay: 激活值范围使用EMA进行跟踪:param dequantize::param inplace:"""super(FakeLinearQuantization, self).__init__()self.num_bits = num_bitsself.mode = modeself.dequantize = dequantizeself.inplace = inplace# We track activations ranges with exponential moving average, as proposed by Jacob et al., 2017# https://arxiv.org/abs/1712.05877(激活值范围使用EMA进行跟踪)# We perform bias correction on the EMA, so we keep both unbiased and biased values and the iterations count# For a simple discussion of this see here:# https://www.coursera.org/lecture/deep-neural-network/bias-correction-in-exponentially-weighted-averages-XjuhDself.register_buffer('ema_decay', torch.tensor(ema_decay))  # 设置buffer,buffer用于非参的存储,会存于model state_dictself.register_buffer('tracked_min_biased', torch.zeros(1))self.register_buffer('tracked_min', torch.zeros(1))  # 保存无偏值self.register_buffer('tracked_max_biased', torch.zeros(1))  # 保存有偏值self.register_buffer('tracked_max', torch.zeros(1))self.register_buffer('iter_count', torch.zeros(1))  # 保存迭代次数self.register_buffer('scale', torch.ones(1))self.register_buffer('zero_point', torch.zeros(1))def forward(self, input):# We update the tracked stats only in training## Due to the way DataParallel works, we perform all updates in-place so the "main" device retains# its updates. (see https://pytorch.org/docs/stable/nn.html#dataparallel)# However, as it is now, the in-place update of iter_count causes an error when doing# back-prop with multiple GPUs, claiming a variable required for gradient calculation has been modified# in-place. Not clear why, since it's not used in any calculations that keep a gradient.# It works fine with a single GPU. TODO: Debug...if self.training:  # 训练阶段要收集收据with torch.no_grad():current_min, current_max = get_tensor_min_max(input)  # input是激活函数输出值self.iter_count += 1# 有偏值为正常加权值,无偏值为 有偏值/(1-decay**step)self.tracked_min_biased.data, self.tracked_min.data = update_ema(self.tracked_min_biased.data,current_min, self.ema_decay,self.iter_count)self.tracked_max_biased.data, self.tracked_max.data = update_ema(self.tracked_max_biased.data,current_max, self.ema_decay,self.iter_count)if self.mode == LinearQuantMode.SYMMETRIC:max_abs = max(abs(self.tracked_min), abs(self.tracked_max))actual_min, actual_max = -max_abs, max_absif self.training:  # 激活值的范围数值经EMA更新后需要重新计算scale和zpself.scale.data, self.zero_point.data = symmetric_linear_quantization_params(self.num_bits, max_abs)else:actual_min, actual_max = self.tracked_min, self.tracked_maxsigned = self.mode == LinearQuantMode.ASYMMETRIC_SIGNEDif self.training:  # 激活值的范围数值经EMA更新后需要重新计算scale和zpself.scale.data, self.zero_point.data = asymmetric_linear_quantization_params(self.num_bits,self.tracked_min,self.tracked_max,signed=signed)input = clamp(input, actual_min.item(), actual_max.item(), False)# 执行量化、反量化操作,并且该过程无需额外梯度input = LinearQuantizeSTE.apply(input, self.scale, self.zero_point, self.dequantize, False)return input
  • LinearQuantizeSTE:这是实现伪量化的核心,定义如下;它被定义为 torch.autograd.Function,指定了如何反向传播(STE方式)
  • 接下来看一下对参数的量化感知实现(linear_quantize_param),直接使用LinearQuantizeSTE
  • 注:distiller的量化感知训练量化器中虽然定义了如何 对参数做量化感知训练,但是并没有使用,有点奇怪;

总结

  • 本文介绍了distiller量化器基类Quantizer的一个子类:PostTrainLinearQuantizer;
  • 核心部分是 激活值、参数值的 量化感知训练的实现;对激活值量化感知的实现还是采用wrapper的方式,对参数则是直接使用STE;具体细节包括了 FakeQuantizationWrapper、FakeLinearQuantization、LinearQuantizeSTE;

Intel Distiller工具包-量化实现3相关推荐

  1. Intel Distiller工具包-量化实现2

    本系列文章 Intel Distiller工具包-量化实现1 Intel Distiller工具包-量化实现2 回顾 上一篇文章中介绍了Distiller及Quantizer基类,基类定义了重要的变量 ...

  2. Intel Distiller工具包-量化实现1

    本系列文章 Intel Distiller工具包-量化实现1 Intel Distiller工具包-量化实现2 Distiller Distiller是Intel 2019年左右开发的一个支持神经网络 ...

  3. Distiller:量化算法

    Quantization Algorithms 量化算法 注意: 对于任何需要量化感知训练的以下方法,请参阅这里,了解如何使用Distiller的机制调用它. 基于范围的线性量化(Range-Base ...

  4. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

  5. R与量化(part1)--量化概述

    学习笔记,经供参考,有错必纠 参考自:<R的极客理想>–张丹 文章目录 R与量化 量化概述 学习框架 R语言量化相关工具包 量化程序操作步骤 量化交易平台系统架构 技术架构 FinTech ...

  6. 赋能开发者,英特尔发布oneAPI 2022工具包

    英特尔发布了oneAPI 2022工具包.此次发布的最新增强版工具包扩展了跨架构开发的特性,为开发者提供更强的实用性和更丰富的架构选择,用以加速计算. 英特尔公司首席技术官.高级副总裁.软件和先进技术 ...

  7. 用R语言开始量化投资

    R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可 ...

  8. 基于Distiller的模型压缩工具简介

    Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...

  9. 张丹带你用R语言开始量化投资

    关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 前言 做数据分析的朋友,一定知道R语言 ...

最新文章

  1. Apache学习路线
  2. linux nc命令用法举例
  3. 修改Linux网卡由eth1变成eth0
  4. J2EE 企业级应用架构简述
  5. 9.27 csp-s模拟测试53 u+v+w
  6. leetcode 链表1
  7. 如何禁止文本框输入,但是要传值
  8. TCP和UDP的区别与联系
  9. cad二次开发之无法验证该可执行文件的发布者解决方案
  10. httpclient3与httpclient4访问的一些区别
  11. 谷歌浏览器任务栏图标变为白色如何快速解决
  12. 为什么Web前端薪资如此高呢?总结了这4个原因
  13. 百度谷歌搜索引擎索引
  14. 41、财务总账科目余额表,三栏式总账,三栏式明细账 查询条件科目增加多选查询
  15. 在线综艺冷场:“爱优腾芒”放不开,“抖快B”拿不下
  16. Python 中模拟键盘输入
  17. 中创软件哪个部分是外包_什么是外包| 第1部分
  18. 软件公司防止代码外泄的几种方法介绍
  19. python排版word文档命令方法大全_简易常用Word文档使用技巧方法大全(超全).doc
  20. 计算机网络体系结构的基本思想和主要特点

热门文章

  1. 【小记】LaTex 语法说明
  2. 【原创】基于TensorFlow2识别人是否配戴眼镜的研究
  3. Http? Https?
  4. 表情包制作APP的相关推荐 可以制作表情包的软件
  5. 【神经网络】梯度消失与梯度爆炸问题
  6. 长度短点的uuid_如何压缩UUID长度?
  7. print out Fibonacci reversely
  8. Pytorch的nn.Conv2d()参数详解
  9. 北京圣思园 张龙老师 全部视频 下载 地址
  10. c语言转义字符 xhh,jsj_C语言转义字符和格式控制符参考.pdf