目的:
1. 加速计算(特别是移动端上)
2. 减少内存/显存占用(特别是移动端上)
3. 减少功耗(读取内存和计算都会耗电)
把某个tensor或者某个channel的这组float32, 用int8来表示,就是量化。
这组float32的上下界,可以取他们的min和max,也可以moving average,也可以去中间99%的那部分。。。越界的就用量化为0或者255。
公式:
(r实数-0) / (q整数-Z整数)= S = (r实数max-r实数min) / (q整数max-q整数min) = (r实数max-r实数min) / 255

S为缩放稀疏,Z为"Zero-Point",其实Z就是真实浮点值0映射到整数时对应的值,无论是在图像中还是NLP中都会有用0做padding值来补全的,映射到整数后,也应该有这样一个值的存在,这个值就是Z。在这里S和Z可以称为量化参数,对于每个权重矩阵和每个激活数组都有一对这样的值。
Linear层和卷积的量化:
神经网络量化入门--基本原理 - 知乎 (zhihu.com)
累加用的是INT32:
Arithmetic in the quantized model is done using vectorized INT8 instructions.

本文探讨了如何通过量化技术,如INT8量化,减少移动端计算、内存和功耗。介绍了PyTorch的动态与静态量化区别,以及Quantization-Aware Training背后原理。重点讲解了量化参数S和Z在模型权重和激活上的使用,以及Post-Training Quantization在不同场景下的实践和效果。
最低0.47元/天 解锁文章
2583

被折叠的 条评论
为什么被折叠?



