神经网络定点量化

目的:

  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)

累加用的是INT16或者INT32:

Arithmetic in the quantized model is done using vectorized INT8 instructions. Accumulation is typically done with INT16 or INT32 to avoid overflow. This higher precision value is scaled back to INT8 if the next layer is quantized or converted to FP32 for output.

  1. PyTorch的Dynamic Quantization

用户指定量化哪些层;这些层的权重全被量化成int8,activation在输入时量化成int8,计算完成后再反量化成float32; 每个batch的每层都要量化一次(所以叫做Dynamic量化);

神经网络定点量化
  1. PyTorch的Static Quantization

权重和activation全部被量化成int8;层与层之间不再转成float32;因此速度超快;

神经网络定点量化

模型权重中,每层的数据分布,在inference阶段是固定的,所以可以一次性统计分布并量化(先得到S和Z,再量化)

activation,每个batch都是不一样的,所以要先做calibration,即采样上千个batch,经过float32神经网络,得到每个激活tensor(或激活channel)的数据分布,最后计算好S和Z,最最后再量化;

以上两者都属于Post Training Quantization

  1. Quantization Aware Training

Quantization aware training 量化背后的技术——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference – 微笑sun – 博客园 (cnblogs.com)

Original: https://blog.csdn.net/smartcat2010/article/details/122913849
Author: smartcat2010
Title: 神经网络定点量化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/691968/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球