在一个新的环境安装tensorrt8.6.1,并将编译中的一些错误总结,避免以后踩坑。
安装tensorrt8.6.1
根据环境选择对应的版本,主要看cuda、ubuntu、cudnn和架构。如果不需要python调用,直接下deb包。(我目前用python调用的还没下成功过)其中deb包的不好的点在于直接写入系统路径,不利于移植,这个点待以后学习。
下载地址
官方文档
安装过程中cuda如果缺少一些依赖库,类似于cuda-xxxx but it is not installed
,在一下网站中寻找相关版本包并安装,基本linux系统下的都能找到。
debian库
若编译不成功记得及时加入环境变量,我这里是linux环境:
LD_LIBRARY_PATH=/xx/TensorRT-xxx/lib:$LD_LIBRARY_PATH
安装好后用指令检查:
dpkg -l | grep TensorRT
在cmakelists中可以进行tensorrt版本的指定,基本上编译就没什么问题了。
find_library(TENSORRT_LIBRARY nvinfer HINTS "/usr/local/lib/")[tensorrt lib.so path]
target_link_libraries(${MOUDLE_NAME} ${TENSORRT_LIBRARY} )
编译文件
新环境为:
cuda 11.8
ubuntu 22.4
cuda toolkit 11.5
tensorrt 8.6.1
- 由于升级了cuda、cudnn等,在编译过程中也遇到了些许问题。首先就是narrowing conversion报错,由于在include 文件中设置的数据类型是unsigned int,所以会有范围报错。如果确定不报错,就在cmakelists中设定忽略该类型错误:
# 添加编译选项
add_compile_options(
"$<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:-Wno-narrowing>"
"$<$<C_COMPILER_ID:GNU,Clang,AppleClang>:-Wno-narrowing>"
)
- 升级了cuda toolkit,之前进行图像预处理的库nppicom被弃用了(最起码在当前版本被弃用),可用
NVJPEG
库代替,在cmakelists中修改为target_link_libraries(${MOUDLE_NAME} nvjpeg)
即可。 - 之前版本的log在新环境中报错
looser exception specification on overriding virtual function
。这个问题意味着在派生类中重写了一个基类的虚拟函数,但是在异常规格上与基类中的声明不兼容。若原始代码为:
class Logger : public nvinfer1::ILogger {
public:
void log(Severity severity, const char* msg) override; // 检查是否有异常规格
};
可改为:
class Logger : public nvinfer1::ILogger {
public:
void log(Severity severity, const char* msg) noexcept override; // 添加 noexcept
};
- 遇到tensorrt api调用错误:
Destroying a runtime before destroying deserialized engines created by the runtime leads to undefined behavior.
这意味着在销毁用于执行推理的运行时(runtime)对象之前,需要先销毁所有由该运行时创建或管理的反序列化引擎(engine)。但是我这里是写在不同的类中了,nvida官方说是可正确转换engine,可忽略。issue - 剩余部分是将swin transformer由onnx转为engine中的踩坑与总结。update:swin transformerv2