英伟达TensorRT 8-bit Inference推理
引论
● 目标:将FP32 CNN转换为INT8,不会造成显著的精度损失。
● 原因:Int8 Math具有更高的吞吐量和更低的内存需求。
● 挑战:INT8的精度和动态范围,明显低于FP32。
● 解决方案:在将训练模型权权重化为INT8时,及在INT8计算激活时,将信息损失降至最低。
● 结果:方法已在TensorRT中实现。不需要任何额外的微调或重训练。
Outline
● INT8 compute
● Quantization
● Calibration
● Workflow in TensorRT
● Results
INT8推理挑战
● 与FP32相比,INT8的精度和动态范围明显更低。
● 需要的不仅仅是从FP32到INT8的简单类型转换。

高通量INT8数学
● 需要sm_61+(Pascal TitanX,GTX 1080,特斯拉P4,P40等等)。
● 在32位结果中,累加四路byte字节点积。

Context
● Performance.
● No accuracy loss.
● Hence solution has to be “simple” and compute efficient.
Linear quantization
Representation:
Tensor Values=FP32 scale factor * int8 array+FP32 bias
● 解决方案必须“简单”,计算效率高。
张量值=FP32比例因子*int8数组+FP32偏差
真的需要bias吗?
两个矩阵:
A=scale_A * QA+bias_A
B=scale_B * QB+bias_B
Let’s multiply those 2 matrices:
A * B=scale_A * scale_B * QA * QB

  • scale_A * QA * bias_B
  • scale_B * QB * bias_A
  • bias_A * bias_B

将这两个矩阵相乘:

真的需要bias吗?
不,两个矩阵:
A=scale_A * QA
B=scale_B * QB
将两个矩阵相乘:
A * B=scale_A * scale_B * QA * QB
对称线性量化
Representation:
张量值=FP32比例因子*int8数组
整个int8张量的一个FP32比例因子
问:如何设置比例因子?
Quantization
● No saturation: map |max| to 127
● 无饱和度:将| max |映射到127

Quantization
● 无饱和度:将| max |映射到127

● 通常,精度损失严重
● 无饱和度:将| max |映射到127
● 饱和超过|阈值|至127

● 通常,精度损失严重
Quantization

问:如何优化阈值选择?
● 在INT8表示的范围和精度间,进行折衷权衡。

两种编码的“相对熵”
● INT8模型编码与原始FP32模型相同的信息。
● 尽量减少信息损失。
● 信息损失由ullback-Leibler散度(又称相对熵或信息散度)衡量。
○ P,Q-两种离散概率分布。
○ KL_divergence(P,Q):= SUM(P[i] * log(P[i]/Q[i]),i)
● 直觉:KL散度度量,在近似给定编码时,丢失的信息量。
解决方案:校准
● 在校准数据集上运行FP32推理。
● 对于每一层:
○ 收集激活的直方图。
○ 生成许多具有不同饱和阈值的,量化分布。
○ 选择最小化KL_divergence(ref_distr,quant_distr)。
● 在典型的桌面工作站上,整个过程需要几分钟。

校准数据集
● 表示
● 多种多样的
● 理想情况下,验证数据集的子集。
● 1000份样品
校准结果
校准结果#1

校准结果#2

校准结果#2

校准结果#3

校准结果#4

校准结果#5

TensorRT中的工作流
TensorRT中的典型工作流
● 需要:
○ 用FP32训练的模型。
○ 校准数据集。
● TensorRT将:
○ 在FP32中,对校准数据集,运行推理。
○ 收集所需的统计数据。
○ 运行校准算法→ 优化比例因子。
○ 量化FP32权重→ INT8。
○ 生成“CalibrationTable”和INT8执行引擎。
Results
Results – Accuracy

TensorRT 2.1,已启用所有优化。ILSVRC2012验证数据集,batch批处理=25幅图像。对未用于校准的500batches,进行了准确度测量。
Results – Performance

TensorRT 2.1,已启用所有优化。
公开挑战/改进
● ReLU后激活的Unsigned int8。
● RNNs→ 开放性研究问题。
● 微调饱和阈值。
● 公开API,接受用户提供的自定义比例因子。
Conclusion
● 引入了一种自动,无参数的方法,用于将FP32 CNN模型,转换为INT8。
● 对称线性量化,用于权重和激活。
● 量化原始FP32数据,使信息损失最小化。
● 使用FP32训练的大众化,公开可用的CNN模型,可转换为INT8,INT8模型的精度与FP32基线相当。

