Qtcreator部署libtorch+Qt6.6.3
Qtcreator部署libtorch+Qt6.6.3
最近在高版本Qt部署libtorch时踩了很多坑,开贴记录一下
cuda选择
首先cuda的版本非常重要,决定后面工具链的版本选择
nvidia-smi
查看自己GPU可以选择的最高版本cuda
进入torch官网查看选择合适的cuda
torch官网链接
语言要选到c++/java
下一行就是支持的cuda版本,选择适合你自己的版本,推荐11.8问题较少
接下来就是安装cuda和cudnn,安装教程很多不再赘述
libtorch的安装
同样到torch官网,选择刚才安装的cuda版本对应的libtorch
Run this command一行官方链接点击即可下载
下载完解压到本地,最好将/bin和/lib两个目录添加到环境变量中
opencv的安装
opencv没有版本要求下载最新版即可
opencv官网
opencv\build\x64\vc16\bin
opencv\build\x64\vc16\lib
同样解压并将两个目录添加环境变量
接下来是重点,在Qt工程中导入这些工具
新建一个Qt 工程,构建系统选择Cmake
构筑套件这里一定要选择第一个MSVC ,因为windows下libtorch是基于msvc开发的
重点: cmakeList文件如下
需要修改4处地方和项目名称,将LibtorchSeg替换成你的项目名
cmake_minimum_required(VERSION 3.5)
project(LibtorchSeg VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#需要修改的地方1:GPU算力
#官方网址:https://developer.nvidia.com/cuda-gpus
#GPU算力
set(CMAKE_CUDA_ARCHITECTURES 86)
#需要修改的地方2:nvcc工具地址
#nvcc工具地址
set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1/bin/nvcc.exe")
#需要修改的地方3:cuda_toolkit路径
#设置cuda_toolkit路径
set(CUDA_TOOLKIT_ROOT_DIR "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.1")
#需要修改的地方4:libtorch路径
#添加libtorch路径到查找路径中
list(APPEND CMAKE_PREFIX_PATH "D:\\Tools\\libtorch")
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
#这里package名称不是自定义的,cmake会根据这个名称去查找文件名为TorchConfig.cmake文件生成配置
#查找libtorch
find_package(Torch REQUIRED)
#查找opencv
find_package(OpenCV REQUIRED)
set(PROJECT_SOURCES
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
)
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(LibtorchSeg
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET LibtorchSeg APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(LibtorchSeg SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(LibtorchSeg
${PROJECT_SOURCES}
)
endif()
endif()
#需要链接的库
target_link_libraries(LibtorchSeg PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(LibtorchSeg PUBLIC ${TORCH_LIBRARIES})
target_link_libraries(LibtorchSeg PUBLIC ${OpenCV_LIBS})
#添加头文件路径
target_include_directories (LibtorchSeg PUBLIC ${OpenCV_INCLUDE_DIRS})
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.LibtorchSeg)
endif()
set_target_properties(LibtorchSeg PROPERTIES
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS LibtorchSeg
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(LibtorchSeg)
endif()
以下是可能碰到的问题及解决方案
1. 遇到找不到 CUDA 的状况
D:\qt\code\LibtorchSeg\CMakeLists. Txt:17: error: Your installed Caffe 2 version uses CUDA but I cannot find the CUDA
Libraries. Please set the proper CUDA prefixes and / or install CUDA.
Call stack:
D:/qt/code/LibtorchSeg/CMakeLists. Txt: 17 (find_package)
D:/Tools/libtorch/share/cmake/Torch/TorchConfig. Cmake: 68 (find_package)
D:/Tools/libtorch/share/cmake/Caffe 2/Caffe 2 Config. Cmake: 90 (message)
打开 Caffe 2 Config. Cmake 文件定位到错误位置
if(ON)
# The file public/cuda.cmake exclusively uses CAFFE2_USE_*.
# If Caffe2 was compiled with the libraries below, they must
# be found again when including the Caffe2 target.
set(CAFFE2_USE_CUDA ON)
# Add current directory to module path so we pick up FindCUDAToolkit.cmake
set(old_CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
include("${CMAKE_CURRENT_LIST_DIR}/public/cuda.cmake")
set(CMAKE_MODULE_PATH "${old_CMAKE_MODULE_PATH}")
if(ON AND NOT CAFFE2_USE_CUDA)
message(FATAL_ERROR
"Your installed Caffe2 version uses CUDA but I cannot find the CUDA "
"libraries. Please set the proper CUDA prefixes and / or install "
"CUDA.")
endif()
endif()
这里说的通过 cuda. Cmake 进行 cuda 导入, 现在应该修改 cuda. Cmake 文件
set(old_CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
include("${CMAKE_CURRENT_LIST_DIR}/public/cuda.cmake")
set(CMAKE_MODULE_PATH "${old_CMAKE_MODULE_PATH}")
Cuda. Cmake 的第 28 到 38 行是寻找 cuda 的, 因为之前的路径不对, 所以找不到 cuda,
这里要重新设置自己电脑上 cuda 的安装路径,注意: 这里没有用双引号包裹, 需要给空格添加转义符\, 不用
双引号包裹是因为在其他 cmake 文件中是"${CUDA_TOOLKIT_ROOT_DIR}"调用的
# Find CUDA.
set(CUDA_TOOLKIT_ROOT_DIR C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v11.8)
find_package(CUDA)
if(NOT CUDA_FOUND)
message(WARNING
"Caffe2: CUDA cannot be found. Depending on whether you are building "
"Caffe2 or a Caffe2 dependent library, the next warning / error will "
"give you more info.")
set(CAFFE2_USE_CUDA OFF)
return()
endif()
2. GCC 版本和 cuda 不对应
修改完上述配置后能够找到 cuda, 但是 build 又报错
The CUDA compiler identification is unknown
这是 GCC 版本和 cuda 版本不对应,重新下载更低版本mingw或w64devkit即可
CUDA Version | Max Supported GCC Version |
---|---|
12.4, 12.5 | 13.2 |
12.1, 12.2, 12.3 | 12.2 |
12 | 12.1 |
11.4.1+, 11.5, 11.6, 11.7, 11.8 | 11 |
11.1, 11.2, 11.3, 11.4.0 | 10 |
11 | 9 |
10.1, 10.2 | 8 |
9.2, 10.0 | 7 |
9.0, 9.1 | 6 |
8 | 5.3 |
7 | 4.9 |
5.5, 6 | 4.8 |
4.2, 5 | 4.6 |
4.1 | 4.5 |
4.0 | 4.4 |
通过指令 gcc -v 查看自己的 gcc 版本, 如果不对应就要更换 |
4. 遇到 CMAKE_CUDA_ARCHITECTURES 不能为空
CMAKE_CUDA_ARCHITECTURES must be non-empty if set.
CMAKE_CUDA_ARCHITECTURES 其实是 GPU 计算能力的值, 在 nvidia 官网可以查询到
查询到后添加到 qt 项目 cmakelists.txt 中
set(CMAKE_CUDA_ARCHITECTURES 86)
5. 找不到CMAKE_CUDA_COMPILER
这个问题是找不到nvcc.exe的路径,同样设置一下路径
set(CMAKE_CUDA_COMPILER "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.8/bin/nvcc.exe")
6. CMakeCUDACompilerId.cu failed
CMakeCUDACompilerId.cu failed. Compiler: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin\nvcc.exe Build flags: Id flags: --keep;--keep-dir;tmp -v
这个问题单看简要信息并看不出什么,打开编译输出查看详细信息,发现是由于Visual Studio的版本不兼容,但是我的电脑上
Visual Studio的版本就是2022社区版,可能是超过了2017到2022的范围
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include\crt/host_config.h(153): fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
解决办法是打开C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include\crt\host_config.h
文件,修改版本号范围,改大一些_MSC_VER到2000
关键代码#if _MSC_VER < 1910 || _MSC_VER >= 2000
#if defined(_WIN32)
#if _MSC_VER < 1910 || _MSC_VER >= 2000
#error -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
#elif _MSC_VER >= 1910 && _MSC_VER < 1910
#pragma message("support for this version of Microsoft Visual Studio has been deprecated! Only the versions between 2017 and 2022 (inclusive) are supported!")
#endif /* (_MSC_VER < 1910 || _MSC_VER >= 1940) || (_MSC_VER >= 1910 && _MSC_VER < 1910) */
#endif /* _WIN32 */
#endif /* !__NV_NO_HOST_COMPILER_CHECK */
7. 出现很多语法错误
这是因为torch中有函数定义成slots了,和qt的信号槽机制定义的宏冲突,解决办法就是在导入
torch.h头文件前取消slots的宏定义,导入完后再手动定义
#undef slots
#include <torch/torch.h>
#define slots Q_SLOTS
更多推荐
所有评论(0)