关于 ONNX 及其用 TensorRT 7.0加载

本文深入探讨ONNX模型的定义、转换与优化方法,包括ONNXRuntime、ONNX.JS及TensorRT的使用,同时介绍了ONNXModelZoo资源与模型部署技巧,最后讨论了模型转换与部署中可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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已不支持。

 

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

### Ubuntu系统中部署TensorRT 7.0和YOLOv5 #### 安装依赖库 为了成功部署TensorRT 7.0,在Ubuntu环境中需先安装必要的依赖项。这通常涉及更新包列表并安装CUDA、cuDNN以及其他支持工具[^1]。 ```bash sudo apt-get update && sudo apt-get upgrade -y ``` 对于特定版本的TensorRT,确保所使用的CUDA和cuDNN版本兼容是非常重要的。例如,TensorRT 7.0可能要求特定范围内的CUDA版本以及相应的cuDNN版本。 #### 下载与安装TensorRT 获取官方提供的TensorRT安装文件,并按照说明完成安装过程。可以通过NVIDIA官方网站下载适合的操作系统版本的TensorRT安装包。一旦下载完毕,则可以执行如下命令来解压并安装: ```bash tar zxvf TensorRT-7.0.x.x.linux.x86_64-gnu.cuda-xx.xx.cudnnX.X.tar.gz cd TensorRT-7.0.x.x.linux.x86_64-gnu.cuda-xx.xx.cudnnX.X sudo ./install.sh ``` 这里`xx.xx`代表具体的CUDA版本号而`X.X`表示cudnn版本号,请替换为实际数值[^3]。 #### 准备YOLOv5模型及相关资源 从指定仓库克隆YOLOv5项目到本地机器上以便后续操作。此步骤允许访问源码及其配套脚本用于转换和其他用途。 ```bash git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt ``` 上述指令会拉取最新的YOLOv5代码库至当前工作目录下,并安装所需的Python库以保障程序正常运行[^2]。 #### 转换ONNX格式模型 为了让YOLOv5能够在TensorRT环境下高效运作,需要将其原始PyTorch模型导出成ONNX格式。之后再利用TensorRT SDK中的工具进一步优化该模型供生产环境使用。 ```python import torch from models.experimental import attempt_load device = 'cuda' if torch.cuda.is_available() else 'cpu' model = attempt_load('path/to/best.pt', map_location=device) # 加载.pth或.torch格式的最佳权重路径 dummy_input = torch.randn(1, 3, 640, 640).to(device) torch.onnx.export( model, dummy_input, "best.onnx", opset_version=11, do_constant_folding=True, input_names=['input'], output_names=['output'] ) ``` 这段Python脚本展示了如何将保存好的`.pt`格式的YOLOv5模型转储为`.onnx`文件形式,从而便于后续通过TensorRT加载和加速推理性能。 #### 使用TensorRT进行推理 最后一步就是编写简单的C++或者Python应用程序调用TensorRT API来进行图像识别任务。具体实现细节取决于个人需求和技术栈偏好;然而,大多数情况下只需要修改少量参数即可适配不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值