熵校准-伪码
输入:FP32直方图H,共2048个bins单元:bin[0],…,bin[2047]
For i in range( 128,2048):
reference_distribution_P=[bin[0],…,bin[i-1]] // take first ‘ i ‘ bins from H
outliers_count=sum( bin[i],bin[i+1],…,bin[2047])
reference_distribution_P[i-1] += outliers_count
P/=sum§ // normalize distribution P
candidate_distribution_Q=quantize [bin[0],…,bin[i-1]] into 128 levels // explained later
expand candidate_distribution_Q to ‘ i ’ bins // explained later
Q/=sum(Q) // normalize
distribution Q divergence[i]=KL_divergence( reference_distribution_P,
candidate_distribution_Q)
End For
Find index ‘m’ for which divergence[m] is minimal
threshold=( m+0.5) * ( width of a bin)

候选分布Q
● KL_divergence(P,Q) 要求 len§ == len(Q)
● 候选分布 Q 源自融合‘ i ’ bins,从bin[0] 到 bin[i-1],生成 128 bins
● 随后,Q 再次‘expanded’到‘i’ bins
简单示例:
参考分布P由8 bins组成,希望量化到2 bins:
P=[1,0,2,3,5,3,1,7]
融合到 2 bins (8/2=4 连续 bins 合并成一个 bin) [1+0+2+3,5+3+1+7]=[6,16]
随后,按比例expand 到 8 bins,原始分布P保存为empty bins:
Q=[6/3,0,6/3,6/3,16/4,16/4,16/4,16/4]=[2,0,2,2,4,4,4,4]
now we should normalize both distributions,after that we can compute
规范化这两个分布,可以计算
KL_divergence P/=sum§ Q/=sum(Q) result=KL_divergence(P,Q)

INT8 conv内核的伪代码
// I8 input tensors: I8_input,I8_weights,I8 output tensors: I8_output
// F32 bias (original bias from the F32 model)
// F32 scaling factors: input_scale,output_scale,weights_scale[K] I32_gemm_out=I8_input * I8_weights // Compute INT8 GEMM (DP4A)
F32_gemm_out=(float)
I32_gemm_out // Cast I32 GEMM output to F32 float
// At this point we have F32_gemm_out which is scaled by ( input_scale * weights_scale[K]),
// 要将最终结果存储在int8中,需要使scale等于“output_scale”,必须重新缩放:
// (this multiplication is done in F32,*_gemm_out arrays are in NCHW format)
For i in 0,… K-1:
rescaled_F32_gemm_out[:,i,:,:]=F32_gemm_out[:,i,:,:] * [output_scale/(input_scale * weights_scale[i])]
//添加bias偏差,要执行添加,必须重新缩放原始F32 bias,使用“输出_比例”进行缩放:
rescaled_F32_gemm_out _with_bias=rescaled_F32_gemm_out+output_scale * bias //
Perform ReLU (in F32)
F32_result=ReLU(rescaled_F32_gemm_out _with_bias)
//转换为INT8,保存为全局
I8_output=Saturate( Round_to_nearest_integer( F32_result))
Results - Performance - Pascal Titan X

TensorRT FP32 vs TensorRT INT8
Pascal TitanX
Results - Performance - DRIVE PX 2,dGPU

TensorRT FP32 vs TensorRT INT8
DRIVE PX 2,dGPU

参考链接:
https://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf

