INT8加速原理 TensorRTX+yolov5+INT8加速测试

首先介绍一下FP64,FP32,FP16,INT8

FP32就等于我们平时说的float浮点数,用4 Byte = 32 bit 存储数据,又叫单精度。FP16又叫半精度,用2 Byte = 16 bit 存储数据。FP64就是我们常说的double,双精度浮点数,用8 byte = 64 bit 存储。INT8就是常说的int整型。

以往我们深度学习通常用FP32来进行训练,少数情况也会用FP64。但是现在发现有时候也没必要用这么高精度的数据类型,一个好的网络对这点误差不是特别敏感,训练时用FP16也能达到比较好的效果。而FP16的好处在于内存占用小,我们就可以用更大的batchsize来训练。同时计算量小了,训练就变快了。CUDA7.5以后支持使用FP16类型,但是大多数CPU还暂时不支持FP16。FP16的缺陷是上下界都比FP32小,训练时越界溢出就会出现NAN。

INT8加速技术并不是用于训练阶段的,而是用于推理阶段的,也就是说训练阶段我们仍然要用FP32。网络训练好以后我们想在移动终端部署,但是这些设备算力较低,INT8量化可以进一步加速推理。nvidia在TensorRT架构下给出了一个INT8方案,但TensorRT 的INT8模式只支持计算能力为6.1的GPU。这里可查显卡计算能力。

注:Jetson nano,Jetson TX2都不支持INT8量化加速,但GTX1050Ti支持

INT8量化大概的原理:

原来训练好的网络中的weight是FP32的,inferece的时候,每层的输入(或者叫前一层的activation,也叫feature maps)也是FP32的,计算时就是FP32与FP32进行卷积(矩阵乘、加)计算,开销很大。可以在每一层进行FP32 x FP32卷积之前,将activation量化为INT8,模型中weight也相应进行量化,把计算简化为INT8 x INT8计算,大大减小计算开销(变成原来1/4),但必然是会导致精度的下降,相当于用精度来换时间。

针对一个层来说,weights存储为FP32,是训练得来的,本来数据不多,直接量化为INT8就可以。但是这一层输入feature maps的取值范围随着图像变化,直接量化肯定不行,需要设计一个比较通用的规则。


如上图,activation的量化就是将原来分布在[-a,b]的值映射到[-127,127],而数据的最小值a和最大值b是不相等的,直接映射过来会导致不均匀的问题。为了减轻这种影响,并充分利用这有限的编码范围,INT8量化时首先找到一个阈值T,然后把左侧超出-|T|的值全部映射到-127,再把[-|T|,|T|]内的值映射到[-127,127]。T一旦定下来,就作为这一层的一个新的参数存起来,以后每次经过这一层,就用这个策略把activation量化为INT8,然后和直接量化成INT8的weights进行计算。原先的FP32 x FP32运算就变成了INT8 x INT8运算。
每层的T的获取用的是迭代求解的方法,所以INT8量化技术需要先做一个calibration数据集来求每一层的阈值T,这个calibration数据集来自验证集,要求1000张图片,最好包含各种类别。

步骤如下:

对每一层:
1.用FP32模式进行推断,得到该层激活值,求其分布直方图
2.基于不同的阈值,产生不同的INT8量化分布(有好多个T备选,每个T对应一个量化结果)
3.计算量化后的分布与原分布的相对熵(又叫KL散度,用来衡量两个分布之间的距离),然后选择熵最小的一个,这个T就定为该层的阈值参数


tensorrtx + yolov5,使用INT8加速的具体操作

在coco数据集选1000张图放在/tensorrt/yolov5/build/coco_calib/下

sudo gedit /tensorrt/yolov5/yolov5.cpp
# 找到这一行,注释掉
// #define USE_FP16
# 改为
#define USE_INT8

cd build
make
sudo ./yolov5 -s yolov5s.wts yolov5s.engine s
这里会自动开始calibrate,最后会生成int8calib.table
sudo ./yolov5 -d yolov5s.engine ../samples

在yolov5s模型上测试,显卡是GTX1050Ti,原本每张20ms左右的测试时间,现在降到10ms左右,但是精度变得很低,很多目标都没检测出来。应该是因为yolov5s本身模型已经非常小了,不适合再优化。

参考:从TensorRT看INT8量化原理

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值