【施工中】torch2trt 学习笔记

前言

偶然发现了 torch2trt 的模型转换方案,思路是直接将pytorch op映射到TensorRT的python api. 在pytorch进行每个op forward的时候,tensorrt也相应往network上添加op. 这里会先涉及torch2trt的使用,后面会补充这个转换工具的代码学习

使用torch2trt

torch2trt pytorch可以直接安装,但是torchvision根据 pytorch-for-jetson-version-1-6-0-now-available 中的说法,需要编译安装

1git clone  https://github.com/pytorch/vision 

然后切换到tag v0.7.0 执行

1sudo python3 setup.py  install 

可以正常安装

然后报错: ModuleNotFoundError: No module named 'termcolor'

尝试 sudo apt install python3-termcolor 后解决

接下来尝试trt samples中的 /python/network_api_pytorch_mnist 发现安装pycuda报错找不到cuda.h的头文件 参考 pycuda installation failure on jetson nano 执行了如下命令后成功:

1export LIBRARY_PATH=/usr/local/cuda/targets/aarch64-linux/lib/:$LIBRARY_PATH
2export CPATH=/usr/local/cuda/include:$CPATH 
3

然后尝试使用TensorRT python api对一个engine file 做inference的时候,报错: pycuda._driver.LogicError: explicit_context_dependent failed: invalid device context - no currently active context? 在 import pycuda.autoinit 后解决

然后在尝试修改inference的input时报错: pycuda._driver.LogicError: cuMemcpyHtoDAsync failed: invalid argument 参考pycuda._driver.LogicError: cuMemcpyHtoDAsync failed: invalid argument 发现原因是numpy的类型不太对,修改为:

1 inputs[0].host = inp.astype(np.float32)

就可以了

接下来是在plan文件前面加签名 一开始用了numpy.tobytes() 。。发现每个字符占了4byte..与c++的caffe-tensorrt行为不一致 后来尝试 c = bytes(header,'utf-8') + model_data 问题似乎解决

torch2trt源码分析