pytorch模型转tensorrt,pad报错

记一次奇葩经历

问题

在convert_to_onnx_and_check_trt时报错

报错信息:

[09/07/2023-20:50:46] [TRT] [E] [shuffleNode.cpp::symbolicExecute::392] Error Code 4: Internal Error (Reshape_276: IShuffleLayer applied to shape tensor must have 0 or 1 reshape dimensions: dimensions were [-1,2])
2023-09-07 20:50:46,481 - trt_inference - ERROR - >>> ERROR: Failed to parse the ONNX file.
[ERROR] [09/07/2023 08:50:46 PM trt_onnx_inference_engine.py:0149] >>> ERROR: Failed to parse the ONNX file.
2023-09-07 20:50:46,481 - trt_inference - ERROR - >>> ERROR: In node 286 (parseGraph): INVALID_NODE: Invalid Node - Pad_286
[shuffleNode.cpp::symbolicExecute::392] Error Code 4: Internal Error (Reshape_276: IShuffleLayer applied to shape tensor must have 0 or 1 reshape dimensions: dimensions were [-1,2])
[ERROR] [09/07/2023 08:50:46 PM trt_onnx_inference_engine.py:0151] >>> ERROR: In node 286 (parseGraph): INVALID_NODE

### 将Pytorch模型换为TensorRT 为了将Pytorch模型换为TensorRT以提升推理性能,通常有两种主要路径:一种是通过`torch2trt`库直接实现换;另一种则是先将Pytorch模型导出至ONNX格式再TensorRT引擎。 #### 使用 `torch2trt` 库进行换 对于较为简单的网络结构可以直接利用`torch2trt`来完成这一过程。下面是一个具体的实例展示如何操作: ```python import torch from torch2trt import torch2trt from torchvision.models.resnet import resnet18 # 更改为你自己的模型定义 # 加载预训练的ResNet-18模型作为示范 model = resnet18(pretrained=True).eval().cuda() # 创建输入张量用于推断和校准 x = torch.ones((1, 3, 224, 224)).cuda() # 模型TensorRT优化后的版本 model_trt = torch2trt(model, [x]) # 测试原始模型与TRT优化后模型之间的差异 y = model(x) y_trt = model_trt(x) print('最大绝对误差:', torch.max(torch.abs(y - y_trt))) ``` 这段代码展示了加载一个预先训练好的ResNet-18模型,并将其换成适用于GPU上的TensorRT优化版[^1]。 #### 经由 ONNX 中间表示法过渡 当面对更复杂的架构或是自定义层时,则推荐采用两步走的方式——即先将Pytorch模型保存为ONNX文件,之后借助NVIDIA提供的工具集进一步编译成为TensorRT引擎。以下是简化流程说明: 1. **准备环境** 需要确保已经安装好相应的依赖项,比如`onnx`, `onnxruntime-gpu`以及`tensorrt`等软件包。如果遇到下载速度慢的问题,建议切换为中国大陆地区的镜像源加快获取进度[^2]。 2. **导出为ONNX格式** 利用`torch.onnx.export()`函数可轻松地把现有的Pytorch模块序列化为兼容于其他框架的形式。 ```python dummy_input = torch.randn(1, 3, 224, 224).to(device='cuda') torch.onnx.export( model, args=(dummy_input,), f="resnet18.onnx", export_params=True, opset_version=10, do_constant_folding=True, input_names=['input'], output_names=['output'] ) ``` 3. **构建TensorRT引擎** 接下来就是运用官方文档里提到的方法读取刚才生成的`.onnx`文件并创建对应的执行计划了。这部分涉及到C++ API或者Python bindings的具体调用细节,在此不再赘述,请参照[NVIDIA TensorRT开发者指南](https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html)学习更多相关内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值