我在电脑上实现的gpu调用版本为,cuda10.2 ,cudnn10.2 ,libtorch1.8.1+cu102 显卡驱动版本为441.22,要注意显卡驱动和cuda匹配,网上很多可以查到。下面说一下我都遇见了那些问题。
1,未加载kernelbase.pdb,c10::Error, 这个问题很可能是你版本没有对应,或者vs没有成功调用cuda。用以下两句话检测是否调用成功:如果没有函数说明你没有包含头文件#include<torch/torch.h>
std::cout << torch::cuda::cudnn_is_available() << endl;//输出为1,成功
std::cout << torch::cuda::is_available()<<endl;//输出为1,成功
如果输出为零,在属性页,链接器-命令行-其他选项加入:
/INCLUDE:?warp_size@cuda@at@@YAHXZ
如果加入这句话后,报这句话无法解析,将你libtorch下lib文件中的.lib的项全部加入属性页的附加依赖项中。
2,未加载kernelbase.pdb,std::runtime_error, 我一直以为是库不对应或者模型问题,但实际上我的问题出在了声明前向传播容器的时候。
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({ 1, 3,512, 512 }, torch::kCUDA));
我之前在这里没有加入torch::KCUDA这个参数导致声明的还是用于cpu的,加上这句话顺利通过。
最后附上我在vs2019,qt工程下调用成功的代码:
#include "QtGuiApplication2.h"
#undef slots
#include <torch/script.h>
#include<torch/torch.h>
#define slots Q_SLOTS
#include<iostream>
using namespace std;
QtGuiApplication2::QtGuiApplication2(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
std::cout << torch::cuda::cudnn_is_available() << endl;//输出为1,成功
std::cout << torch::cuda::is_available()<<endl;//输出为1,成功
torch::jit::script::Module module = torch::jit::load("F:/pytorch-gpu.pt",torch::kCUDA);
module.to(at::kCUDA);
torch::NoGradGuard on_grad;
std::vector<torch::jit::IValue> inputs;
inputs.push_back(torch::ones({ 1, 3,512, 512 }, torch::kCUDA));
at::Tensor output = module.forward(inputs).toTensor();
std::cout << output << std::endl;
}
3 在实现了上面gpu参数输出后,在进行图片预测时,报未加载opencv_world331.pdb,这个错误可能不是opencv造成的,我的问题是将模型放到gpu预测获取预测结果后没有放回到cpu在进行处理。
at::Tensor outputs =module.forward(inputs).toTensor();
outputs=outputs.to(torch::KCPU); //这里要将预测结果放回到cpu