vs2017配置libtorch

vs2017配置libtorch

  • 配置libtorch
    • 下载libtorch
    • 配置libtorch环境变量
    • 配置VS2017环境
    • 所踩过的坑
      • 发现上面程序编译了输出一大堆warning,但不报错,然而还是生成失败。
      • 编译完了,无法运行,找不到XXX.dll文件。
      • 有未经处理的异常:Microsoft C++异常:c10::Error,位于内存位置xxx处
      • 无法定位程序输入点xxx于动态链接库torch_cuda.dll 上
      • torch::cuda::is_available()返回false

配置libtorch

配置libtorch有两个方法,一是直接在vs2017上配置不用CMAKE,二是用CMAKE编译(该方法我踩坑失败,最后转为方法一成功),下面介绍方法一,后面介绍一下方法一和方法二的坑,有些我也解决不了,仅供参考。

下载libtorch

下载libtorch时,首先需要查看自己的pytorch版本,建议找到对应的pytorch版本下载,记得win下载win的,linux下载linux的,我就下错了一次。
libtorch各个版本下载

注意一定要下载对应pytorch版本以及机器的对应cuda版本的libtorch(我10.0的cuda看见链接只有10.1和10.2的,就下载了这两个版本,都出现了torch_cuda.dll找不到入口的问题,网上其他的解决方法,复制torch_cuda.dll到windows的路径下啥的,重新下载libtorch覆盖压缩啥的都没用,就是版本问题)

配置libtorch环境变量

下载完对应的libtorch之后直接解压,然后在我的电脑——环境变量——系统变量的PATH里面添加libtorch的路径。
我电脑对应的路径是:H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\lib(根据自己下载解压的地方配置)

配置VS2017环境

打开VS2017,直接新建一个控制台项目。

在解决方案资源管理器
vs2017配置libtorch_第1张图片
直接选择项目右键属性,进入属性页。
vs2017配置libtorch_第2张图片

点击C++,在常规的附加包含目录里面添加两个路径:
H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\include\torch\csrc\api\include 和 H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\include(根据自己的更改)

SDL检查选择否

vs2017配置libtorch_第3张图片
在语言里面语言标准选择C++14,符合模式选择否

vs2017配置libtorch_第4张图片
链接器的常规附加库目录添加路径:
H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\lib

输入的附加依赖项添加对应的链接文件
vs2017配置libtorch_第5张图片

asmjit.lib
c10.lib
c10d.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
gloo.lib
libprotobuf-lited.lib
libprotobufd.lib
libprotocd.lib
mkldnn.lib
torch.lib
torch_cpu.lib
torch_cuda.lib

这是Debug版本的,Release版本的可以根据后面编译报错自行根据,所有对应的文件名均在该路径下:
H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\lib

确定后就可以写一个Demo程序测试一下了。

#include 
#include 

int main()
{

	torch::Tensor tensor = torch::rand({ 5,3 });
	std::cout << tensor << std::endl;

	return 0;
}

所踩过的坑

发现上面程序编译了输出一大堆warning,但不报错,然而还是生成失败。

这个问题一开始纠结了我很久,我还以为是VS2017无法直接配置libtorch,又跑去用CMake配置了,CMake失败了,但其间做了一个事情,更新VS2017,然后回来跑发现跑通了,可能是当时我的VS2017版本太低了,有这个问题的可以先更新VS2017看看。

在右上角的帮助点检查更新即可。

编译完了,无法运行,找不到XXX.dll文件。

解决方法也很简单,只需要去https://www.dll-files.com/网站下载你缺少的dll动态库,得到该文件的压缩包,然后解压把该.dll文件复制到C:\Windows\System32目录下即可。

有未经处理的异常:Microsoft C++异常:c10::Error,位于内存位置xxx处

我两次出现了这个问题,第一次是我pytorch转换的是CPU模型,也就是没有挂在cuda上,然后libtorch写了挂在kCuda上,出现问题,改为kCPU没毛病了。

第二次出现是我的pytorch网络最后输出有两个,语义分割现在都有辅助输出来提高准确率,但我写的代码只处理了一个。

在这里插入图片描述
可以参考这个代码,output里面存着所有输出,找到你的分割输出toTensor即可。

其实出现这个问题,可以直接把断点设在出现问题的地方,然后调试运行,触发异常时会跳进libtorch的函数里面,里面有一个assert语句,可以根据语句的内容大概判断到底出了什么问题。

无法定位程序输入点xxx于动态链接库torch_cuda.dll 上

就是这个问题坑了我两天的时间,无论是CMAKE还是VS2017配置,一开始都是掉在这,网上的解决方法都试过了,都无效。
主要是机器的cuda版本和libtorch的版本不对应导致的,我原来机器是10.0下载了10.1和10.2的libtorch均出现该问题,然后重新下载了一个10.2的cuda就好了。

torch::cuda::is_available()返回false

在链接器中 -> 命令行 -> 其他选项

/INCLUDE:?warp_size@cuda@at@@YAHXZ

参考https://blog.csdn.net/horsee/article/details/106754187

你可能感兴趣的:(pytorch部署C++)