安装libtorch快被折磨疯了,终于可以在Qt窗口程序中集成训练好的模型了。此处记录配置过程中的坑。各位老铁在配置的过程中有任何经验心得也一定要写下来啊,让我们一起战胜这该死的环境配置。
本文主要参考https://blog.csdn.net/qq_41375318/article/details/110556350。该教程在b站上还有对应的视频。如果第一次配置libtorch,可以先看看视频教程。
如果要集成自己训练出来的模型,libtorch的版本一定要与自己的pytorch版本相适应。如pytorch安装的是cuda10.2+pytorch1.8.1,libtorch也要是cuda10.2+libtorch1.8.1。否则在libtorch中加载pt模型时会报错。
cuda版本查看方式可在命令行下输入:
nvcc --verion
我这儿cuda版本是11.0,进入libtorch安装页面,选择配置如下图:
此处有两点注意:
1.我的cuda版本是11.0,低版本cuda没有办法安装高版本的libtorch,因此我这儿安装cuda10.2对应的安装包。
安装包较大,可以把下载地址复制到迅雷中下载。
2.此处有C++ Release version与C++ Debug version。这是与vs的编译环境严格对应的,如下图所示:
如果你的程序配置在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++配置
下载完安装包后,将安装包解压到磁盘的目录下。
此处点击vs工程名——属性,如图:
首先在C/C++常规下加入以下文件夹(依据自己解压的libtorch文件夹找到相应的目录):
D:\libtorch_dubug\libtorch\include\torch\csrc\api\include
D:\libtorch_dubug\libtorch\lib
接下来链入lib文件夹:
D:\libtorch_dubug\libtorch\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
同时要输入预编译命令,对于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
接下来设置dll文件的环境变量。我在C++控制台程序中采用如下方法可以设置好dll文件环境变量:
PATH=D:\libtorch_dubug\libtorch\dll;%PATH%
也可以在系统环境变量中加入了这个目录:
有关环境变量设置可以参照该教程。
注意是在系统变量-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性能问题调研
在调试网络的过程中非常容易出现下图(引自C++部署Pytorch(Libtorch)出现问题、错误汇总)所示的错误。这个错误可以由很多原因造成,以至于在调试时无从调试起。以下对出现问题的原因进行简单汇总,欢迎大家补充。
torch::jit::script::Module m = torch::jit::load("traced_net1.pt");
m.to(device_type);//如果把m.eval();放在m.to(device_type)前,可能导致这个c10error的错误。
m.eval();
auto dd = m.forward(inputs);
没有把模型m与inputs都放入cuda中。这与pytorch不一样。pytorch中如果模型或张量有一个放入cuda中了,另一个会自动被放入。
torch::Tensor a;
a = a.to(device_type);//如果只写了a.to(device_type);编译不会报错,但运行时会出现c10 error。
//这一点与pytorch不一样。
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的错误。
可以看到能够出现c10:Error的问题非常多,一不小心就可能掉坑,并且错误信息不明确,导致调试非常困难。建议依据在机显存的情况,先放入小批量样本,在CPU状态下调试。调试成功后再放入cuda中,可以一项一项排除问题。
“一个无法解析的外部命令at::native::searchsorted_cuda”
/INCLUDE:"?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z
如果使用libtorch 1.8.1的指令进行编译,则会报c10错误。或者不加预编译指令也会报类似错误。
1.libtorch配置坑相当多,有任何问题欢迎大家交流,也希望大家通过博客的形式记录下来,让自己之后有个参考,也给其他人更多参考资料。
2.libtorch进行模型推理的速度并不快,有一些模型推理快于pytorch(一般是输入小维度数据时),大部分环境下推理速度慢于pytorch,显存占用大于pytorch。如果需要推理加速还是要考虑TensorRT等模型加速库。libtorch可以实现在C++平台下一些张量计算,且API与Pytorch类似。