libtorch,TenSorRt跨平台编译一二

1. windows软件配置

CUDA,CUDNN,libtorch,opencv,CMake
笔者使用:cuda10.1, cudnn7.6.5, libtorch 1.4.0(cuda10.1)
注意:libtorch版本>1.3.0时,需要支持c++14的编译器编译

2. 输入

模型pt文件(模型文件需要转化,pt->wts),linux下的cmakelist工程文件
详情见yolov3工程
1) 安装Anaconda
2) 创建虚拟空间
	`conda create -n env_name python=X.X`
3) 激活虚拟环境
	`activate env_name`

可能存在的错误:
CondaHTTPError: HTTP 000 CONNECTION FAILED for url 

3. cuda下载

cuda下载地址
选择10.1版本 ,傻瓜式安装

4. libtorch下载

windows-cuda版下载,修改cu版本和torch版本即可下载相应的libtorch版本。
在win10下的运算速度比linux下慢,后弃用,改为TensorRT.

5. 安装TensorRT

下载地址,选择TensorRT 7.0 For Windows 下

4. cudnn安装

cudnn下载地址
选择与操作系统版本和cuda版本一致的(需要注册)。
cudnn下载之后不用安装,解压即可。
下载解压缩后,将其文件夹下cndnn64_7.dll cudnn.h cudnn.lib分别复制到
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\lib\x64

4. 跨平台编译

1)	编写CMakeLists文件,配置cuda toolkit目录,cuda compile目录,torch目录
if(MSVC)
		#msvc下配置
else()	
		#其它平台下配置
endif(MSVC)
2)	cmake编译,生成vs工程
	cd build文件夹
	(vs2015)

cmake -DCMAKE_PREFIX_PATH=D:/soft/opencv/build/x64/vc14/lib;D:/soft/libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" ..

(vs2019)  注意:cudnn中相关文件拷贝文件到cuda中 

cmake -DCMAKE_PREFIX_PATH=D:/soft/opencv/build/x64/vc15/lib;D:/soft/libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 16 2019" ..

3) 在VS工程中重新生成项目
**注意**:
a)	对于生成动态库项目,找到头文件,确保添加了API输出口“__declspec(dllexport)”
b)	cuda显卡序号选择需要斟酌,建议优先使用0,笔者在双显卡上使用1后无法完成网络推理工作
c)	torch::Tensor数据类型转化不支持long类型:eg: int *poutput_max_idxes = max_idxes_int.data();
d)	推理完成后的输出结果需要拷贝到cpu上执行 (.to(torch:kCPU))

5. 跨平台宏定义

#if (defined _WIN32 || defined _WIN64)
#ifdef PointDetector_EXPORTS
		#define PointDetector_EXPORTS __declspec(dllexport)
	#else
		#define PointDetector_EXPORTS __declspec(dllimport)
	#endif

#else 
	#ifdef __linux__
		#define PointDetector_EXPORTS
	#endif
#endif

6. 重新编译opencv(cuda版)

