INT8 量化训练

【GiantPandaCV 导读】本文聊了两篇做 INT8 量化训练的文章,量化训练说的与 quantization-aware Training 有区别,量化训练指的是在模型训练的前向传播和后向传播都有 INT8 量化。两篇文章都是基于对梯度构建分析方程求解得到解决量化训练会引起的训练崩溃和精度损失严重的情况。

论文:《Distribution Adaptive INT8 Quantization for Training CNNs》 会议:AAAI 2021

论文:《Towards Unified INT8 Training for Convolutional Neural Network》 会议:CVPR 2020

引言:什么是量化训练

谷歌在 2018 年《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》文章中,提出了量化感知训练 (Quantization-aware Training,QAT),QAT 只在前向传播中,加入模拟量化,这个模型量化指的是把模型参数进行线性量化,然后在做矩阵运算之前,把之前量化的模型参数反量化回去浮点数。而量化训练则是在前向传播和后向传播都加入量化,而且做完矩阵运算再把运算的结果反量化回去浮点数。 《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》详细的内容在链接中:

MXNet 实现卷积神经网络训练量化

Pytorch 实现卷积神经网络训练量化 (QAT)

一、Distribution Adaptive INT8

Distribution Adaptive INT8

文章的核心 idea 是:Unified INT8 发现梯度的分布不遵从一个分布即不能像权重一样归于高斯分布,Distribution Adaptive INT8 认为梯度可以 channel-wise 看,分成两种分布,一个高斯分布,一个是倒 T 形分布,这样去 minimize 量化后梯度与原来梯度的量化误差 Error,就可以了。 Unified INT8 也是类似 minimize 量化后梯度与原来梯度的量化误差 Error 的思想,与 Distribution Adaptive INT8 不同的是通过收敛性分析方程,发现可以通过降低学习率和减少梯度量化误差。 总结:Distribution Adaptive INT8 比 Unified INT8 多了一个先验,来构建分析方程。方法上,都是对梯度下手,修正梯度的值,都有对梯度进行截断。

Distribution Adaptive INT8 采用了两个方法:Gradient Vectorized Quantization 和 Magnitude-aware Clipping Strategy。

对称量化

q(x)=round(127clamp(x,s)s)(1)

clamp(x,s)={x,|x|ssign(x)s,|x|>s

这里, s 是阈值范围,就是 range [s,s]

反量化: ˆx=q(x)×s127

公式 (1) 与之前常见的对称量化长的有一点不一样:

q=round(clip(x,c)s) (2)

clip(x,c)=min(max(x,c),c),s=c2811

反量化: ˆx=q(x)×s , 这里的 s 指的是 scale,c 是 clipping 阈值

其实公式 (1) 和(2)是等价变化,把公式 (2) 的 s 计算出来,就是 s=c127 ,代入公式 (2)

q=round(clip(x,c)s)=round(clip(x,c)c127)=round(127clamp(x,c)c)

也就是等于公式 (1)

Gradient Vectorized Quantization

这就是 channel-wise 的筛选哪些梯度的分布属于高斯分布还是倒 T 分布 (a sharp with long-tailed shape distribution(Inverted-T distribution))。

所以这两种分布: {pN(μ,σ2),P(|g|>σ)>λpT1,P(|g|>σ)λ

λ 通过实验设置为 0.3

Magnitude-aware Clipping Strategy

这个 cliiping 是在寻找最优截断阈值 s

量化误差分析: E=gmaxgmin|gˆg|f(g)p(g)dg(3)

f(g)=eα|g|p(g) 是梯度的分布。

通过两个假设:

gR,p(g)=p(g)g(0,s),|gˆg|12s127,误差分析方差变换为:

E=s0s127f(g)p(g)dgI1+2gmaxs(gs)f(g)p(g)dgI2

只要求导 Es|s=ˉs=0 就可以找出找出最优值 ˉs 。然后分不同的梯度的分布进行讨论。

梯度的两种分布

对于高斯分布ˉs=|g|max

对于倒 T 分布:倒 T 分布用分段均匀分布来表示

pT1(g)={a,|g|(0,ϵ)b,|g|(ϵ,|g|max)

经过一顿公式推导得出: ˉst=(1kA)ˉst1+A|g|max,t ,引进了 kA 这两个超参数。

所以 k=1A=0.8
引进的两个超参数的参数搜索实验

整个 Distribution Adaptive INT8 的 pipeline

Distribution Adaptive INT8的pipeline

SpeedUp:

SpeedUp

实验

backbone分类任务

目标检测实验

视频分类

二、Unified INT8 Training

Unified INT8 Training

前面已经讲了 Unified INT8 的整体思路了。Unified INT8 也是类似 minimize 量化后梯度与原来梯度的量化误差 Error 的思想,Unified INT8 是通过收敛性分析方程,发现了可以通过降低学习率和减少梯度量化误差。另外,Unified INT8 对梯度误差分析是 layer-wise 的,即不是上述 Distribution Adaptive INT8 那种 channel-wise 的方式。

通过收敛性证明: R(T)=Tt=1(ft(wt)ft(w)) (4)

基于这两个假设: ft is convex; wi,wjS,wiwjD

公式 (4) 变换为:

R(T)TdD22TηT(1)+DTTt=1ϵt(2)+1TTt=1ηt2ˆgt2(3)

因为 T 是迭代次数,T 会不断增大,导致 Term(1) 趋向于 0;

ϵt 是误差,Term(2) 说明,要最小化量化误差;

ηt 是量化 - 反量化后的梯度, ηt 是学习率,Term(3) 说明要降低学习率。

所以 Unified INT8 提出两个方法:Direction Sensitive Gradient Clipping 和 Direction Sensitive Gradient Clipping。

Direction Sensitive Gradient Clipping

dc=1cos(<g,ˆg>)=1gˆg|g||ˆg|

用余弦距离来度量量化前后梯度的偏差。

Deviation Counteractive Learning Rate Scaling

ϕ(dc)=max(eαdc,β)

这两个策略最终的用在了调整学习率,实验得出,β 取 0.1,α 取 20。

整个 pipeline

Unified INT8 Training的pipeline

SpeedUp:
SpeedUp

这里有个重要的 cuda 层的优化
cuda层的优化

实验
backbone分类任务

目标检测任务

知乎链接

(量化 | INT8 量化训练)https://zhuanlan.zhihu.com/p/364782854


欢迎关注 GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。(• ̀ω•́)✧

有对文章相关的问题,或者想要加入交流群,欢迎添加 BBuf 微信:

二维码


本文总阅读量1007