配置libtorch有两个方法,一是直接在vs2017上配置不用CMAKE,二是用CMAKE编译(该方法我踩坑失败,最后转为方法一成功),下面介绍方法一,后面介绍一下方法一和方法二的坑,有些我也解决不了,仅供参考。
下载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之后直接解压,然后在我的电脑——环境变量——系统变量的PATH里面添加libtorch的路径。
我电脑对应的路径是:H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\lib(根据自己下载解压的地方配置)
打开VS2017,直接新建一个控制台项目。
点击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检查选择否
链接器的常规附加库目录添加路径:
H:\libtorch\libtorch-win-shared-with-deps-debug-1.7.1\libtorch\lib
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;
}
这个问题一开始纠结了我很久,我还以为是VS2017无法直接配置libtorch,又跑去用CMake配置了,CMake失败了,但其间做了一个事情,更新VS2017,然后回来跑发现跑通了,可能是当时我的VS2017版本太低了,有这个问题的可以先更新VS2017看看。
在右上角的帮助点检查更新即可。
解决方法也很简单,只需要去https://www.dll-files.com/网站下载你缺少的dll动态库,得到该文件的压缩包,然后解压把该.dll文件复制到C:\Windows\System32目录下即可。
我两次出现了这个问题,第一次是我pytorch转换的是CPU模型,也就是没有挂在cuda上,然后libtorch写了挂在kCuda上,出现问题,改为kCPU没毛病了。
第二次出现是我的pytorch网络最后输出有两个,语义分割现在都有辅助输出来提高准确率,但我写的代码只处理了一个。
可以参考这个代码,output里面存着所有输出,找到你的分割输出toTensor即可。
其实出现这个问题,可以直接把断点设在出现问题的地方,然后调试运行,触发异常时会跳进libtorch的函数里面,里面有一个assert语句,可以根据语句的内容大概判断到底出了什么问题。
就是这个问题坑了我两天的时间,无论是CMAKE还是VS2017配置,一开始都是掉在这,网上的解决方法都试过了,都无效。
主要是机器的cuda版本和libtorch的版本不对应导致的,我原来机器是10.0下载了10.1和10.2的libtorch均出现该问题,然后重新下载了一个10.2的cuda就好了。
在链接器中 -> 命令行 -> 其他选项
/INCLUDE:?warp_size@cuda@at@@YAHXZ
参考https://blog.csdn.net/horsee/article/details/106754187