Windows下CUDA兼容性的问题与LibTorch的使用——珍爱生命,远离MSVC

前几天把CUDA 9.1升级到了CUDA 9.2,以便和PyTorch匹配。升级CUAD以及作为铺垫的升级显卡驱动倒没啥好说的,点开exe,覆盖安装就行了。

…除了一个地方。安装CUDA 9.2时,需要把和Visual Studio相关的一项取消勾选,否则装不上。等我装完CUDA 9.2,再打开VS2019,弹出一个错误,没太细看,是和CUDA有关的。

今天去用CMake编译时,拿libtorch的示例都编译不过去,查了一下,发现CUDA和高版本的VS不兼容…具体可以看这里,CUDA 9.2: “NVIDIA Installer Failed”

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\crt\host_config.h的131行开始,有如下语句。

1
2
3
#if _MSC_VER < 1600 || _MSC_VER > 1913

#error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!

而我用VS2019,MSVC版本为1921。所以无论是安装时的问题,还是安装后VS2019的报错,抑或是现在的编译不过去,都知道了原因,CUDA 9.2和高版本的MSVC不兼容。

升级到CUDA 10.1

这次安装倒没出什么问题,无脑点next就OK了。

1
2
3
4
5
6
7
8
Installed:
- Nsight for Visual Studio 2019
- Nsight Monitor and HUD Launcher
Not Installed:
- Nsight for Visual Studio 2017
Reason: VS2017 was not found
- Nsight for Visual Studio 2015
Reason: VS2015 was not found

看到上面这样的提示,还是很放心的。然后把Python版和C++版的PyTorch都重装成CUDA 10.1版本的。

虽然说远离MSVC…但在Windows平台上…不得不低头额…还是真香。

编译LibTorch的示例

示例在这里

cpp和CMakeLisits.txt的内容copy过来,编译。

1
2
3
mkdir build & cd build
cmake ..
cmake --build . --config Release

在第二步和官方示例不一样,省了设置路径(其实是我忘了),官方示例是这样的。

1
cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch ..

因为已经把libtorch添加进了环境变量,所以省去也没关系吧。

虽然还是没有看到Makefile,但已经编译好了exe。只是这个Release文件夹体积太吓人了,把cuDNN相关的dll、torch和torch_python的本体dll都复制进来了…(诶,话说为什么要有torch_python.dll?)

最后纪念一下我编译出来的第一个C++版PyTorch代码。

1
2
3
4
5
λ cd Release
λ example-app
0.0935 0.2273 0.5856
0.0627 0.0996 0.7945
[ CPUFloatType{2,3} ]

LibTorch的模型调用与预测

这里没太多好说的,照着官方教程,编译了一遍。

载入模型

1
2
λ libtorch-test model.pt
ok

模型预测

1
2
3
4
λ libtorch-test "PATH/TO/model.pt"
-0.1862 0.3385 -0.3066 -0.3085 -0.3040
[ CPUFloatType{1,5} ]
ok

代码上没遇到明显的问题,只是概念上要明白,虽然模型都是.pt的后缀,但PyTorch的Python前端和C++前端的模型格式并不一样,Python得到的模型,不能直接在C++中载入,需要转换格式。

关于模型,额外的话

顺带一提,在纯Python前端的项目,经常看到model文件夹下只是.py文件,这是生成模型的代码,而不是模型本身啊。

但我还是不知道,Torch中的模型,除了.t7,还能不能保存成json格式?