Distiller:量化算法
Quantization Algorithms
量化算法
注意:
对于任何需要量化感知训练的以下方法,请参阅这里,了解如何使用Distiller的机制调用它。
基于范围的线性量化(Range-Based Linear Quantization)
让我们在此分解使用的术语:
- 线性(Linear): 表示通过乘以数字常数(比例因子)来量化浮点值。
- 基于范围(Range-Based): 意味着为了计算比例因子,我们查看张量值的实际范围。 在最原始的实现中,我们使用张量的实际最小/最大值。或者,我们使用一些基于张量范围/分布的推导来得出更窄的最小/最大范围,以便去除可能的异常值。这与此处描述的其他方法形成对比,我们可以将其称为基于截断的(clipping-based),因为它们在张量采用截断函数。
非对称(Asymmetric)与对称(Symmetric)
在这种方法中,我们可以使用两种模式 - 非对称和对称。
非对称模式
在非对称模式下,我们将浮点范围中的最小值/最大值映射到整数范围的最小值/最大值。除了比例因子之外,这通过使用零点(也称为量化偏差,或偏移)来完成。
让我们用xfx_fxf表示原始浮点张量,用xqx_qxq表示量化张量,用qxq_xqx表示比例因子,用zpxzp_xzpx表示零点,以及用nnn表示量化的比特。然后,我们得到:
xq=round((xf−minxf)2n−1maxxf−minxf⎵qx)=round(qxxf−minxfqx)⎵zpx=round(qxxf−zpx)x_q = round\left ((x_f - min_{x_f})\underbrace{\frac{2^n - 1}{max_{x_f} - min_{x_f}}}_{q_x} \right) = round(q_x x_f - \underbrace{min_{x_f}q_x)}_{zp_x} = round(q_x x_f - zp_x)\ xq=round⎝⎜⎜⎛(xf−minxf)qxmaxxf−minxf2n−1⎠⎟⎟⎞=round(qxxf−zpxminxfqx)=round(qxxf−zpx)
我们实际上使用 zpx=round(minxfqx)zp_x = round(min_{x_f}q_x)zpx=round(minxfqx)。这意味着零可以通过量化范围中的整数精确表示。例如,对于具有零填充的层(zero-padding),这很重要。通过四舍五入零点,我们有效地“微调”浮动范围中的最小值/最大值,以获得零的精确量化。
请注意,在上面的推导中,我们使用无符号整数来表示量化范围。也就是说,xq∈[0,2n−1]x_q \in [0,2 ^ n-1]xq∈[0,2n−1]。如果需要,可以使用有符号整数(可能由于硬件考虑因素。这可以通过减去2n−12 ^ {n-1}2n−1来实现。
让我们看看卷积或全连接层如何在非对称模式下量化(我们分别用x,y,wx,y,wx,y,w和bbb表示输入,输出,权重和偏置):
yf=∑xfwf+bf=∑xq+zpxqxwq+zpwqw+bq+zpbqb=y_f = \sum{x_f w_f} + b_f = \sum{\frac{x_q + zp_x}{q_x} \frac{w_q + zp_w}{q_w}} + \frac{b_q + zp_b}{q_b} =yf=∑xfwf+bf=∑qxxq+zpxqwwq+zpw+qbbq+zpb=
=1qxqw(∑(xq+zpx)(wq+zpw)+qxqwqb(bq+zpb))= \frac{1}{q_x q_w} \left( \sum { (x_q + zp_x) (w_q + zp_w) + \frac{q_x q_w}{q_b}(b_q + zp_b) } \right)=qxqw1(∑(xq+zpx)(wq+zpw)+qbqxqw(bq+zpb))
因此有:
yq=round(qyyf)=round(qyqxqw(∑(xq+zpx)(wq+zpw)+qxqwqb(bq+zpb)))y_q = round(q_y y_f) = round\left(\frac{q_y}{q_x q_w} \left( \sum { (x_q+zp_x) (w_q+zp_w) + \frac{q_x q_w}{q_b}(b_q+zp_b) } \right) \right) yq=round(qyyf)=round(qxqwqy(∑(xq+zpx)(wq+zpw)+qbqxqw(bq+zpb)))
注意:
- 可以看到,必须重新调整偏置以匹配求和的比例。
- 在适当的全整数HW(宽高)通道中,我们希望我们的主要累积项简单地表示为∑xqwq\sum {x_q w_q}∑xqwq。为了实现这一点,我们需要进一步发展上面得出的表达式。有关详细信息,请参阅gemmlowp。
对称模式
在对称模式中,我们选择最小/最大值之间的最大绝对值,而不是将浮点范围的精确最小值/最大值映射到量化范围。另外,我们不使用零点。因此,我们有效量化的浮点范围相对于零是对称的,量化范围也是如此。
用同样的符号,我们得到:
xq=round(xf2n−1−1max∣xf∣⎵qx)=round(qxxf)x_q = round\left (x_f \underbrace{\frac{2^{n-1} - 1}{\max|x_f|}}_{q_x} \right) = round(q_x x_f)xq=round⎝⎜⎜⎛xfqxmax∣xf∣2n−1−1⎠⎟⎟⎞=round(qxxf)
卷积或全连接层如何在对称模式下量化:
yf=∑xfwf+bf=∑xqqxwqqw+bqqb=1qxqw(∑xqwq+qxqwqbbq)y_f = \sum{x_f w_f} + b_f = \sum{\frac{x_q}{q_x} \frac{w_q}{q_w}} + \frac{b_q}{q_b} = \frac{1}{q_x q_w} \left( \sum { x_q w_q + \frac{q_x q_w}{q_b}b_q } \right)yf=∑xfwf+bf=∑qxxqqwwq+qbbq=qxqw1(∑xqwq+qbqxqwbq)
因此:
yq=round(qyyf)=round(qyqxqw(∑xqwq+qxqwqbbq))y_q = round(q_y y_f) = round\left(\frac{q_y}{q_x q_w} \left( \sum { x_q w_q + \frac{q_x q_w}{q_b}b_q } \right) \right)yq=round(qyyf)=round(qxqwqy(∑xqwq+qbqxqwbq))
模式对比
这两种模式之间的主要权衡是简单性与量化范围的利用。
- 当使用非对称量化时,充分利用量化范围。这是因为我们精确地将浮点范围中的最小值/最大值映射到量化范围的最小值/最大值。使用对称模式,如果浮动范围偏向一侧,则可能导致量化范围,其中显着的动态范围专用于我们将永远看不到的值。最极端的例子是在ReLU之后,整个张量是正的。在对称模式下量化它意味着我们实际上失去了1位。
- 另一方面,如果我们查看上面的卷积/全连接层的偏差,我们可以看到对称模式的实际实现要简单得多。在非对称模式下,零点需要宽高中的附加逻辑。在延迟和/或功率方面,这种额外逻辑的成本当然取决于具体的实现。
其他特点
- 删除异常值: 如这里所讨论的,在某些情况下,激活的浮动范围包含异常值。在这些异常值上花费动态范围会损害我们准确表达我们实际关注的值的能力。
目前,Distiller支持在训练后量化期间通过平均来截断激活。即对于每批数据(batch),而不是计算全局最小/最大值,而是批次中每个样品的最小/最大值的平均值。 - 比例因子范围: 对于权重张量,Distiller支持每通道量化(每个输出通道)。
在Distiller中的实现
训练后
对于训练后量化,目前使用此方法支持卷积和全连接。
- 它们是通过利用量化和去量化操作包装现有PyTorch层来实现的。也就是说,计算是在浮点张量上完成的,但值本身仅限于整数值。在
RangeLinearQuantParamLayerWrapper
类中实现。 - 所有其他层不受影响,并使用其原始FP32实现执行。
- 要使用此方法将现有模型自动转换为量化模型,请使用
PostTrainLinearQuantizer
类。 有关如何执行此操作的示例,请参阅compress_classifier.py
。此示例提供命令行参数以调用训练后量化。详阅这里。 - 对于权重和偏置,在量化设置(“离线”)处确定一次比例因子和零点,并且对于激活,在运行时(“在线”)动态地确定比例因子和零点。计算出的量化参数作为缓冲区存储在模块中,因此在保存模型检查点时会自动序列化。
- 由于这是训练后量化,因此使用位数<8的情况可能会导致精确度降低。
Quantization-Aware训练
要在训练中应用基于范围的线性量化,请使用QuantAwareTrainRangeLinearQuantizer
类。它将权重量化应用于卷积和全连接模块。 对于激活量化,它将在ReLU之后插入实例FakeLinearQuantization
模块。 该模块遵循Benoit et al., 2018中描述的方法,并使用指数移动平均值来跟踪激活范围。
与post-training类似,计算出的量化参数(比例因子,零点,跟踪激活范围)作为缓冲区存储在各自的模块中,因此在创建检查点时会保存它们。
注意,尚不支持从量化感知训练模型到训练后量化模型的转换。这种转换将使用在训练期间跟踪的激活范围,因此将不需要额外的离线或在线计算量化参数。
DoReFa
(方法提出在 DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients)
在这个方法中,我们首先定义量化函数quantizekquantize_kquantizek,输入实数值af∈[0,1]a_f \in [0, 1]af∈[0,1]并且输出离散值aq∈{02k−1,12k−1,...,2k−12k−1}a_q \in \left\{ \frac{0}{2^k-1}, \frac{1}{2^k-1}, ... , \frac{2^k-1}{2^k-1} \right\}aq∈{2k−10,2k−11,...,2k−12k−1},其中kkk 是量化比特数。
aq=quantizek(af)=12k−1round((2k−1)af)a_q = quantize_k(a_f) = \frac{1}{2^k-1} round \left( \left(2^k - 1 \right) a_f \right)aq=quantizek(af)=2k−11round((2k−1)af)
激活值被截断为[0,1][0, 1][0,1]的范围并遵循下式量化:
xq=quantizek(xf)x_q = quantize_k(x_f)xq=quantizek(xf)
对于权重,我们定义以下函数fff,它接受无界实值输入并在[0,1][0,1][0,1]中输出实数值:
f(w)=tanh(w)2max(∣tanh(w)∣)+12f(w) = \frac{tanh(w)}{2 max(|tanh(w)|)} + \frac{1}{2}f(w)=2max(∣tanh(w)∣)tanh(w)+21
现在我们可以使用quantizekquantize_kquantizek来获得量化的权重值,如下所示:
wq=2quantizek(f(wf))−1w_q = 2 quantize_k \left( f(w_f) \right) - 1wq=2quantizek(f(wf))−1
该方法需要用量化感知训练训练模型,如这里所讨论的。 使用DorefaQuantizer
类将现有模型转换为使用DoReFa进行量化训练的模型。
注意:
- 本文提出的梯度量化尚不支持。
- 本文定义了二进制权重的特殊处理,但Distiller尚不支持。
PACT
(方法提出在 PACT: Parameterized Clipping Activation for Quantized Neural Networks)
此方法类似于DoReFa,但激活函数的截断上界α\alphaα是学习的参数而不是直接设置为1。请注意,根据论文的建议,α\alphaα是每层共享的。
该方法需要用量化感知训练训练模型,如这里所讨论的。 使用PACTQuantizer
类将现有模型转换为使用PACT进行量化训练的模型。
WRPN
(方法提出在 WRPN: Wide Reduced-Precision Networks)
在这种方法中,激活被剪切为[0,1][0,1][0,1]并按照如下方式量化(kkk是用于量化的比特数):
xq=12k−1round((2k−1)xf)x_q = \frac{1}{2^k-1} round \left( \left(2^k - 1 \right) x_f \right)xq=2k−11round((2k−1)xf)
权重被剪切为[−1,1][ -1,1][−1,1]并量化如下:
wq=12k−1−1round((2k−1−1)wf)w_q = \frac{1}{2^{k-1}-1} round \left( \left(2^{k-1} - 1 \right)w_f \right)wq=2k−1−11round((2k−1−1)wf)
注意,k−1k-1k−1位用于量化权重,留下一位用于符号。
该方法需要用量化感知训练训练模型,如这里所讨论的。 使用WRPNQuantizer
类将现有模型转换为使用WRPN进行量化训练的模型。
注意:
- 该论文提出扩大层作为降低精度损失的手段。 目前,这不是作为
WRPNQuantizer
的一部分实现的。 要试验这一点,请修改模型实现以获得更宽的层。 - 本文定义了二进制权重的特殊处理,但Distiller尚不支持。
Distiller:量化算法相关推荐
- 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 AI 科技评论报道 编辑 | 陈大鑫 AI 科技评论今天为大家介绍一 ...
- 收藏 | 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!
点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:AI科技评论 编辑 | 陈大鑫 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源! ...
- 商汤 | 离线量化算法研究,从经典到原创
北京时间 8月23日(周一)19:00,商汤学术和智东西公开课共同举办的 模型量化算法与工具系列课程 第一期,商汤科技高级研究员龚睿昊为大家带来了 离线量化算法研究 的专题课程. 模型量化作为一种硬件 ...
- 一文搞懂模型量化算法
1,模型量化概述 1.1,模型量化优点 1.2,模型量化的方案 1.2.1,PTQ 理解 1.3,量化的分类 1.3.1,线性量化概述 2,量化算术 2.1,定点和浮点 2.2,量化浮点 2.2,量化 ...
- 机器学习之PQ量化算法
什么是PQ量化算法 PQ算法属于一种经典的ANN(approximate nearest neighbor,近似最近邻算法)算法,ANN不是寻找最近邻向量,而是退而求其次寻找近似最近邻向量.所以必然会 ...
- 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下格灵深瞳 ...
- 极智AI | 量化实现分享二:详解 KL 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下 K ...
- numpy实现K-means聚类算法(可选是否已知类别数)和VQ-LBG矢量量化算法以及散点数据生成(含完整实验报告)
numpy实现K-means聚类算法(可选是否已知类别数)和VQ-LBG矢量量化算法以及散点数据生成(含完整实验报告) 实验报告完整,质量不低,加上你学校的封面就能交,也可用来交流学习: (20条消息 ...
- Distiller量化学习(1)
1.Intel开源Python Distiller神经网络压缩包,快速利用前沿算法压缩PyTorch模型 Intel开源Python Distiller神经网络压缩包,快速利用前沿算法压缩PyTorc ...
最新文章
- 三流Java搞技术,二流Java搞框架,一流Java…
- Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置
- 微信端上传图片方式1
- java调用rocketmq_java操作RocketMQ
- linux help命令编写,Linux shell命令帮助格式详解
- sed 手册阅读笔记转
- 最近为A公司提炼的经营理念之合作理念
- Centos-redis安装配置
- Flutter高级第2篇:JSON的序列化和反序列化、创建模型类转换Json数据
- 游戏开发之C++对C的扩展(C++基础)
- TIME_WAIT状态过多的排查
- zookeeper-linux集群搭建小结
- 正则表达式在shell中使用的方法与案例
- 人人都想自学python_人人都想自学编程,为什么坚持下来的没几个?
- Python习题十三套汇总
- 元宇宙时代NFT的价值衡量
- 考研 英语一 大作文-图画作文 (一)----第一段描述图画写作攻略
- 半对数坐标matlab实现
- PMP 考试一定要报培训班吗?求靠谱培训机构,最好是自己考过的!
- 教育部正式批准筹备设立香港科技大学(广州)
热门文章
- python抽奖游戏大全_python实现转盘效果 python实现轮盘抽奖游戏
- Word表格跨页/翻页有边框,去除(>^ω^<)
- 导航栏的使用(ToolBar、BottomNavgationView)
- 华为harmonyos2.0哪里下载,华为HarmonyOS最新官方版-华为HarmonyOS2.0最新下载地址-游侠软件下载...
- java list 子集_Java——List方法,获取子集
- Py西游攻关之Django(一)
- C++中的字符串流详解iostream,sstream
- 计算机应用基础商娟叶,探究混合式学习在中职计算机基础教学中的设计与应用...
- 面试问烂了的测试用例: 登录界面的测试用例
- html表格垂直居中的CSS代码,使用3行CSS代码使任何元素垂直居中