其实这个总结说的很详细了,只不过我自己在实操的过程中又发现了新的问题,记录自己帮助各位
1. 个人版本
pytorch 1.12 cuda 11.3, 对应Libtorch的debug版
2. 报错1
同上方引用的总结里的内容一样,c10::NotImplementedError
但是区别在于解决方法我在这篇文章中没找到能够解决我的问题的,具体报错位置是OperatorEntry.h的kernelfunction 函数,和这个github issue一模一样(可惜年代久远,提问者已经关闭了Issue)。这个时候如果直接放在cpu上,是不会报错的
Converting PyTorch Model to Torch Script · Issue #11 · rvorias/ind_knn_ad · GitHub
最后发现是由于,在torch.jit.trace导出模型时,这个时候就必须要指定在cpu还是gpu上,并调整为eval(),c++里面也要同时指定,二者缺一不可。
例如:
import torch
from torchvision.models import resnet18
model = resnet18(pretrained=False)
num_features = model.fc.in_features
model.fc = torch.nn.Linear(num_features, 9)
weight = torch.load(r'model.pth')
model.load_state_dict(weight)
if torch.cuda.is_available():
model.cuda()
model.eval()
x = torch.ones(1, 3, 224, 224).cuda()
trace_model = torch.jit.trace(model, x)
trace_model.save('resnet_fish.pt')
3. 报错2
std::runtimeerror
不是很刁钻的报错,具体来说就是将模型和数据放在cuda上的时机不对,建议在torch::jit::load的时候就放上去。
例如:
torch::jit::script::Module module;
torch::DeviceType device_type;
device_type = torch::kCUDA;
torch::Device device(device_type);
try
{
module = torch::jit::load("resnet_fish.pt",device_type);
}
catch (const c10::Error& e)
{
std::cerr << "error\n";
return -1;
}
不要调换位置。
暂时就这两个比较关键,其实自己一路写下来不难,但是挺费劲的(c++菜鸡)