问题的开始

前些天尝试使用TensorRT转换一个模型,模型用TensorFlow训练,包含LSTM+Transform+CNN,是一个典型的时序结构模型,包含编码解码结构,暂称为debug.onnx吧。

这个debug.onnx使用tf2onnx导出,导出后tf2onnx会自动对这个onnx做一些优化,例如常量折叠、算子融合等等一些常规操作,一般来说这些操作不会影响网络结构(也会出现影响的情况!之后老潘会说),而且有助于模型的优化。

然后导出来之后使用onnxruntime简单测试一下导出模型是否正确,是否与TensorFlow的结果一致。如果正确我们再进行下一步。

模型体积不大(30MB左右),但是op节点很多,以至于使用Netron打开前会提示:

嗯?不就是个警告么,Yes就行!

然后等了N久(1个小时),还是提示打不开,节点太多了-_-||。

实在打不开咋办,可以通过onnx的python接口读取onnx模型,然后将网络结构打印出来:

import onnxmodel_path = '/home/oldpan/code/models/debug.onnx'onnx_model = onnx.load(model_path)
onnx.checker.check_model(onnx_model)f = open('net.txt', 'w+')
print(onnx_model, file=f)
f.close()

这里将onnx_model的网络结构输出为net.txt,好了,打开这个txt慢慢看吧。