libtorch1.4 + vs2015 + cuda10.1
  1. 环境和资源准备
    – 计算机必须有支持CUDA 的NVIDIA GPU,并且装好了驱动程序。
    安装CUDA toolkit,本文使用的是CUDA10.1。下载地址;
    – 下载opencv-4.3.0,下载地址,选择 source源码;
    – 下载opencv-contirb-3.4.2,下载地址下载3.4.2的zip文件;
    – 下载Eigen ,Eigen是用来库优化矩阵的计算的。下载地址;下载最近的稳定版本即可,这里使用的是eigen-3.3.6。或者选择源码进行编译,编译过程见下文。
    – 下载tbb,Intel TBB是用来优化OpenCV库函数的多核计算性能的。下载地址;我下载的是tbb2018_20180312oss_win.zip。或者选择源码进行编译,编译过程见下文。
    – 下载cmake-3.17.1-win64-x64.msi安装,下载地址

  2. cmake工程配置
    – 打开CMAKE,输入OpenCV的sources路径,以及将要编译的结果路径(自主创建一个文件夹),勾选择Grouped选项和Advanced选项。
    – 选择编译器:选择Studio 2013 Win64,默认Use defualt native complers。
    – WITH栏配置:选中WITH_CUDA,WITH_CUBLAS,从而可以使用cuBLAS,选中WITH_EIGN,WITH_TBB。
    – 点击Configure,添加目录:
    OPENCV_EXTRRA_MODULES_PATH: ~/opencv_contrib-3.4.2/modules
    EIGEN_INCLUDE_PATH:~/ eigen-eigen-b70bf4fad467
    TBB_ENV_INCLUDE: ~/tbb2018_20180312oss/include
    TBB_ENV_LIB: ~/Library/tbb2018_20180312oss/lib/intel64/vc12/tbb.lib
    TBB_ENV_LIB_DEBUG: ~/Library/tbb2018_20180312oss/lib/intel64/vc12/tbb_debug.lib
    TBB_VER_FILE: ~/Library/tbb2018_20180312oss/include/tbb/tbb_stddef.h
    注意已上的“~”都要落实到自己的文件目录下,根据解压的位置选择
    – 点击Configure,如果还出现红色提示,再点击configure就行,直到没有红色的警告出现为止。
    – 点击Generate,CMake就完成了

    亦可通过编辑opencv编译脚本设置相关参数(TBB(静态库)和eigne(仅头文件)需要重新编译)

    :: 删除文件
    del /f /s /q .\build\*.*
    :: 删除文件夹
    rd /s /q build
    :: 新建文件夹
    md build
    cd build
    ::cmake  -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" -DTIME_LOG=ON ..
    
    cmake -DOPENCV_EXTRA_MODULES_PATH="D:/tools/opencv_contrib/modules" ^
    -DWITH_CUDA=ON -DWITH_CUBLAS=ON ^
    -DWITH_EIGNE=ON -DEIGEN_INCLUDE_PATH="C:/Library/eigen3.4.0" ^
    -DWITH_TBB=ON -DTBB_ENV_INCLUDE="C:/Library/tbb12/include" -DTBB_ENV_LIB="C:/Library/tbb12/lib" ^
    -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -G "Visual Studio 14 Win64" ..
    

    eigen编译脚本

    :: 删除文件
    del /f /s /q .\build\*.*
    :: 删除文件夹
    rd /s /q build
    :: 新建文件夹
    md build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX="C:/Library/eigen3.4.0" ..
    

    TBB编译脚本

    :: 删除文件
    del /f /s /q .\build\*.*
    :: 删除文件夹
    rd /s /q build
    :: 新建文件夹
    md build
    cd build
    cmake  -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 16" -DTIME_LOG=ON ..
    
  3. VS2015编译
    1、用Vs2015打开OpenCV.sln,等待项目加载就绪完成。
    2、点击菜单栏中的生成,批生成。
    3、选中ALL_BUILD中debug和release两个选框,以及INSTALL中的debug和release两个选框,一次性生成debug和release版本,省的debug和release两个版本分开编译。
    4、等待编译完成,编译需要花费大量时间,看个人配置,一般4-8小时之间,完成之后在build路径下面会有install文件夹,在x64/vc14下有需要的动态库,在include文件夹下有所有的头文件。

  4. CMake编译出错处理:
    在进行Cmake配置OpenCV时出现以下问题的解决办法:

    1. IPPICV:Download:ippicv_2020_Win_ia32_20191018_general.zip下载失败
      – 进入opencv4.3.0\sources\3rdparty\ippicv目录,将 ippicv.cmake 第42行的 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"
      修改为:
      "https://raw.staticdn.net/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
    2. ** opencv_videoio_ffmpeg_64.dll、opencv_videoio_ffmpeg.dll下载失败**
      – 进入opencv4.3.0\sources\3rdparty\ffmpeg目录,将 ffmpeg.cmake 第25行的 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/"
      修改为:
      "https://raw.staticdn.net/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/"
    3. boostdesc_bgm.i相关文件下载失败
      – 进入opencv_contrib-4.3.0\modules\xfeatures2d\cmake目录
      将 download_boostdesc.cmake中的https://raw.githubusercontent.com/…
      修改为
      https://raw.staticdn.net/…
    4. vgg_generated_120.i相关文件下载失败
      – 进入opencv_contrib-4.3.0\modules\xfeatures2d\cmake目录
      将 download_vgg.cmake中的https://raw.githubusercontent.com/…
      修改为https://raw.staticdn.net/…
    5. face_landmark_model.dat下载失败
      – 进入\opencv_contrib\modules\face\CMakeLists.txt,将https://raw.githubusercontent.com/… 修改为:https://raw.staticdn.net/…
    6. 编译速度慢
      – 每个架构都编译了
      – 解决方案:指定cuda编译架构版本cmake -D CUDA_ARCH_BIN=6.1
      gpu架构版本查询

7. 常见错误

  1. nvcc fatal : unknown option ‘openmp’
    – Move all nvcc flags to Xcompiler like this -Xcompiler=“/EHsc -Ob2 /Z7 /EHa /wd4267 /wd4251 /wd4522 /wd4838 /wd4305 /wd4244 /wd4190 /wd4101 /wd4996 /wd4275 /bigobj /openmp”
    – change -openmp to /openmp"

  2. C:\Library\libtorch\include\torch/csrc/jit/script/module.h(479):error:member “torch::jit::script::detail::ParameterPolicy::all_slots” may not be initialized
    – 将model.h和argument_spec.h文件中constexpr->const

  3. fatal error C1041: 无法打开程序数据库“D:\cp03\inferengine\inferengine\build\src\infer\TorchInferEngine.dir\Release\vc142.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS
    – 属性->C/C+±>命令行-> /FS
    – 属性->CUDA C/C+±>Host -> Additional Compiler Options->/FS

  4. forward()出错,std::runtime_error
    – libtorch中的所有动态库都要拷贝

  5. **cv_bgr2gray未定义 **
    – #include

  6. 从“double”转换到“_Tp”需要收缩转换
    – 强转(int)

  7. **cv::resize函数不接受七个参数 **
    #include
    #include

  8. ** 未声明变量,跨平台编译中文不识别问题**
    – utf-8有无bom的区别 /*(空格)注释的内容 (空格)*/
    – 直接修改文件格式:文件->高级保存选项->Unicode(utf-8有bom)

  9. 多cuda编译器时,手动生成VC++自定义文件,把继承文件和dll拷贝到vs目录。例如:“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\visual_studio_integration\MSBuildExtensions”下文件拷贝到“C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations”中, 然后再在项目->属性->生成依赖项->生成自定义->先择需要使用的cuda版本。注意cuda10.0不支持vs2019

  10. Namespace std没有成员“to_string”
    – 添加头文件#include

你可能感兴趣的:(跨平台,linux,C++,opencv,python,人工智能)