C++ VScode配置libtorch,并调用PyTorch模型

获取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库(VS)

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

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. VS中配置

下载好的libtorch文件夹里有这些
libtorch配置
①首先先根据下载的libtorch库种类,选好对应的VS调试器种类
在这里插入图片描述
②再进行libtorch的配置
由于我不太熟悉VS,然后网上配置方式又有很多种,我就把他们全都用了上去,可能有重复的步骤,不过也可以留意一下,这些位置会不会有路径不一致的地方:
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<torch/torch.h>
#include<torch/script.h>
#include<iostream>
#include<memory>
using namespace std;
int main() {
	torch::Tensor tensor1 = torch::rand({1, 3, 3, 3});
	cout << tensor1 << endl;
}

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

C++调用模型

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

#include<torch/torch.h>
#include<torch/script.h>
#include<iostream>
#include<memory>
using 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,需要转换一下
	vector<torch::jit::IValue> inputs;
	inputs.push_back(tensor1);
	auto output = module1.forward(inputs).toTensor();
	
	//打印输出
	cout << output << endl;
}

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

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

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值