pytorch经onnx使用TensorRT部署转换踩坑记录

转自:https://blog.csdn.net/baidu_33738335/article/details/111319349  侵删

老版本踩坑
1. Pytorch模型中不能有条件支路

因为Pytorch模型转onnx模型的过程中,需要传给模型一个假的输入,然后做一次前向传播,再根据前向传播的结果来做模型的转换
2. Pytorch中的某些操作在TensorRT中不支持

x = x.view(x.size(0), -1)不支持,换成x = x.flatten(1)
torch.unsqueeze(x[:, 0], 1)不支持,需要去掉
动态size是不支持的,比如h = x.size()[2],改成具体数值
3. Pytorch中的多卡操作更改了模型名字,转换模型的时候没有导入权重

4. TensortRT找不到ERROR: builtin_op_importers.cpp:727 In function importCast:
取消gpu转模型,用cpu转换可以解决

5.转换注意
Pytorch转libtorch的pt模型,注意加上语句model.eval(),防止后向传播
6. interpolate转onnx

pytorch1.1 没问题,tensorrt端使用6也没问题
b1= interpolate(b1, size=(h, w), mode=“nearest”, align_corners=False)

pytorch1.3转换,Assertion failed:
ctx->tensors().count(inputName),转换模型时换用pip install onnx==1.4.0 with
pytorch 1.3.1,该错误消失

pytorch1.3转换,发现upsample层会多一个constant,转换成功,但是tensorrt端Assertion failed: (nbDims >= 1) && (nbDims <=3)报错,是由于不支持F.interpolate的双线性模式,改为b1= interpolate(b1, size=(h, w),mode=“nearest”)可以工作,但是图片处理结果会影响使用。

上采样转换出错的解答帖 https://github.com/NVIDIA/TensorRT/issues/284

7 莫名问题,可以跑但是序列化存不了
是一些奇怪的问题,有的层可能不支持,然后还没报错,一一排除法

具体算法转换踩坑
按照上述的换了插值,双线性换为nearest

opset_version 11,pytorch1.3有Assertion failed: ctx->tensors().count(inputName)
pytorch1.1失败,有constant不支持
pytorch1.5可以转换,但是报错
opset_version=10,pytorch1.3转换后While parsing node number 303 [Resize]:Assertion failed: scales.is_weights() && “Resize scales must be an initializer!”
在上一步基础上把插值全部展开,写为常数,可以看到原来的resize节点,都变为resize 下面写着scales<4>
详细见 https://github.com/onnx/onnx-tensorrt/issues/361
单输入改为双输入,放在tensorrt里检测到两个输入,同时序列化发生冲突,使用import onnx
>>> model = onnx.load("E:\\RSVP\\model\\hdr\\hdr.onnx")
>>> onnx.checker.check_model(model)

发现pytorch1.3转换的模型报错ValidationError: Node () has input size 5 not in range [min=1, max=1].改换pytorch1.5,同样测试onnxchecker没有报错,尝试pytorch1.5转换

å¨è¿éæå¥å¾çæè¿°
Assertion failed: scales.is_weights() && “Resize scales must be an initializer!”

å¨è¿éæå¥å¾çæè¿°

**

tensorrt升级
**
上述环境都是TensorRT6版本,后面升级为7.0
升级到tensorrt7,api区别在于

const auto explicitBatch = 1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH);
auto network = SampleUniquePtr<nvinfer1::INetworkDefinition>(builder->createNetworkV2(explicitBatch));
//auto network SampleUniquePtr<nvinfer1::INetworkDefinition>(builder->createNetwork());

目测TensorRT7配置pytorch>1.5版本,目前错误还较少
再也不想这样转模型了,心好累-。-,后面学习一下自定义模型吧,还是这样方便。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一个深度学习框架,可以用来构建神经网络模型。ONNX是一种开放的神经网络交换格式,可以将不同框架的模型转换为统一的格式。TensorRT是NVIDIA推出的用于加速深度学习推理的库,可以将模型转换为高效的C++代码。因此,将PyTorch模型转换ONNX格式,再将ONNX模型转换TensorRT格式,可以提高模型的推理速度和效率。 ### 回答2: Pytorch是一款非常流行的深度学习框架之一,而ONNX(Open Neural Network Exchange)则是一种用于在不同深度学习框架之间交换模型的标准格式。TensorRT是基于NVIDIA GPU优化的深度学习推理引擎,可以加速深度学习模型的预测速度。PytorchONNXTensorRT的过程主要包括以下几个步骤: 第一步,使用Pytorch训练好的模型可以通过Pytorch提供的方法将模型转化为ONNX格式的模型。这一步通常需要在节省内存的情况下,对训练的模型进行优化并减少其大小。Pytorch提供了一些方法,例如ONNX的exporter,可以在不损失精度的情况下将Pytorch模型转换ONNX格式。 第二步,将ONNX模型转换TensorRT格式的模型。这一步通常需要使用TensorRT提供的工具将ONNX格式的模型转换为可以使用TensorRT来加速推理的格式。TensorRT可以根据模型的结构,对其进行优化,从而提高推理的速度和效率。 第三步,使用TensorRT引擎来进行推理。在这一步中,可以使用一些Python或C++的API来调用TensorRT引擎,以加速推理的过程。通常情况下,TensorRT会在NVIDIA GPU上运行,以提高推理的速度和效率。 总之,PytorchONNXTensorRT是一种很常见的深度学习模型加速优化的方法。通过这种方法,可以将训练好的模型转化为可以快速进行推理的格式,并提高推理的速度和效率,从而更好的满足实际应用需求。同时也可以加深对于PytorchONNXTensorRT的理解和应用。 ### 回答3: 先介绍一下三个工具的概念。 PyTorch是一个基于Python的库,提供了高度可拓展性和可定制化的机器学习算法、模型和数据处理工具,特别适合用于深度学习ONNX(Open Neural Network Exchange)是一个开放的模型表示和转换工具,使得不同框架之间的模型转换和协作更加容易。ONNX 可以将每个框架的模型表示转换为通用表示格式,这样就可以一次性完成跨框架的模型部署TensorRT是NVIDIA推出的高性能深度学习推理库,可以对训练好的深度学习模型进行优化,并在NVIDIA GPU上加速模型的推理过程。使用TensorRT能够提升模型的运行速度和效率。 下面是如何将PyTorch模型转为TensorRT模型的过程: 1.将PyTorch模型转化为ONNX格式。有两种方法可以实现这一步骤:一种是使用PyTorch官方提供的torch.onnx.export方法,将PyTorch模型转化为ONNX格式;另一种方法是使用ONNX官方提供的onnx-coreml转换工具。 2.使用TensorRT提供的工具trtexec将ONNX模型转化为TensorRT格式。通过命令行的方式调用trtexec,在将模型转换TensorRT格式的同时,可以指定一些优化参数,比如设置合适的batch size、设置推理设备的数据类型、设置最大批处理等参数,以提高模型的性能和效率。 3.将转换后的模型导入到TensorRT库中,使用C++或Python等支持TensorRT的代码进行推理。 总体而言,PyTorchONNXONNXTensorRT这一过程需要先对PyTorch模型进行格式转化,再将ONNX格式的模型转转化为TensorRT格式,最终通过TensorRT库对模型进行推理。需要注意的是,不同的深度学习模型在转换过程中有着各自的特点和难点,需要根据具体情况进行优化和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值