目录
文章简介:这篇文章用于介绍在windows10 vscode中,跑通如下代码的全部过程:
#include <torch/torch.h>
#include <iostream>
int main() {
torch::Tensor tensor = torch::rand({2, 3});
std::cout << tensor << std::endl;
}
代码来源:https://pytorch.org/cppdocs/installing.html
一、前言
能点进本文的同学们不需要我废话,所以简单讲一下,这是个c++和pytorch的“联动”,如果有同学需要用c++编写torch,就需要配置环境。
配环境是一个麻烦事,本文直接手把手保姆级教学,目标是:让同学们在windows上的vscode中,跑通上面那段代码。
注意:vscode请自行下载配置。
二、动手开始做
1. 安装cuda 11.4
信息提醒:我使用版本11.1会报错:No CUDA toolset found,搜到一些资料建议换成11.4,更换后就没问题了。
安装方法:https://blog.csdn.net/XunCiy/article/details/89070315,但注意其中有一个地方需要不一样:
作者说这个一定不要选,但是这个一定要选!不然会报错。
至此,我们安装好了cuda 11.4,并且安装了对应的cudnn,摆出来我在官网上下载的版本:
https://developer.nvidia.com/rdp/cudnn-archive
2. 安装visual studio 2019 community
我把我安装的放在这里供大家参考
我一共在安装器中勾选了这些内容。当然安装器大家就自己去官网下载,我下载的是Visual Studio 2019 community
3. 安装libtorch
注意我默认同学们已经安装了pytorch,我安装的是gpu版本的1.12.1.
至于libtorch,我选择的是libtorch-win-shared-with-deps-1.12.1+cu116.zip
,注意是release版本。下载的地方如下:
https://pytorch.org/get-started/locally/
注意上图的Release version,可以将链接中的1.13.1改成1.12.1,cu116保持不变就能够和我的版本保持一致了。
安装好之后,我放在了如下路径:
4. 安装mingw-w64
这个是和C++有关的东西,下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/,我下载的是这个:
也可以通过installer安装,但是我安装的时候报错了,所以选择直接将文件下载下来。下好之后解压,我放置的路径如下:
5. 配置环境变量
我整个过程中频繁修改环境变量的设置,所以已经忘了修改顺序,就直接将最终版本放在这里供大家参考。
windows10 进入环境变量的方法:点击键盘上的开始键——直接输入环境两个字,点击:
点进去选择环境变量,逐步添加:
第一,在用户变量中添加INCLUDE
变量,值为:
各位根据自己Visual Studio的安装位置和Windows Kits的文件夹位置修改就行了。
第二,在用户变量中添加LIB
变量,值为:
修改方法同上。
第三,在用户变量中Path变量下,添加几条,最终如下:
这是我全部的path,你需要添加的是上述第2、3、6行。
第四,在系统变量中添加如下变量:
这2个和mingw-64有关
第五,我的系统变量中有如下部分,表示cuda安装成功,在安装过程中自动加入的:
第六、在系统变量的Path部分,需要有如下内容:
上面这些就是配置此次环境,我的环境变量中多出来的内容,当然有些是自动生成的。
6. 打开vscode开始写程序
我说一下我的操作顺序,这种打开并构建项目的方式不一定是最优的,仅仅记录一种可行的方式:
第一步,按键盘的开始键
第二步,输入并打开它:
第三步,在桌面上(或者别的地方)创建一个空文件夹,叫做helloworld2
,并在打开的命令行中输入如下内容:
切换到文件夹下输入code .
,然后就能打开vscode
第四步,在vscode下,按ctrl+shift+P,输入并选择cmake: select a kit:
然后我选择的是下图的第一个(我机子是amd 64位的):
第五步,按同上的快捷键,这次选择quick start:
输入helloworld2(文件夹的名字)
按回车,然后选择executable
然后就会生成很多东西,包括cmakelist.txt,我们把相关配置写进去,然后build就行了。
第六步,配置cmakelist.txt
cmake_minimum_required(VERSION 3.0.0)
project(helloworld2 VERSION 0.1.0)
# 提醒:如果find_package(Torch REQUIRED)语句报错,我在别的操作系统上遭遇了报错,
# 那么就添加下面这句,我的libtorch放在了"/usr/local/libtorch/",所以下面这一行的路径是那样写的
# set(Torch_DIR "/usr/local/libtorch/share/cmake/Torch/")
# http://ruiy.leanote.com/post/find_package%E7%9A%84%E4%BD%9C%E7%94%A8
# 这个资料简单讲解了本文件一些语句的运作过程,并且可能讲清楚了${TORCH_LIBRATIES}这些变量是哪来的
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
include(CTest)
enable_testing()
add_executable(helloworld2 main.cpp)
target_link_libraries(helloworld2 "${TORCH_LIBRARIES}")
set_property(TARGET helloworld2 PROPERTY CXX_STANDARD 14)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
# The following code block is suggested to be used on Windows.
# According to https://github.com/pytorch/pytorch/issues/25457,
# the DLLs need to be copied to avoid memory errors.
if (MSVC)
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
add_custom_command(TARGET helloworld2
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${TORCH_DLLS}
$<TARGET_FILE_DIR:helloworld2>)
endif (MSVC)
我再放一个官方的版本供参考:
https://pytorch.org/cppdocs/installing.html
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(example-app)
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
# The following code block is suggested to be used on Windows.
# According to https://github.com/pytorch/pytorch/issues/25457,
# the DLLs need to be copied to avoid memory errors.
if (MSVC)
file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
add_custom_command(TARGET example-app
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${TORCH_DLLS}
$<TARGET_FILE_DIR:example-app>)
endif (MSVC)
第七步,写main.cpp
#include <iostream>
#include <torch/torch.h>
int main(int, char**) {
std::cout << "Hello, world!\n";
torch::Tensor tensor = torch::rand({2, 3});
std::cout << tensor << std::endl;
}
7. 运行程序
看vscode下面:
先按一下Build,然后再按一下run(上图瓢虫右边的三角)。
然后输出结果:
至此,配环境的任务就结束了。
8. 其他报错信息
- 上面给的例子是#include <torch/torch.h>,如果要#include <torch/extension.h>,就会报错:找不到Python.h,那么这个时候就需要用
include_directores()
语句添加Python.h文件所在的路径,一般是"python安装路径/include"。我写的是"/Library/Frameworks/Python.framework/Versions/3.7/include/python3.7m",因为我的Python.h在这个路径下,然后重新build就不报错了。 - #include <torch/extension.h>的时候报错:
fatal error LNK1104: 无法打开文件“python37.lib
在CMakeLists.txt中添加:
link_directories("python安装路径/libs")
注意include_directories负责头文件路径,这个则负责库文件路径。
(参考:https://www.cnblogs.com/binbinjx/p/5626916.html)
有些人报的错是:fatal error LNK1104: 无法打开文件“python37_d.lib
,解决办法有两种:
(1) 我直接将python37_d.lib文件名修改为python37.lib,然后修改pyconfig.h(在python安装路径/include):
/* For an MSVC DLL, we can nominate the .lib files used by extensions */
#ifdef MS_COREDLL
# if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
/* not building the core - must be an ext */
# if defined(_MSC_VER)
/* So MSVC users need not specify the .lib
file in their Makefile (other compilers are
generally taken care of by distutils.) */
# if defined(_DEBUG)
// # pragma comment(lib,"python37_d.lib")
# pragma comment(lib,"python37.lib")
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
# pragma comment(lib,"python37.lib")
# endif /* _DEBUG */
# endif /* _MSC_VER */
# endif /* Py_BUILD_CORE */
#endif /* MS_COREDLL */
修改1:pragma comment(lib,“python37_d.lib”) 为 pragma comment(lib,“python37.lib”)
#ifdef _DEBUG
// # define Py_DEBUG
#endif
修改2:上面第2行注释掉
(这种方法来源github还是stackoverflow来着,出现频率极低,只见过一个回答那样讲)
然后你的错误就会转化为:fatal error LNK1104: 无法打开文件“python37.lib
,按照前文所讲即可。
(2) 网上还有一个解决办法:安装python debug版本,出现频率较高,我没尝试这种。