环境配置完整指导——Installing C++ Distributions of PyTorch

文章简介:这篇文章用于介绍在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版本,出现频率较高,我没尝试这种。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值