背景

双目里比较优秀的很多模型都有用到torch的grid_sample,但是其在TensorRT中没有接口。虽说4D的有替代方案,但是还是有性能损失。并且我最近测试了BGNET,感觉在实时方案中是最可靠的,在抖动中不会大量误匹配,但是其有双边滤波是升维的,变成了5D的grid_sample,让人头大。替代写法网上都没有,我自己照着实现了一下,结果是一致的,但是时间直接翻一倍,我人裂开,onnx部署时间和torch原来跑的时间一致就很难受。思来想去还是试试能不能怼个接口上去。

测试平台

Jetson Xavier NX

前情

经过一些复杂尝试,首先试了下torch2trt,感觉细节上容易对不上他的接口要求,要排查的太多了,放弃。
觉得在NX上编译源码TensorRT源码还是不太合适,在一顿搜索尝试之后确定了以下方案。

参考

  1. 他人github教程
  2. 英伟达官方说明
  3. github开源的TensorRT接口
  4. NVIDIA的trtexec文件夹

过程

  1. 首先将onnx内不支持的接口注册再导出,注册代码是复制的这里,注意要改算子名字的话就改我标的地方。
import torch
from my_model import my_model import typing
from torch.onnx import symbolic_helper_OPSET_VERSION = 11
_registered_ops: typing.AbstractSet[str] = set()def _reg(symbolic_fn: typing.Callable):name = "::%s" % symbolic_fn.__name__torch.onnx.register_custom_op_symbolic(name, symbolic_fn, _OPSET_VERSION)_registered_ops.add(name)def register():"""Register ONNX Runtime's built-in contrib ops.Should be run before torch.onnx.export()."""def grid_sampler(g, input, grid, mode, padding_mode, align_corners):# mode#   'bilinear'      : onnx::Constant[value={0}]#   'nearest'       : onnx::Constant[value={1}]#   'bicubic'       : onnx::Constant[value={2}]# padding_mode#   'zeros'         : onnx::Constant[value={0}]#   'border'        : onnx::Constant[value={1}]#   'reflection'    : onnx::Constant[value={2}]mode = symbolic_helper._maybe_get_const(mode, "i")padding_mode = symbolic_helper._maybe_get_const(padding_mode, "i")mode_str = ["bilinear", "nearest", "bicubic"][mode]padding_mode_str = ["zeros", "border", "reflection"][padding_mode]align_corners = int(symbolic_helper._maybe_get_const(align_corners, "b"))# From opset v13 onward, the output shape can be specified with# (N, C, H, W) (N, H_out, W_out, 2) => (N, C, H_out, W_out)# input_shape = input.type().sizes()# gird_shape = grid.type().sizes()# output_shape = input_shape[:2] + gird_shape[1:3]# g.op(...).setType(input.type().with_sizes(output_shape))return g.op(## op name, modify here. not sure whether "com.microsoft::" is required"com.microsoft::GridSamplePluginDynamic",  input,grid,mode_s=mode_str,padding_mode_s=padding_mode_str,align_corners_i=align_corners,)_reg(grid_sampler)@torch.no_grad()
def convert():register()# set cpudevice = "cuda"model = my_model (88, 'models.pth').to(device)model.eval()t1 = torch.rand(1, 1, 384, 640).to(device)t2 = torch.rand(1, 1, 384, 640).to(device)# Export the modeltorch.onnx.export(model,(t1, t2),'model.onnx',   # where to save the model (can be a file or file-like object)export_params=True,        # store the trained parameter weights inside the model fileopset_version=11,          # the ONNX version to export the model todo_constant_folding=True,  # whether to execute constant folding for optimizationinput_names = ['left', 'right'],   # the model's input namesoutput_names = ['output'])if __name__ == "__main__":convert()

因为我要使用的grid_sample是5D的,就算用最新的onnx导出也不支持,所以我还是用老版本的onnx导出。4D的我不知道直接用高版本导出会有啥问题哈。之后有机会试试CREStereo的。

  1. 随手用下onnx-simplifier,有可能可以消除一些if节点避免tensorrt报一些错
python3 -m onnxsim model.onnx model_sim.onnx
  1. 从这里下载开源的接口(mmcv也有,我感觉也可以找那边的用),我个人就用到grid_sample所以把其他都删了。删完之后这两个地方改一下。

    按照他的markdown编译好之后就可以了。生成的库文件在build/lib里面,长这样
  2. 随后使用trtexec转换模型文件,链接上接口:
/usr/src/tensorrt/bin/trtexec --onnx=model.onnx --saveEngine=model.trt --fp16 \
--plugins=/home/ubuntu/Documents/amirstan_plugin/build/lib/libamirstan_plugin.so

这里我一开始的时候链接上但是接口还是对不上,改接口工程里面的名字好像没变换,想了想算了把onnx模型里面算子type改成GridSamplePluginDynamic了。

  1. 随后在自己之前工程上随手链上工程文件用c++跑一遍效果。
    一开始尝试在CMakeLists里面直接链上,然后发现没有效果。但是trtexec是可以的呀,所以我瞅了眼trtexec的源码,他用的是dlopen函数,我也跟着用了。
