深度学习论文: EasyQuant: Post-training Quantization via Scale Optimization及其PyTorch实现
深度学习论文: 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))
weightscale=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))
weightscale=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)
movemax=movemax∗monment+max(abs(curractivation))(1−monment)
,训练后通过计算
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
activationscale=128/movemax
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 累加器只能累加两次(溢出)的方式,同时还可以比较好的保持量化后算法的精度。