来源 | PaperWeekly 作者 | Gemfield
在深度学习中,量化指的是使用更少的 bit 来存储原本以浮点数存储的 tensor,以及使用更少的 bit 来完成原本以浮点数完成的计算。这么做的好处主要有如下几点:
Post Training Dynamic Quantization,模型训练完毕后的动态量化;
Post Training Static Quantization,模型训练完毕后的静态量化;
量化会有精度损失;
这种量化方式经常缩略前面的两个单词从而称之为 Dynamic Quantization,中文为动态量化。这是什么意思呢?你看到全称中的两个关键字了吗:Post、Dynamic:
Post:也就是训练完成后再量化模型的权重参数;
Linear
LSTM
LSTMCell
RNNCell
GRUCell
qconfig_spec 指定了一组 qconfig,具体就是哪个 op 对应哪个 qconfig;
每个 qconfig 是 QConfig 类的实例,封装了两个 observer;
这两个 observer 分别是 activation 的 observer 和 weight 的 observer;
但是动态量化使用的是 QConfig 子类 QConfigDynamic 的实例,该实例实际上只封装了 weight 的 observer;
activate 就是 post process,就是 op forward 之后的后处理,但在动态量化中不包含;
observer 用来根据四元组(min_val,max_val,qmin, qmax)来计算 2 个量化的参数:scale 和 zero_point;
qconfig_spec 赋值为一个 set,比如:{nn.LSTM, nn.Linear},意思是指定当前模型中的哪些 layer 要被 dynamic quantization;
scale = max_val / (float(qmax - qmin) / 2) = 0.5541 / ((127 + 128) / 2) = 0.004345882...
Convolution, Batch normalization
Convolution, Batch normalization, Relu
Convolution, Relu
Linear, Relu
Batch normalization, Relu
QuantStub 的 scale 和 zp 是怎么来的(静态量化需要插入 QuantStub,后文有说明)?
conv activation 的 scale 和 zp 是怎么来的?
conv weight 的 scale 和 zp 是怎么来的?
fc activation 的 scale 和 zp 是怎么来的?
fc weight 的 scale 和 zp 是怎么来的?
relu activation 的 scale 和 zp 是怎么来的?
scale = 0.7898 / ((127 + 128)/2 ) = 0.0062
scale = (2.9971 + 3) / (127 - 0) = 0.0472
静态量化的 float 输入必经 QuantStub 变为 int,此后到输出之前都是 int;
Xmin、Xmax 是当前运行中正在求解和最终求解的最小值、最大值;
X 是当前输入的 tensor;
那么如何更方便的在你的代码中使用 PyTorch 的量化功能呢?一个比较优雅的方式就是使用 deepvac 规范——这是一个定义了 PyTorch 工程标准的项目:
https://github.com/DeepVAC/deepvac
基于 deepvac 规范(包含库),我们只需要简单的打开几个开关就可以使用上述的三种量化功能。
注:文仅学术分享,侵删
猜您喜欢:
附下载 |《TensorFlow 2.0 深度学习算法实战》
附下载 | 超100篇!CVPR 2020最全GAN论文梳理汇总!
本文分享自微信公众号 - 机器学习与生成对抗网络(AI_bryant8)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。