深度学习论文: EasyQuant: Post-training Quantization via Scale Optimization及其PyTorch实现
EasyQuant: Post-training Quantization via Scale Optimization
PDF:https://arxiv.org/abs/2006.16669v1.pdf
PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks

1 概述

EasyQuant通过引入cos 相似性作为目标函数,通过交替搜索权值(weights)和激活(activations)的量化因子(scale)来最大化量化前后激活值的 cos相似性,来找到权值和激活值的最优量化因子。
在这里插入图片描述
权值量化因子
TRT: w e i g h t _ s c a l e = 128 / m a x ( a b s ( w e i g h t ) ) weight\_scale = 128/max(abs(weight)) weight_scale=128/max(abs(weight))
Tensorflow: w e i g h t _ s c a l e = 128 / m a x ( a b s ( w e i g h t ) ) weight\_scale = 128/max(abs(weight)) weight_scale=128/max(abs(weight))
激活量化因子
TRT: 通过计算KL散度的方式来确定最佳阈值从而得到量化因子
Tensorflow: 训练中,使用EMA(exponential moving average)公式 m o v e _ m a x = m o v e _ m a x ∗ m o n m e n t + m a x ( a b s ( c u r r _ a c t i v a t i o n ) ) ( 1 − m o n m e n t ) move\_max =move\_max * monment + max(abs(curr\_activation))(1-monment) move_max=move_maxmonment+max(abs(curr_activation))(1monment)
,训练后通过计算 a c t i v a t i o n _ s c a l e = 128 / m o v e _ m a x activation\_scale = 128/move\_max activation_scale=128/move_max

2 Scale Optimization

假设 X 为输入张量, S为量化尺度因子,则量化公式表示为
在这里插入图片描述
其中 表示elementwise点乘操作, Round表示取整操作, Clip表示截断操作.则对于卷积操作
在这里插入图片描述
权值(int8)量化和输入激活(int8)量化得到的第l层量化输出激活(int32)再反量化的结果(float32) 为
在这里插入图片描述
EasyQuant通过引入cos 相似性作为目标函数,优化 原始浮点激活输出与量化实现得到反量化输出的 cos 相似性(cos越大越相似)
在这里插入图片描述
来搜索权值和激活值的量化因子,实际求解通过交替优化两个的量化因子来求解
在这里插入图片描述

3 INT7 Post-training Inference

相对于int8,int7可以有更好的加速效果。所以EasyQuant在实际端上推理阶段则采用权值和激活 int7 量化,中间 int16 累加器累加最多八次的方式,使得推理速度优于权值和激活 int8 量化,中间 int16 累加器只能累加两次(溢出)的方式,同时还可以比较好的保持量化后算法的精度。
在这里插入图片描述

4 Experiments

4-1 与PTQ比较

在这里插入图片描述

4-2 与QAT比较

在这里插入图片描述

4-3 与TRT低于8比特时比较

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