扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
将训练好的模型保存为 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什么什么” 之类的错误。
下载好的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;
}
如果能随机输出一个向量,就说明配置成功啦
需要注意的是,很多错误到最后调用模型的时候才发现。因此,前面需要一步步配置好。
#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元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流