libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置

安装libtorch快被折磨疯了,终于可以在Qt窗口程序中集成训练好的模型了。此处记录配置过程中的坑。各位老铁在配置的过程中有任何经验心得也一定要写下来啊,让我们一起战胜这该死的环境配置。
本文主要参考https://blog.csdn.net/qq_41375318/article/details/110556350。该教程在b站上还有对应的视频。如果第一次配置libtorch,可以先看看视频教程。

1.明确环境

如果要集成自己训练出来的模型,libtorch的版本一定要与自己的pytorch版本相适应。如pytorch安装的是cuda10.2+pytorch1.8.1,libtorch也要是cuda10.2+libtorch1.8.1。否则在libtorch中加载pt模型时会报错。

2.下载liborch

cuda版本查看方式可在命令行下输入:

nvcc --verion

libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第1张图片
我这儿cuda版本是11.0,进入libtorch安装页面,选择配置如下图:
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第2张图片
此处有两点注意:
1.我的cuda版本是11.0,低版本cuda没有办法安装高版本的libtorch,因此我这儿安装cuda10.2对应的安装包。

安装包较大,可以把下载地址复制到迅雷中下载。

2.此处有C++ Release version与C++ Debug version。这是与vs的编译环境严格对应的,如下图所示:
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第3张图片
如果你的程序配置在Debug环境下,你就下载C++ Debug version,否则下载C++ Release version。C++ Debug version安装包要大很多,二者的配置在之后链接lib文件有一些不同,之后再做说明。

此处如果在vs Debug编译环境下安装C++ Release version,有些代码可以跑过,如张量的定义,但模型加载的代码可能会报错,而且让你找不到原因。我就在这儿困了很久,所以千万要严格对应。

3.对于30系列显卡,以3080Ti为例,建议配置Cuda 11.1+libtorch 1.9.0,建议参考:

RTX3060+Win10+cuda11.1+cuDNN8.0.4+Libtorch1.9.0+Opencv3.4.6+VS2019深度学习C++配置

3.将libtorch链接到vs工程中

下载完安装包后,将安装包解压到磁盘的目录下。
此处点击vs工程名——属性,如图:
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第4张图片
首先在C/C++常规下加入以下文件夹(依据自己解压的libtorch文件夹找到相应的目录):

D:\libtorch_dubug\libtorch\include\torch\csrc\api\include
D:\libtorch_dubug\libtorch\lib

libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第5张图片

接下来链入lib文件夹:

D:\libtorch_dubug\libtorch\lib

libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第6张图片
接下来加入lib文件

(将D:\libtorch_dubug\libtorch\lib文件夹下相对应的lib文件名链入,不同版本的安装包lib文件名可能不一样,此处是libtorch1.8.1 Release Version+cuda10.1)

此处提供文件名如下(libtorch 1.8.1):

torch.lib
torch_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
torch_cpu.lib
c10_cuda.lib
caffe2_nvrtc.lib
mkldnn.lib
c10.lib
dnnl.lib
libprotocd.lib
libprotobufd.lib
libprotobuf-lited.lib
fbgemm.lib
asmjit.lib
cpuinfo.lib
clog.lib
cudart.lib

对于libtorch 1.9.0,则lib为:

asmjit.lib
c10.lib
c10d.lib
c10_cuda.lib
caffe2_detectron_ops_gpu.lib
caffe2_module_test_dynamic.lib
caffe2_nvrtc.lib
Caffe2_perfkernels_avx.lib
Caffe2_perfkernels_avx2.lib
Caffe2_perfkernels_avx512.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
fbjni.lib
kineto.lib
libprotobuf-lited.lib
libprotobufd.lib
libprotocd.lib
mkldnn.lib
pthreadpool.lib
pytorch_jni.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
torch_cuda_cpp.lib
torch_cuda_cu.lib
XNNPACK.lib
cudart.lib

libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第7张图片
同时要输入预编译命令,对于libtorch 1.8.1,则输入:

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

对于libtorch 1.9.0,则输入:

/INCLUDE:?warp_size@cuda@at@@YAHXZ 
/INCLUDE:"?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z 

或:

/INCLUDE:"?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z 

预编译命令输入在链接器-命令行,如图:
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第8张图片

接下来设置dll文件的环境变量。我在C++控制台程序中采用如下方法可以设置好dll文件环境变量:

PATH=D:\libtorch_dubug\libtorch\dll;%PATH%

libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第9张图片

也可以在系统环境变量中加入了这个目录:
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第10张图片
有关环境变量设置可以参照该教程。

注意是在系统变量-path中加入该目录

设置完环境变量一定要重启,否则依然会提示找不到dll文件。