英伟达TensorRT 8-bit Inference推理相关推荐

  1. 重磅 | 最全PPT实录!英伟达发布可编程AI推理加速器TensorRT

    作者 | 鸽子 2017年9月26日,英伟达GPU技术峰会GTC CHINA在北京开幕.英伟达创始人兼CEO黄仁勋发表主旨演讲<AI 的趋势.挑战与机遇>. 在他的演讲中,黄仁勋提到BAT ...

  2. 阿里平头哥首款AI芯片发布!46倍于英伟达P4,刷新全球推理性能最高纪录

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 阿里第一颗芯片诞生! 刚刚,云栖大会现场,阿里巴巴集团CTO.达摩院院长张建锋向全场展示了含光800--阿里第一款AI芯片. 为了这款芯片 ...

  3. 英伟达深度学习推理引擎TensorRT,现在开源了

    https://www.toutiao.com/a6703740623364555271/ 2019-06-18 13:37:53 机器之心报道 参与:李亚洲.李泽南.思 英伟达的深度学习推理引擎Te ...

  4. 英伟达GPU“屠榜”,谷歌TPU“退赛”,MLPerf最新推理榜单出炉

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI MLPerf推理基准测试第二版(v0.7)近日发布. 在数据中心分类下,英伟达2年前的推理卡T4依然能"大杀特杀",7 ...

  5. 今晚直播写代码|英伟达工程师亲授如何加速YOLO目标检测

    NVIDIA TensorRT是一种高性能深度学习推理优化器和运行时加速库,可以为深度学习推理应用程序提供低延时和高吞吐量.通过TensorRT,开发者可以优化神经网络模型,以高精度校对低精度,最后将 ...

  6. 用“AI核弹”饱和攻击的英伟达,如何赢下AI计算新赛场?

    在2012年的ImageNet挑战赛(ILSVRC)上,深度卷积神经网络AlexNet横空出世,在图像分类识别领域实现了质的飞跃,被认为是AI时代的标志性事件,代表着深度学习时代的正式开端. 在此之前 ...

  7. 本周AI热点回顾:十四五规划“人工智能第一!”;深度学习漫画第一卷现已开源;英伟达GPU“屠榜”MLPerf

    点击左上方蓝字关注我们 01 人工智能第一!十四五规划建议正式发布 近日,中国共产党第十九届中央委员会第五次全体会议深入分析国际国内形势后,就制定国民经济和社会发展「十四五」规划和2035年远景目标提 ...

  8. 英伟达PyTorch优化神器TensorRT重磅更新!10亿参数大模型实时运行,GPT推理加速21倍...

      视学算法报道   编辑:好困 小咸鱼 [新智元导读]12月2日,英伟达发布了最新的TensorRT 8.2版本,对10亿级参数模型进行了优化,让实时运行NLP应用成为可能.与原始PyTorch模型 ...

  9. 英伟达“暴力碾压”谷歌:53分钟训练完BERT,2.2毫秒完成推理,创下NLP三项新纪录...

    边策 发自 凹非寺  量子位 报道 | 公众号 QbitAI AI硬(he)件(dan)厂商英伟达今天宣布,他们在NLP模型上取得了三大突破,为今后会话AI的落地应用铺平了道路. 英伟达用自己的硬件与 ...

最新文章

  1. http协议常见的响应头
  2. 好玩的python代码示例-这可能是最好玩的python GUI入门实例!
  3. 安装CM 6.3.1和CDH 6.3.2
  4. PHPCMS调用相关
  5. Android 百度地图之全局搜索周边搜索全国搜索城市路线规划(升级版附源码)
  6. 其中一个页签慢_VBA实战技巧15:创建索引页
  7. oracle中闪回和回滚,oracle闪回操作详解
  8. 上传jar包到私服(仅限于翼支付公司工作流程使用)和涉及的技术总结
  9. Python之数据分析(numpy线性模型、线性预测、线性拟合)
  10. 计算机信息网络功能修改,IP地址自动修改的功能移植
  11. 张宇1000题高等数学 第四章 一元函数微分学的计算
  12. TCP 之 抓包分析
  13. 五家渠市谷歌高清卫星地图下载
  14. 论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
  15. 用递归实现阶乘计算器
  16. 如何通过校园招聘,进入互联网大厂?
  17. 哪些Python技术助力人工智能发展
  18. 北理和国防科技计算机,“国防七子”实力真的非常强大吗?理科考生在他们之间该怎么做选择?...
  19. ES5对象学习-多个对象的创建
  20. WINDOWS开机11大进程

热门文章

  1. Linux下tomcat的安装与卸载以及配置(超简单)
  2. 2022-2028年中国高密度聚乙烯(HDPE)行业市场发展调研及投资前景分析报告
  3. IDEA集成Docker插件实现一键自动打包部署微服务项目
  4. SpringBoot2.x 不反回空值属性
  5. django正反向查询
  6. torch中的copy()和clone()
  7. Typora+PicGo图床配置(本地图片-->网络url~博客必备)
  8. 自动驾驶解决方案架构
  9. 你哪来这么多事(四):职工信息排序
  10. 微信小程序去掉左上角的返回箭头