#include <dlfcn.h>......string dll_path = "/home/ubuntu/Documents/amirstan_plugin/build/lib/libamirstan_plugin.so";void *handle = dlopen(dll_path.c_str(), RTLD_LAZY);if (NULL == handle){printf("dlopen error. msg:%s", dlerror());return -1;}......

同时在CMakeLists里面写上

target_link_libraries(main ${CMAKE_DL_LIBS} )
  1. 然后编译跑图,效果不太方便展示,看上去是和之前自己用别的方法实现的grid_sample是一样的。原先用别的方法实现的grid_sample跑模型大概12帧,现在17帧,提升明显。完事儿~

补充

python实现个人感觉可以参考这里,使用ctypes.CDLL(plugin_lib)来链接上库,其他一致。不确定哈,还没试过。

【个人记录】torch转onnx对上TensorRT的grid_sample接口(4D/5D)进行加速相关推荐

  1. tensorrt,mmclas中的onnx转tensorrt

    NVIDIA TensorRT | NVIDIA Developerhttps://developer.nvidia.cn/zh-cn/tensorrtTensorRT详细入门指北,如果你还不了解Te ...

  2. 1、pth转onnx模型、onnx转tensorrt模型、python中使用tensorrt进行加速推理(全网最全,不信你打我)

    本文向所有亲们介绍在python当中配置tensorrt环境.使用tensorrt环境进行推理的教程,主要分为两大部分,第一部分环境配置,第二部分前向推理. 第一部分 环境配置 第一步:检查你的系统类 ...

  3. pytorch模型转ONNX转TensorRT,模型转换和推理部署

    一.pth模型转ONNX import os import sys import torch import numpy as npfrom feat.model import ResNet # 导入自 ...

  4. 用于ONNX的TensorRT后端

    用于ONNX的TensorRT后端 解析ONNX模型以使用TensorRT执行. 另请参阅TensorRT文档. 有关最近更改的列表,请参见changelog. 支持的TensorRT版本 Maste ...

  5. onnx 测试_用于ONNX的TensorRT后端

    用于ONNX的TensorRT后端 解析ONNX模型以使用TensorRT执行. 另请参阅TensorRT文档. 有关最近更改的列表,请参见changelog. 支持的TensorRT版本 Maste ...

  6. onnx转tensorrt 实战干货总结

    目录 查看tensorrt版本: input: dynamic input is missing dimensions in profile onnx转tensorrt方法 安装tensorrt: o ...

  7. torch转onnx模型

    torch转onnx模型 一.前言 onnx是开放神经网络交换格式,用于不同框架之间的迁移,推理方面比原生的torch快很多.本文以MobilenetV3做分类任务为例,实现模型转换. 二.使用步骤 ...

  8. onnx 测试_pytorch onnx onnxruntime tensorrt踩坑 各种问题

    做了一个小测试,发现pytorch onnx tensorrt三个库的版本存在微妙的联系,在我之前的错误实验中,PyTorch==1.3.0/1.4.0:Onnx==1.6.0:tensorrt=7. ...

  9. 较为详细的记录总结TensorRT的python接口的使用,环境配置,模型转换和静态动态模型推理

    先来一段摘抄自网上的TensorRT介绍: TensorRT是英伟达针对自家平台做的加速包,TensorRT主要做了这么两件事情,来提升模型的运行速度. TensorRT支持INT8和FP16的计算. ...

最新文章

  1. Eclipse和intellij idea 快捷键对比
  2. Kafka0.10.2.0分布式集群安装
  3. hadoop过程中遇到的错误与解决方法
  4. 用nodejs xml2js读取xml文件
  5. ubuntu mysql5.7配置_ubuntu系统mysql5.7忘记/设置root的坑
  6. Linux下的C++ socket编程实例
  7. 简单而常用的shell 命令
  8. 【java】swing窗口中的JOptionPane类及字符串转其他数据类型的应用
  9. angular路由模块(二)
  10. Android Studio 2.3报错: Error:Cause: buildToolsVersion is not specified解决
  11. 应考虑字节顺序(大小端问题)的几种情况
  12. 单片机 STM32 HAL IO扩展 74HC595 例子代码
  13. PHPWAMP自定义添加PHP版本教程,支持无限添加PHP和Mysql版本
  14. opengl 库函数 glew glfw glad glut gl glu freeglut
  15. 魔窗mLink发布2019收费标准,20W年费是物有所值?还是重度收费?
  16. Java 使用 POI 3.17根据Word 模板替换、操作书签
  17. 认知升级是比其他一切技能都更为重要的思维模式转变
  18. 全球及中国燃气轮机行业产量规模预测及发展态势研究报告2021-2027年版
  19. 学会Python好找工作吗?这就告诉你答案
  20. 头歌实训项目【复读机的毁灭】

热门文章

  1. 2022-02-15
  2. 057_Skeleton骨架屏
  3. 一例较成功的国产PHP问卷调查系统
  4. 【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。...
  5. 机器学习——凸优化基础知识
  6. win7下将rtt1.2.0移植到4088开发板上
  7. PS初学——基本图像模式与调整(二)
  8. 阿里云国际版CDN-阿里云CDN是什么?阿里云折扣怎么买
  9. 配电房轨道式智能巡视机器人_HT-TSX-600-配电房轨道机器人视频巡检系统
  10. 劳合社和伦敦市场保险公司携手DXC Technology推动世界首屈一指的保险市场转型