在vs中链接dll文件目录可以参照该教程。

接下来输入一下代码,测试是否配置正确:

#include 
#undef slots//不加这两句会报错
#include 
#include
#include
#define slots Q_SLOTS//不加这两句会报错

int main()
{
    torch::Tensor tensor = torch::rand({ 5,3 });
    test_a = tensor[0][0].item().toFloat();
    qDebug() << test_a;
    qDebug() << "cuda是否可用:" << torch::cuda::is_available() << endl;

    return EXIT_SUCCESS;
}

如果可以正常运行,可以尝试导入训练好的模型并使用模型进行推理。刚开始可以考虑先从torchvision中导出Resnet18模型进行推理测试,参考该官方教程。

以下附上使用libtorch可能用的上的资料:

1.[LibTorch & Win] 各版本 LibTorch 下载
2.libtorch 常用api函数示例(史上最全、最详细)
3.libtorch windows 使用 error汇总
4.Github较完整的libtorch教程
5.libtorch性能问题调研

4.关于c10:Error问题的补充

在调试网络的过程中非常容易出现下图(引自C++部署Pytorch(Libtorch)出现问题、错误汇总)所示的错误。这个错误可以由很多原因造成,以至于在调试时无从调试起。以下对出现问题的原因进行简单汇总,欢迎大家补充。
libtorch1.8.1,cuda10.2+vs2017+Qt5.9.9安装配置_第11张图片

  1. libtorch版本与pytorch版本不统一,解决方法就是安装l相同版本的libtorch与pytorch。
  2. 下述代码顺序写反了:
torch::jit::script::Module m = torch::jit::load("traced_net1.pt");
m.to(device_type);//如果把m.eval();放在m.to(device_type)前,可能导致这个c10error的错误。
m.eval();
  1. 模型traced_net1.pt的路径错误。
  2. 在执行如下推理代码时:
auto dd = m.forward(inputs);

没有把模型m与inputs都放入cuda中。这与pytorch不一样。pytorch中如果模型或张量有一个放入cuda中了,另一个会自动被放入。

  1. 将张量放入cuda中时没有写正确,如下述代码:
torch::Tensor a;
a = a.to(device_type);//如果只写了a.to(device_type);编译不会报错,但运行时会出现c10 error。
					  //这一点与pytorch不一样。
  1. 显存溢出。有时候在控制台输出会提示out of memory, 有时不会提示。
  2. 部分操作如torch::max, torch::sqrt在处理FP16 tensor时也会报这个错误,把tensor改为FP32或FP64后就不会再报错。报错时不会定位到相应的tensor。
  3. 初始化tensor时维度不正确。初始化时不会报错,操作不正确初始化的tensor会报错。
float test_float[3][3] = { {1.0, 2.0, 3.0}, {4.0, 5.0, 6.0 },{7.0, 8.0, 9.0} };
torch::Tensor test_float_tensor = torch::from_blob(test_float, { 0, 3 }).to(at::kCPU).to(torch::kFloat32);//初始化维度为{0, 3}的tensor是不合理的,但如果不操作test_float_tensor则不会报错。
torch::max(test_float_tensor, 1, true);//此时会报c10 error的错误。
  1. 送入网络的tensor的维度不符合网络输入要求,或者执行推理的网络没有正确载入。

可以看到能够出现c10:Error的问题非常多,一不小心就可能掉坑,并且错误信息不明确,导致调试非常困难。建议依据在机显存的情况,先放入小批量样本,在CPU状态下调试。调试成功后再放入cuda中,可以一项一项排除问题。

  1. 链接的lib文件不对应。如把libtorch 1.8.1的lib文件链接到libtorch 1.9.0中。有可能报上述c10错误,也可能报下述符号错误:
“一个无法解析的外部命令at::native::searchsorted_cuda”
  1. 预编译命令不对。如前述提到的在liborch 1.9.0中应该用如下指令进行编译:
/INCLUDE:"?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z 

如果使用libtorch 1.8.1的指令进行编译,则会报c10错误。或者不加预编译指令也会报类似错误。

5.最后

1.libtorch配置坑相当多,有任何问题欢迎大家交流,也希望大家通过博客的形式记录下来,让自己之后有个参考,也给其他人更多参考资料。
2.libtorch进行模型推理的速度并不快,有一些模型推理快于pytorch(一般是输入小维度数据时),大部分环境下推理速度慢于pytorch,显存占用大于pytorch。如果需要推理加速还是要考虑TensorRT等模型加速库。libtorch可以实现在C++平台下一些张量计算,且API与Pytorch类似。

你可能感兴趣的:(深度学习,软件开发,c++,人工智能,pytorch,深度学习)