C++VScode配置libtorch,并调用PyTorch模型-创新互联-成都快上网建站

C++VScode配置libtorch,并调用PyTorch模型-创新互联

C++ VScode配置libtorch,调用TorchScript模型
  • 获取pytorch模型
  • 转成C++模型
  • 下载配置libtorch库(VScode)
    • 1.首先是下载libtorch库
    • 2. VScode中配置
  • C++调用模型

成都创新互联公司专注于企业全网整合营销推广、网站重做改版、米东网站定制设计、自适应品牌网站建设、成都h5网站建设商城建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为米东等各大城市提供网站开发制作服务。获取pytorch模型

将训练好的模型保存为 pt模型文件。具体怎么训练pytorch模型可以参考以下链接:

https://blog.csdn.net/qq_41158484/article/details/127209537?spm=1001.2014.3001.5501
转成C++模型

这部分把python的 pt文件转换成C++可以读取的 pt文件(C++和python的pt文件是不一样的),转换方法如下:
①首先是CPU模型的转换:

import torch
print(torch.__version__)

# 读取C++模型
model_path = r"model.pt"

# 加载模型
model_ = torch.load(model_path)

# 定一个example,数值是什么无所谓,就是让这个example遍历一次模型而已
example = torch.rand(1, 3, 480, 640)

# 将模型trace成C++模型
traced_script_module = torch.jit.trace(model_, example)

# 保存trace完的模型文件
traced_script_module.save("model_cpu.pt")

②然后是GPU模型的转换(这里的GPU模型是指python用GPU训练出来的模型):
这里可能会出现这个报错:Microsoft C++ 异常: std::runtime_error,位于内存位置 0x0000005D1EFBC108 处。

import torch

# 读取C++模型
model_path = r"model.pt"

# 加载GPU模型
model_ = torch.load(model_path)

#这里有个坑,因为如果不放进cuda里进行转换,到后面C++读取的时候就会报上面说的那个错,而且网上都是说libtorch库版本对不上...
model_ = model_.cuda()  

# 定义一个example,放进cuda
example = torch.rand(1, 3, 480, 640).cuda()

# trace 成 C++模型
traced_script_module = torch.jit.trace(model_, example)

traced_script_module.save("model_cuda.pt")

③GPU模型的转换(将GPU训练的模型trace成CPU使用的C++模型):

import torch

# 读取C++模型
model_path = r"model.pt"

# 加载GPU模型,并转换成CPU使用的模型
# model_ = torch.load(model_path, map_location=lambda storage, loc: storage)  # gpu2cpu

# 定义一个example
example = torch.rand(1, 3, 480, 640)

# trace 成 C++模型
traced_script_module = torch.jit.trace(model_, example)

traced_script_module.save("model_cpu.pt")
下载配置libtorch库(VScode)

这部分是最麻烦,可能会导致后面报错最多的部分,因此需要一步一步慢慢来。

1.首先是下载libtorch库

可以在pytorch官网进行下载最近的相应版本

https://pytorch.org/get-started/locally/

如果需要之前的版本,可以在官网提供的previous中下载

https://pytorch.org/get-started/previous-versions/

tips(这里也是很多坑):
①这里的libtorch版本最好是和python读取模型转换的 torch 的版本相对应,不然后面有可能libtorch读取的时候也会报错…
②下载的版本要注意是release还是debug(如果有的话),还有是x64还是x86,你后面调试的时候就只能用相关的调试器,不然肯定会报动态库相关的错误,如: “__*********__在 ***.h文件中没有定义”、“库的类型是x64什么什么” 之类的错误。
在这里插入图片描述

2. VScode中配置

下载好的libtorch文件夹里有这些
libtorch配置
①首先先根据下载的libtorch库种类,选好对应的VScode调试器种类
在这里插入图片描述
②再进行libtorch的配置
由于我不太熟悉VScode,然后网上配置方式又有很多种,我就把他们全都用了上去,可能有重复的步骤,不过也可以留意一下,这些位置会不会有路径不一致的地方:
1.在这里插入图片描述
2.在这里插入图片描述
3.在这里插入图片描述
4.在这里插入图片描述
5.在这里插入图片描述
6.在这里插入图片描述
7.这里输入的lib文件是来自于你下载的 libtorch/lib 中的所有 .lib文件
在这里插入图片描述

8.这里是后面C++加载模型的时候有报错,cpu能正常调用,GPU报下面的错,添加后就没报错了。
0x00007FFDC1DF4ED9 处(位于 pytorch-semantic3070.exe 中)有未经处理的异常: Microsoft C++ 异常: c10::NotImplementedError,位于内存位置 0x000000558F3CE790 处。
在这里插入图片描述
就是输入下面这个

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

③最好把 libtorch/lib 中的所有文件拷贝一份到工程下,因为有些项目会出现下面这个报错,像下面说的那样加上就没事了。
报错:(vcruntime140.dll)处(位于 Project2.exe 中)引发的异常: 0xC0000005:
解决方案:
1.选中 libtorch/lib 中所有文件:
在这里插入图片描述
2.打开项目所在文件夹
在这里插入图片描述
3.粘贴进去
在这里插入图片描述
④到这里就配置完啦,可以运行下demo测试一下:

#include#include#include#includeusing namespace std;
int main() {torch::Tensor tensor1 = torch::rand({1, 3, 3, 3});
	cout<< tensor1<< endl;
}

如果能随机输出一个向量,就说明配置成功啦
在这里插入图片描述

C++调用模型

需要注意的是,很多错误到最后调用模型的时候才发现。因此,前面需要一步步配置好。

#include#include#include#includeusing namespace std;

int main() {//定义是用CUDA还是CPU,这里要能对应上trace后的C++模型,我这里是CUDA
    //如果需要改变CPU或者CUDA,需要在trace那个步骤改变,而不是这里变。
	torch::DeviceType device_type = at::kCUDA;
	
	//定义一个样本,需要注意的是,这里样本的输入需要跟你训练的样本形式是一样的(样本的大小和输入维度)
	//即你的训练时的输入是 (batchsize, sample size),如果需要遍历一个样本,则需要将该样本转换成 (1, sample size),比如我的输入是三通道640*480的图片,训练时将其转换成 (batch size, 3, 480, 640),那么这里遍历一个样本的时候,需要将其转换成 (1, 3, 480, 640)。
	torch::Tensor tensor1 = torch::rand({1, 3, 480, 640});
	tensor1.to(device_type);
	
	//定义模型路径,并读取模型
	const string model_path = "model_cuda.pt";
	
	cout<< "loading model ..."<< endl;
	torch::jit::script::Module module1 = torch::jit::load(model_path, device_type);
	cout<< "load model finish."<< endl;
	
	//输入模型的样本不是tensor,需要转换一下
	vectorinputs;
	inputs.push_back(tensor1);
	auto output = module1.forward(inputs).toTensor();
	
	//打印输出
	cout<< output<< endl;
}

在这里插入图片描述
到此就搞定啦,撒花!

如有错误,欢迎交流指正。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:C++VScode配置libtorch,并调用PyTorch模型-创新互联
链接URL:http://kswjz.com/article/dodcji.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流