最近在高版本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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