Mxnet模型转换ONNX,再用tensorrt执行前向运算

环境:ubuntu16.04

tensorrt版本:5.1.5.0

cuda版本:9.0

GPU:1080Ti

Mxnet版本:1.3.1

cudnn:7.3.1

1、tensorrt安装:

https://github.com/NVIDIA/TensorRT

tensorrt的不同版本:

https://developer.nvidia.com/nvidia-tensorrt-download

tensorrt python版的安装参考:

https://blog.csdn.net/zong596568821xp/article/details/86077553

官网参考:

https://docs.nvidia.com/deeplearning/sdk/tensorrt-install-guide/index.html

其实看官网安装tensorrt很简单

2、安装ONNX_TensorRT:

这里才是重点,由于mxnet模型不能直接在tensorrt上直接进行前向运算,所以需要先将mxnet模型转换为onnx模型,再用tensorrt对onnx模型进行前向运算,即模型转换:mxnet->onnx  tensorrt使用onnx完成计算。

首先要安装ONNX_TensorRT,开始踩坑(真是太坑了!!)

ONNX_TensorRT:

主要步骤看官方教程

https://github.com/onnx/onnx-tensorrt

第一个坑:cmake找不到cuda编译器。cmake3.15.1和3.11.1均无法找到cuda的编译器,最后安装的3.9.0成功找到编译器(期间改了无数遍环境变量各种折腾,就是找不到)

由于ONNX_TensorRT需要依赖protobuf和tensorrt,tensorrt前面已经装好了,现在安装protobuf:

https://github.com/protocolbuffers/protobuf

源码安装和pypi两种都做了,原因是两者安装完以后cmake编译时均找不到protobuf,后来更改了third_party下的CMake.lists中233行

COMMAND ${ONNX_PROTOC_EXECUTABLE} ARGS ${PROTOC_ARGS}改为

COMMAND ${Protobuf_PROTOC_EXECUTABLE} ARGS ${PROTOC_ARGS}

Protobuf_PROTOC_EXECUTABLE为定义好的环境变量名称来找到/usr/local/bin/protoc(这一步弄了两天终于编译过了)

第二个大坑:

mxnet模型转换为onnx模型和tensorrt读取onnx模型并创建engine:

mxnet在定义网络时(以下均为symbol情形)尽量将所有函数参数确定,不要用默认参数(及时它们相同),否则容易报错。

期间遇到的问题:

1、BatchNorm下attribute含有spatial,而onnx貌似不支持这一属性(本人也不太清楚spatial具体作用),在转换时注掉spatial=0

2、tensorrt读取onnx模型时发现不支持3d卷积操作,tensorrt支持的onnx operator:

https://github.com/onnx/onnx-tensorrt/blob/master/operators.md

3、源码安装的mxnet(1.3)版本转换onnx时deconv不支持,到

https://github.com/apache/incubator-mxnet/tree/fd34dc5f847192dfd522555afdf13be1eb67b72b/python/mxnet/contrib/onnx

下替换文件。

4、tensorrt调用onnx model时maxpool报错,暂不支持ospet10版本的maxpool。有些操作可以通过转换版本实现,转换版本方法:

https://github.com/onnx/onnx/blob/master/onnx/version_converter.py

最后是onnx安装:

pypi安装即可:

pip3 install onnx
————————————————
版权声明:本文为CSDN博主「sinat_29595613」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_29595613/article/details/99302781

原文地址:https://www.cnblogs.com/cloudrivers/p/12019857.html

时间: 2024-08-25 03:04:59

Mxnet模型转换ONNX,再用tensorrt执行前向运算的相关文章

MxNet模型转换Onnx

