关于 ONNX 及其用 TensorRT 7.0加载

1)Onnx简介

ONNX 定义了一种可扩展的计算图模型、一系列内置的运算单元(OP)和标准数据类型。每一个计算流图都定义为由节点组成的列表,并构建有向无环图。其中每一个节点都有一个或多个输入与输出,每一个节点称之为一个 OP。这相当于一种通用的计算图,不同深度学习框架构建的计算图都能转化为它。

现阶段 ONNX 只支持推理,所以导入的模型都需要在原框架完成训练。

部分框架已经内嵌了 ONNX,开发者可以直接通过内置 API 将模型导出为 ONNX 格式,或采用它们作为推理后端。

部分框架并不直接支持 ONNX 格式,但是可以通过转换工具导入或导出。

2)用Onnx模型进行推理

微软开源了 ONNX Runtime,专为 ONNX 格式的模型设计了高性能推理引擎。可以自动调用各种硬件加速器,例如英伟达的 CUDA、TensorRT 和英特尔的 MKL-DNN、nGraph。

微软开源了 ONNX.JS,它是一种在浏览器和 Node.js 上运行 ONNX 模型的 JavaScript 库。它部署的模型效率非常高,且能实现交互式的直观推理。该开源项目给出了图像分类的交互式演示,且在 Chrome 浏览器和 CPU 下比 TensorFlow.JS 快了近 8 倍,采用了 WebAssembly 和 WebGL 技术,并在 CPU 或 GPU 上推理 ONNX 格式的预训练模型。

Facebook 开源了 ONNXIFI,为 ONNX 提供了用于加载和执行 ONNX 计算图的跨平台 API。

英特尔开源 nGraph,它能编译 ONNX 格式的模型,并在 CPU 或 GPU 等硬件加速模型的运行。

3) Onnx预训练模型

ONNX Model Zoo ,项目地址:https://github.com/onnx/models

包括常见神经网络的预训练模型,还为每个预训练模型开放了对应的训练代码。训练和推理代码都是用 Jupyter Notebook 写的,数据和模型等都有对应的链接。

4)Onnx模型优化与部署

可以通过TensorRT对模型进行优化和部署(转化为trt),目前最高版本为TensorRT7.0

5) 其它格式转Onnx

参看:https://blog.csdn.net/u013597931/article/details/88063872

MXNET可直接利用mxnet export_model输出onnx模型,但有时会遇到以下错误:

onnx.onnx_cpp2py_export.checker.ValidationError: Unrecognized attribute: spatial for operator BatchNormalization

网上说这个是因为onnx版本太高了,可以降低至1.3.0。我降到1.3.0后转后能够通过,但加载onnx出现以下错误:

ERROR: ModelImporter.cpp:92 In function parseGraph:
[8] Assertion failed: convertOnnxWeights(initializer, &weights, ctx)

 另一方法参考  https://github.com/apache/incubator-mxnet/issues/14589

即按以下方法修改mxnet中的/_op_translations.py程序:

@mxnet-label-bot
My onnx 1.5.0 (latest)
For batchnorm, I revised script mxnet/contrib/mx2onnx/_op_translations.py as follows:
1, on line 647: kernel = eval(attrs["kernel"]) if attrs.get("kernel") else None
This is needed for global pooling like:
x = mx.symbol.Pooling(data=data,
pool_type='avg',
global_pool=True,
name=name+'pool')

2, delete line 359: spatial=0
This line is not supported for onnx > 1.3.0

但是,按以上方法修改后,加载onnx时出现以下错误:

ERROR: builtin_op_importers.cpp:461 In function importConv:
[8] Assertion failed: nbSpatialDims == kernel_weights.shape.nbDims - 2

6)文件内容显示

可以用Netron打开Onnx文件,并以有向图的方式显示出来。该软件还能打开其它多种神经网络模型。

7)用TensorRT 7.0加载模型遇到的问题

(1)yolov3.onnx(从keras模型转换得到):

ERROR: onnx2trt_utils.cpp:417 In function elementwiseHelper:
[8] Assertion failed: tensor_ptr->getDimensions().nbDims == maxNbDims && "Failed to broadcast tensors elementwise!"

(2)tiny_yolov2.onnx (从ONNX Model Zoo下载):

(3)VGG_VOC0712_SSD_300x300_iter_120000.caffemodel(TensorRT 5.0中的sample):

在TensorRT 7.0中首先提示找不到此文件(有sample程序),发现目录下确实无此文件,从TensorRT5.0的目录下将将关文件拷过来后,报以下错误:

不知是不是该caffe模型版本太低,TensorRT7.0已不支持。

 

有知道以上问题解决方案的大神请留个言,非常感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值