深度神经网络 模型量化(1)

《夜的钢琴曲5》 钢琴曲
石进北京大学演奏视频版

神经网络模型是计算密集型应用,在部署时基本都会经过模型压缩,本次主要谈谈量化,其他技术留在以后吧。

一、为什么可以量化?

  1. 首先,什么是量化呢?
    量化,这个术语最初是来自数字信号处理领域,是指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程度娘搬运来的)。
    对应到人工智能领域的量化呢,模型一般都用fp32来存储数据,量化就是把fp32的数据用int8来表示
    很显然,经过量化,数据量变小了,能够编码的信息也就少了,所以怎么保证量化精度是个很大的挑战。

  2. 等等,这里有个本质的问题,为什么模型量化后还可以用呢,明明能编码的信息少了嘛…
    不知道你开始的时候有没有这个疑问, 反正这个问题困惑了我好久…折磨了好久…
    一句话解释: 模型参数的鲁棒性比较强
    以下是我自己的理解,模型训练时,梯度更新往往比较微小(learning rate设置的很小),模型参数都采用高精度的FP32数据格式进行训练,模型学习到了很多信息, 推理时这些信息是可以再精简再提炼的。
    打个比方,表示年龄用u8就可以,没必要用fp32嘛。

  3. 量化为什么会带来误差?
    在量化过程中会产生数据溢出和精度不足舍入操作,该过程是不可逆的,所以会引起一定的误差,对于量化后误差较大的层可采用高精度来进行计算,使用混合精度来避免一定的误差。

二、为什么要量化?

知道了什么是量化,这个问题就好解释了…
简单说就一个字,越快越好,是不是很多程序员穷尽一生都在追求的,嘻嘻…
但是,快的前提是得 , 也就是精度不能掉太多…
好吧,下面是比较书面的说法:

  1. 量化后模型文件变小,占用更少的存储空间(磁盘/内存),如fp32 变成int8,理论上会变为1/4;
  2. 减轻内存带宽压力,即单位时间可以读写更多的操作数;
  3. 计算速度快,采用SIMD时,可以处理更多操作数,如256bit 寄存器,fp32是8个操作数,int8是16个操作数;
  4. 相同工艺下,相同芯片面积下,晶体管数量一定,整形运算需要的晶体管少,故可实现的计算单元多;
    3、4是量化快的根本原因, 计算单元多了,单位时间可以搬运到计算单元的数据多了,可以同时操作的数据多了,计算也就更快了。

三、量化的对象是谁

当然是模型啦…,再具体点呢?

  1. 权重
    模型训练学到了什么呢,就是那一坨数,也就是权重, 一大坨…
    印象中TensorRT 推理库中对于权重是 非饱和对称量化, 至于为啥不采用饱和、对称量化呢,人家做试验了…
    话说,人工智能像是一个实验科学,很多东东说不清楚,其实也没必要说清楚,实验结果好,拿来用就行…
    在这里插入图片描述

  2. 激活值
    这个也好理解,神经网络输入数据与权重乘加的结果就叫激活值
    也就是说 激活值不是保存在模型中的,必须有给模型输入数据,模型才能计算出激活值,一般来说不同厂商的实现不同,对于cv模型来说,一般200-300足够了。

四、如何实现量化

量化本质:在浮点数据和定点数据之间建立一种数据映射关系,使得以较小的精度损失代缴获得良好的收益。

Q = round(scale factor * clip(x,α,β)) + zero point

公式中:x表示浮点数,Q表示量化后的顶点数,α,β表示上下界。
量化后的模型是如何计算的?以CONV为例:
在这里插入图片描述
ps: 量化不是对整个神经网络计算一个sacle和zeropoint, 一般量化前都会经过算子合并fusion,对于合并后的每一层(确切来说不是每一层,不是所有算子都会量化)单独计算一个scale和zeropoint, 并记录在模型中。

具体的量化算法可以分为:

  1. 最大最小值对称量化 MinMax
    故名思义,就是将需要量化的数据求绝对值的最大值映射到int8的最大值
    在这里插入图片描述

  2. KL散度量化 TensorRT 方案
    从概率分布的角度出发,目的是让编码后的数据分布和编码前的数据分布尽可能的一致。
    KL散度量化思想的核心是寻找一个较优的值作为量化的极值,单纯的用激活值的最大值效果不好。
    具体计算过程可参考《8-bit Inference with TensorRT

  3. 指数量化 海思方案
    这部分我只了解大概…
    同学们可移步 《NNIE量化算法及实现

五、QAT vs PTQ

QAT->quantization aware training 量化感知训练
PTQ->post training quantization 训练后量化

通常是先PTQ,精度实在有不达标, 再QAT…
QAT 是个挺大的话题,以后聊吧…

Have a good day

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白龙呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值