MxNet模型导出ONNX模型Open Neural Network Exchange (ONNX)为AI模型提供了一种开源的数据模型格式.它定义了一个可扩展的计算图模型,以及内置运算符和标准数据类型的定义.它可以作为各种AI模型之间进行转换的媒介,例如,市面上没有现成的Caffe模型到MxNet模型的转换工具,我们可以借助于ONNX,首先将Caffe转换为Onnx,然后再将Onnx转换为MxNet,更为神奇的是,这之间的转换过程不过丢失原有模型的精度. 在本教程中,我们将展示如何将MXNet模

OpenVino的MXnet模型转换

[在使用Movidius的模型优化器转换模型之前,需要先用MXNet的deploy.py将模型转换成部署模式,然后才能用movidius的优化器转换] https://github.com/apache/incubator-mxnet/blob/master/example/ssd/deploy.py cd ~git clone https://github.com/apache/incubator-mxnet mv tmp/*-0000.params tmp/ssd_resnet50_512-

数据库设计之E-R模型转换成关系模型

个人重构版机房收费系统中需要自己重新设计数据库,那么如何设计数据库呢?这也是咱们自考中一门重要的课程<数据库原理>,对于考过这科的同学想必已经从中受益,直接就可以学以致用.我是今年10月份考这本书,所以就先实践一把. 原先看过的耿建玲老师的视频,里面重点讲解的是数据库内部的具体操作,没有怎么涉及到数据库设计中不可或缺的一个步骤即从概念模型到逻辑模型的转换.进入正题: 背景:数据系统生存期 我们把数据库应用系统从开始规划.设计.实现.维护到最后被新的系统取代而停止使用的整个期间,称为数据库系统生

MxNet 模型转Tensorflow pb模型

用mmdnn实现模型转换 参考链接:https://www.twblogs.net/a/5ca4cadbbd9eee5b1a0713af 安装mmdnn pip install mmdnn 准备好mxnet模型的.json文件和.params文件, 以InsightFace MxNet r50为例        https://github.com/deepinsight/insightface 用mmdnn运行命令行 python -m mmdnn.conversion._script.con

main函数执行前、后再执行的代码

一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数也会在main之后执行.  (2)一些全局变量.全局对象和静态变量.对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间.释放资源使用权等操作  (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行.全局对象的构造也在ma

[CodeForces-606E] Freelancer&#39;s Dreams 凸包 模型转换

大致题意: 有一个人想要获得p个经验点和q元钱.现在给出n份工作,每份工作每天能得到Ai的经验值和Bi的钱,问最少需要工作多少天, 能使得总经验值>=p,总钱>=q. 先对给出的n份工作以及原点O(0,0),x轴的最大点(maxx,0),y轴最大点(0,maxy)构建凸包,根据凸组合,可知凸包上所有得点以 及凸包边上的点都可以由一天时间得到,那么只要求出射线O~P(p,q)与凸包的交点,即可求出最后的结果. 1 #include<cstdio> 2 #include<iost

WPF 3D中多个模型如何设置某一个在最前?

原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D挡住. 方法: (1) 将模型设置为透明,<SolidColorBrush Color="#3333CC" Opacity="0.8"/>,同时,将axis使用EmissiveMaterial. 这样实现可以在旋转后看到axis,但是这种方法并没有让axis

quartz2.3.0(九)job任务监听器,监听任务执行前、后、取消手动处理方法

job1任务类 package org.quartz.examples.example9; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.slf4j.Logger; import org.slf4j.LoggerFact

关于Kettle的事务和转换内步骤的顺序执行

kettle中转换和作业的执行顺序: 1.一个作业内的转换,是顺序执行的. 2.一个转换内的步骤是并行执行的. 3.作业内不支持事务,转换内支持事务. 根据业务需要,通常需要在转换内顺序执行,小技巧如下: 1.执行SQL是优先于所有步骤. 2.使用“阻塞数据直到步骤都完成”,确保其他数据步骤都完成再进行下一步骤. 事务: 1.设置转换只使用一个事务.转换设置-->夹项-->使用唯一连接. 2.设置转换内的表插入等数据库的操作不进行批量提交."提交记录数量"-->0