十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決

將訓(xùn)練好的模型保存為 pt模型文件。具體怎么訓(xùn)練pytorch模型可以參考以下鏈接:
https://blog.csdn.net/qq_41158484/article/details/127209537?spm=1001.2014.3001.5501轉(zhuǎn)成C++模型這部分把python的 pt文件轉(zhuǎn)換成C++可以讀取的 pt文件(C++和python的pt文件是不一樣的),轉(zhuǎn)換方法如下:
①首先是CPU模型的轉(zhuǎn)換:
import torch
print(torch.__version__)
# 讀取C++模型
model_path = r"model.pt"
# 加載模型
model_ = torch.load(model_path)
# 定一個example,數(shù)值是什么無所謂,就是讓這個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模型的轉(zhuǎn)換(這里的GPU模型是指python用GPU訓(xùn)練出來的模型):
這里可能會出現(xiàn)這個報(bào)錯:Microsoft C++ 異常: std::runtime_error,位于內(nèi)存位置 0x0000005D1EFBC108 處。
import torch
# 讀取C++模型
model_path = r"model.pt"
# 加載GPU模型
model_ = torch.load(model_path)
#這里有個坑,因?yàn)槿绻环胚M(jìn)cuda里進(jìn)行轉(zhuǎn)換,到后面C++讀取的時候就會報(bào)上面說的那個錯,而且網(wǎng)上都是說libtorch庫版本對不上...
model_ = model_.cuda()
# 定義一個example,放進(jìn)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模型的轉(zhuǎn)換(將GPU訓(xùn)練的模型trace成CPU使用的C++模型):
import torch
# 讀取C++模型
model_path = r"model.pt"
# 加載GPU模型,并轉(zhuǎn)換成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)這部分是最麻煩,可能會導(dǎo)致后面報(bào)錯最多的部分,因此需要一步一步慢慢來。
1.首先是下載libtorch庫可以在pytorch官網(wǎng)進(jìn)行下載最近的相應(yīng)版本
https://pytorch.org/get-started/locally/
如果需要之前的版本,可以在官網(wǎng)提供的previous中下載
https://pytorch.org/get-started/previous-versions/
tips(這里也是很多坑):
①這里的libtorch版本最好是和python讀取模型轉(zhuǎn)換的 torch 的版本相對應(yīng),不然后面有可能libtorch讀取的時候也會報(bào)錯…
②下載的版本要注意是release還是debug(如果有的話),還有是x64還是x86,你后面調(diào)試的時候就只能用相關(guān)的調(diào)試器,不然肯定會報(bào)動態(tài)庫相關(guān)的錯誤,如: “__*********__在 ***.h文件中沒有定義”、“庫的類型是x64什么什么” 之類的錯誤。
下載好的libtorch文件夾里有這些
①首先先根據(jù)下載的libtorch庫種類,選好對應(yīng)的VScode調(diào)試器種類
②再進(jìn)行l(wèi)ibtorch的配置
由于我不太熟悉VScode,然后網(wǎng)上配置方式又有很多種,我就把他們?nèi)加昧松先ィ赡苡兄貜?fù)的步驟,不過也可以留意一下,這些位置會不會有路徑不一致的地方:
1.
2.
3.
4.
5.
6.
7.這里輸入的lib文件是來自于你下載的 libtorch/lib 中的所有 .lib文件
8.這里是后面C++加載模型的時候有報(bào)錯,cpu能正常調(diào)用,GPU報(bào)下面的錯,添加后就沒報(bào)錯了。
0x00007FFDC1DF4ED9 處(位于 pytorch-semantic3070.exe 中)有未經(jīng)處理的異常: Microsoft C++ 異常: c10::NotImplementedError,位于內(nèi)存位置 0x000000558F3CE790 處。
就是輸入下面這個
/INCLUDE:?searchsorted_cuda@native@at@@YA?AVTensor@2@AEBV32@0_N1@Z③最好把 libtorch/lib 中的所有文件拷貝一份到工程下,因?yàn)橛行╉?xiàng)目會出現(xiàn)下面這個報(bào)錯,像下面說的那樣加上就沒事了。
報(bào)錯:(vcruntime140.dll)處(位于 Project2.exe 中)引發(fā)的異常: 0xC0000005:
解決方案:
1.選中 libtorch/lib 中所有文件:
2.打開項(xiàng)目所在文件夾
3.粘貼進(jìn)去
④到這里就配置完啦,可以運(yùn)行下demo測試一下:
#include#include#include#includeusing namespace std;
int main() {torch::Tensor tensor1 = torch::rand({1, 3, 3, 3});
cout<< tensor1<< endl;
} 如果能隨機(jī)輸出一個向量,就說明配置成功啦
需要注意的是,很多錯誤到最后調(diào)用模型的時候才發(fā)現(xiàn)。因此,前面需要一步步配置好。
#include#include#include#includeusing namespace std;
int main() {//定義是用CUDA還是CPU,這里要能對應(yīng)上trace后的C++模型,我這里是CUDA
//如果需要改變CPU或者CUDA,需要在trace那個步驟改變,而不是這里變。
torch::DeviceType device_type = at::kCUDA;
//定義一個樣本,需要注意的是,這里樣本的輸入需要跟你訓(xùn)練的樣本形式是一樣的(樣本的大小和輸入維度)
//即你的訓(xùn)練時的輸入是 (batchsize, sample size),如果需要遍歷一個樣本,則需要將該樣本轉(zhuǎn)換成 (1, sample size),比如我的輸入是三通道640*480的圖片,訓(xùn)練時將其轉(zhuǎn)換成 (batch size, 3, 480, 640),那么這里遍歷一個樣本的時候,需要將其轉(zhuǎn)換成 (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,需要轉(zhuǎn)換一下
vectorinputs;
inputs.push_back(tensor1);
auto output = module1.forward(inputs).toTensor();
//打印輸出
cout<< output<< endl;
} 
到此就搞定啦,撒花!
如有錯誤,歡迎交流指正。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