关于pytorch模型转tensorrt模型遇到的问题

在将使用UNet模型的DCM组织钙化检测系统从PyTorch模型转为ONNX并进一步部署到嵌入式设备的TRT中时,遇到精度下降的问题。经过排查,发现在不同环境中转换的ONNX模型存在精度差异。初步怀疑是由于PyTorch版本差异(1.4.0 vs 1.9.0)导致的精度损失,因为1.9.0可能在转换时保留了更多精度。下一步计划验证这个假设。

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

实现一个对于dcm格式的人体切下来的组织就行钙化点检测。我采用了unet分割算法,期间pth模型训练已经到达了一定精度。准备部署到嵌入设备上。期间遇到一个印象深刻的坑,pth转onnx转trt。用trt跑的时候精度变低了。试了trtexec的命令进行各种参数设置并没有改观该现象。在onnx转trt过程中查了很多资料也辗转了很久以为是onnx转换过程出现了问题。后来无意一次心血来潮想试一下onnx的本身精度。发现onnx的精度也有问题,那么问题原来处在onnx上。问题解决的也挺奇特的,本来onnx是放在baiduaistudio环境下转的onnx版本也是1.10.1的,转换下来有误差。后来在自己电脑上转了竟然发现之前明显的误差没有了这就很奇怪,我的onnx版本也是一样的哈。这就很奇怪。那么问题处在哪里呢,个人感觉问题处在torch版本上,baiduaistudio的torch版本是1.4.0而我的电脑版本是1.9.0的,但是我训练环境又是1.4.0的版本这就有点诡异了。

可能原因是1.4.0还没有混合精度概念,而1.9.0转onnx的时候载入模型参数后进入eval模式应该转onnx时候能够保存了更多的精度。这是我的猜想,后面还要验证下

### 将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]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值