(fun) oldpan@oldpan-fun:~/code$ cat net.txt | head
ir_version: 4
producer_name: "tf2onnx"
producer_version: "1.6"
graph {node {input: "input.1"input: "conv1.weight"output: "340"op_type: "Conv"attribute {

老潘这里提一句,并不是模型体积大才代表模型复杂,模型大小只会影响这个模型占用内存或者显存的量,整个模型执行的时间与其中的OP计算量也是有关系的。

PS:还是检测类的模型好一些,没有错综复杂的op,全是卷积一块一块的,简单粗暴。

FP32与FP16的代沟

好了!有这个debug.onnx模型,使用TensorRT自带的trtexec转换一下吧。

这里使用的TensorRT是最新的TensorRT-7.2.3.4版本,使用的显卡为RTX2080Ti

转换过程中没有任何问题,除了是有一些int64截断和Type的警告,但是一般来说这种警告对结果是没有影响的(如果有有影响的例子,请告诉我~):

转化好之后,简单测试下FP32的结果是正确的,看起来不错,对比了下FP32与TensorFlow原生推理的精度,精度相差不多(万分之一的差距),还是有使用价值的。

简单测一下速度,嗯…相较TensorFlow原来差不多500Q的速度,FP32也才550Q,提升10%不到啊。

还咩有具体看每个层的耗时,老潘初步推断,整个模型中的op比较多也比较复杂,不是那种像VGG、unet这个一大块一大块卷积相连的,更多的是一些细小的op,TensorRT优化起来作用并不大。怎么形容,一个resnet50转化为onnx的node节点数也就150左右,而我们的这个debug.onnx模型足足有3000多个node节点,转化为TensorRT格式的时候使用trt_network->getNbLayers();看了下,debug.trt足足有9000多个节点。

哦mygodholyshit。

好了不纠结那么多,能转过来就好。

让我试试FP16的速度咋样吧,嗯,1000Q,差不多500q的两倍,还是有收益的。以上实验是在RTX2080TI上做的,20系列有FP16计算单元,所以模型转化为FP16是有速度收益的。如果我们用的是1080TI,那么模型转化为FP16只有模型体积的缩小,模型运行速度并不会提升,反而会有下降。

测试一下FP16的结果

铺垫那么多…FP16的提速固然是可喜的,但是结果完全不对。

输出的置信度和标签完全不对。

正确的结果[24,23,4,5,2],[1.000,0.99,0.99,0.99,1.0]

错误的结果[5,5,5,5,7],[0.768,0.65,0.5,0.5,0.3]

肿么办,肿么办,完全没有头绪,感觉FP16和FP32的代沟还挺大的。

想要弄清楚原因,首先要明白什么是FP16

关于FP16

FP16之所以计算那么快,最重要的原因是因为FP16只占两个字节,相比FP32所占的内存更小,实现的指令也比FP32更快。有专门FP16计算单元的显卡,相比FP32,FP16的flops往往都很高。

比如RTX2080TIPeak Fp16 Tflops26.9Peak Fp32 Tflops13.4,几乎两倍多的差距。很显然使用FP16不论是推理还是训练都会比FP32快一些。

不过FP16快是快,但因为指数位和尾数位都比FP32要小,其动态范围和精度也大大减小了,如果一个数超出了FP16的动态范围,那么显然是会溢出的

寻找结果错误原因

由上所述,问题的原因应该比较明了了,大概率是模型中某一层的计算FP16因为动态范围和精度不够,导致某个op节点的计算值溢出了。然后牵一发而动全身,整个模型后面的所有层都崩了。

而这种情况最直接最简单寻找问题op的方法就是逐层打印输出观察,然后从输入到输出每一层对比输出结果观察哪一层出问题了。

但是对于转化后的TensorRT模型我们并不能做到这一点,呃

想提速但TensorRT的FP16不得劲?怎么办?在线支招!相关推荐

  1. 台式电脑不拉网线上网_在家里想不拉宽带用无线上网,试试这几招?

    玩游戏.看电视手机流量不够用,又不想拉宽带?现在教你如何不拉宽带连无线网. 可通过下列方法实现不拉宽带不拉宽带连无线网: 1.购买大流量卡.无线网卡 可以通过购买无线网卡,安装台式电脑搜索手机热点.也 ...

  2. 学计算机的男孩子怎么追女孩子,男生想要追到女孩子,教你几招,用这几个方法,基本上就十拿九稳...

    男生想要追到女孩子,教你几招,用这几个方法,基本上就十拿九稳 谈恋爱之前都是存在一个过渡期的,两个人在谈恋爱之前都是处于暧昧期的,最后就转变成情侣关系的.我们都知道对于许多人来说,去追自己喜欢的人是一 ...

  3. 手握2.2亿美元,但想不起密码,还有两次机会,一起支支招啊!

    现在的年轻人往往成为月光族,但是如果当你手握巨额财产却无法使用,有没有想过会是什么感觉呢? 这不,国外有位幸运又不幸运的程序员正在体验这种微妙的感觉. 说他幸运,是因为他的财产达到了2.2亿美元. 说 ...

  4. 计算机考研报师范类大学好吗,想考师范类的研究生都有哪些大学招

    1.请问非师范类 考研 想考师范类的研究生 怎么考 研究生应该是没有师范类跟非师范类的区别的吧,(至少我学校没有哈~)所谓的师范类,应该是在本科的时候所读的专业里包含能够拿到教师资格证的科目,如教育学 ...

  5. 我想在家兼职赚钱,请您给支招?

    我也是宝妈,出去找工作找不到合适的,因为还想照顾孩子,现在在做网店,开了两个店,做了几个月了,对我来说很满意,这个兼职的事别人只是提个意见,反正好好努力都能挣钱.

  6. 【PS】想识别图片中的字体?来叫你一招

    1.打开这个网站 likefont.com 2.把你想要识别的图片放上去 3.最后识别 随便输入几个,然后是被就可以了

  7. 想快速抓住区块链红利?教你25招,0基础入门成区块链行家!

    有一次,我听到有人问李笑来:一个传统行业,怎么才能抓住区块链技术的机会呢? 李笑来说,这个问题问得就有问题. 面对一种新技术,只要你站在原来的行当里问,我怎么抓住这个新机会呢?最后的结果基本都是抓不住 ...

  8. 失眠脑子一直在想事情,试试这些高质量睡眠小妙招

    平常偶尔失眠,我们可以在睡前做一些可以帮助睡眠的事情,比如:听一些轻音乐,舒缓一下自己焦虑的心情,睡前适当运动放松,这些都能够在一定程度上促进睡眠,下面这些可以帮助睡眠的好物分享给大家~ 1.南卡Zz ...

  9. 想要注销手机卡何必再跑营业厅,一招教你线上注销!

    很多小伙伴名下都不止一张手机卡,那些不用的手机卡虽说欠费三个月就会自动注销了,但是手机停机欠费很容易会被运营商拉进黑名单里,所以不用的手机卡还是要注销掉.跑营业厅去注销的话,确定比较麻烦,有时候人多排 ...

最新文章

  1. linux下的rabbitmq安装与配置
  2. 我的Java开发学习之旅------Java经典排序算法之希尔排序
  3. Google Capture The Flag 2018 (Quals) - Beginner's Quest - Reverse - Firmware
  4. 怎么看有没有安装libevent_家里有没有必要安装前置净水器?先听听师傅是怎么说的...
  5. reciprocity
  6. 【14】GO语言的接口类型
  7. python函数式编程读取数据时出现错误_Python编程中,函数遇到问题是抛出错误好还是约定返回值好?...
  8. 删除按钮_SPA PP COGI中禁用删除按钮?
  9. python脚本在centos系统一键卸载重新安装Mysql
  10. python画简便的图-特征锦囊:常用的统计图在Python里怎么画?
  11. linux常用命令(入门)
  12. 如何使用proteus仿真
  13. mib节点 snmp trap_浅谈 Linux 系统中的 SNMP Trap
  14. 【转载】白素贞的身世之谜
  15. 22. 协程与Python中的多任务异步协程
  16. 2020李宏毅学习笔记——14.Convolution Netural Network
  17. DoS、DDos以及DRDoS攻击手段和防范措施
  18. speedoffice表格如何重复打印标题?
  19. 《墨水心》(Inkheart)
  20. 大球吞小球html5游戏在线玩,大球吃小球大作战

热门文章

  1. 小白说js--我是一个逆袭的JS
  2. 海洋环境科学概论知识整理--2
  3. 《毛毛虫团队》第三次作业:团队项目的原型设计
  4. 【log4j 2.x】【log4j日志升级漏洞修复】log4j2日志 [简单明了][一眼就会]
  5. 2.1致远OA二次开发如何搭建服务器开发环境
  6. Shell扩展正则表达式练习1——电话号码过滤
  7. to 管理员:网站的“技术区文章列表RSS”有问题 我用GUSH连不上!
  8. 你为什么要学习这门专栏?
  9. druid.io中文版文档
  10. 语言-英语-英国英语:英国英语