当前位置:   article > 正文

深度学习之模型量化学习笔记_quantization 深度学习

quantization 深度学习

为什么要量化模型?

模型部署时,往往考虑实际问题,算力、内存、带宽、速度、FPS、功耗、时延等等。特别是在移动端嵌入式设备等资源受限的边缘侧应用场景中更加需要我们进行优化。


什么是模型量化?

  1. 模型量化: 即以较低的推理精度损失将连续取值(或者大量可能的离散取值)的浮点型模型权重或流经模型的张量数据定点近似(通常为int8)为有限多个(或较少的)离散值的过程,它是以更少位数的数据类型用于近似表示32位有限范围浮点型数据的过程
  2. 模型的输入输出依然是浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标。

8-bit 低精度推理中, 我们将一个原本 FP32 的 weight/activation 浮点数张量转化成一个 int8/uint8 张量来处理。

如下图:量化前与量化后
在这里插入图片描述


模型量化的优势与缺点:

一. 好处:

  1. 极大地减小模型尺寸,如8位整型量化可减少75%的模型大小
  2. 减少存储空间,在边缘侧存储空间不足时更具有意义
  3. 易于在线升级,模型更小意味着更加容易传输
  4. 减少内存耗用,更小的模型大小意味着不需要更多的内存
  5. 提高系统吞吐量,加快推理速度,访问一次32位浮点型可以访问四次int8整型,整型6) 运算比浮点型运算更快
  6. 减少设备功耗,内存耗用少了推理速度快了自然减少了设备功耗
  7. 支持微处理器,有些微处理器属于8位的,低功耗运行浮点运算速度慢,需要进行8bit量化

二、缺点:
1) 增加了操作复杂度,在量化时需要做一些特殊的处理,否则精度损失更严重
2) 必定损失一定的精度,虽然在微调后可以减少精度损失,但推理精度确实下降


数据类型表示:
在这里插入图片描述
量化算法负责将 FP32 数据映射到 int8/uint8 数据。量化算法分为对称算法非对称算法,下面我们主要介绍这两种算法的详细内容及其区别。

  1. 非对称算法:
    非对称算法那的基本思想是通过 收缩因子(scale) 和 零点(zero point) 将 FP32 张量 的 min/max 映射分别映射到 8-bit 数据的 min/max。在这里插入图片描述
    如果我们用 x_f 表示 原始浮点数张量, 用 x_q 表示量化张量, 用 q_x 表示 scale,用 zp_x 表示 zero_point, n 表示量化数值的 bit数,这里 n=8, 那么非对称算法的量化公式如下:在这里插入图片描述
    上述公式中引入了 zero_point 的概念。它通常是一个整数,即 zp_x= rounding(q_x * min_x_f)。因此,在量化之后,浮点数中的 0 刚好对应这个整数。这也意味着 zero_point 可以无误差地量化浮点数中的数据 0,从而减少补零操作(比如卷积中的padding zero)在量化中产生额外的误差。

但是,从上述公式我们可以发现 x_q 的结果只能是一个非负数,这也意味着其无法合理地处理有符号的 int8 量化,Pytorch 的处理措施是将零点向左移动 -128,并限制其在 [-128,127] 之间。

  1. 对称算法:
    对称算法的基本思路是通过一个收缩因子(scale)将 FP32 tensor 中的最大绝对值映射到 8-bit数据的最大值,将最大绝对值的负值映射到 8-bit 数据的最小值。以 int8 为例,max(|x_f|)被映射到 127,-max(|x_f|)被映射到-128。 如下图所示:
    在这里插入图片描述
    与非对称算法相比,对象算法一般不采用 zero_point, 其量化公式如下:
    在这里插入图片描述
    如果 FP32 张量的值能够大致均匀分布在 0 的左右,这种算法将数值映射到 int8 数据之后也能均匀的分布在 [-128, 127]之间。 但是对于分布不均与的 FP32 张量,量化之后将不能够充分利用 8-bit 的数据表示能力。

总结:

非对称算法一般能够较好地处理数据分布不均与的情况,较好地解决 FP32 数据分布不明显倾向于一侧的问题,量化数据的分布与原始数据分布情况大致相似,较好地保留了 FP32 数据信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/376426
推荐阅读
相关标签
  

闽ICP备14008679号