前言
参考了这个链接,但其是cuda10以及visual studio2017。真没想到visual studio版本会影响到配置。
注意
- 本博客只支持环境下libtorch的配置;
- 目前visual studio2022不支持libtorch配置,请使用较低版本;
本机环境
使用链接下打印本机环境为:
PyTorch version: 1.6.0
Is debug build: False
CUDA used to build PyTorch: 10.2
ROCM used to build PyTorch: N/A
OS: Microsoft Windows 11 专业版
GCC version: Could not collect
Clang version: Could not collect
CMake version: Could not collect
Libc version: N/A
Python version: 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)] (64-bit runtime)
Python platform: Windows-10-10.0.22000-SP0
Is CUDA available: True
CUDA runtime version: 11.4.152
GPU models and configuration: GPU 0: NVIDIA GeForce RTX 2060
Nvidia driver version: 472.50
cuDNN version: Could not collect
HIP runtime version: N/A
MIOpen runtime version: N/A
Is XNNPACK available: False
visual studio
本文尝试安装visual studio2022后失败,后在问题下发现libtorch在visual studio2022下无法使用CUDA,随后安装2019版本。
opencv
去官网下载你想要的版本即可,当然限定平台为Windows平台。
opencv和libtorch都是下载后解压即可,所有程序涉及路径以英文路径为佳,避免出错。
libtorch
由于没找到之前版本的libtorch,下载最新版本。
示例
生成torchscript文件
以ResNet34分类模型为例尝试部署分类模型。准备一张图片用以判断是否部署成功,本文用例图来自链接
先生成torchscript文件:
from torchvision.models import resnet34
import torch.nn.functional as F
import torch.nn as nn
import torch
import cv2
#读取一张图片,并转换成[1,3,224,224]的float张量并归一化
image = cv2.imread("flower.jpg")
image = cv2.resize(image,(224,224))
input_tensor = torch.tensor(image).permute(2,0,1).unsqueeze(0).float()/225.0
#定义并加载resnet34模型在imagenet预训练的权重
model = resnet34(pretrained=True)
model.eval()
#查看模型预测该付图的结果
output = model(input_tensor)
output = F.softmax(output,1)
print("模型预测结果为第{}类,置信度为{}".format(torch.argmax(output),output.max()))
#生成pt模型,按照官网来即可
model=model.to(torch.device("cpu"))
model.eval()
var=torch.ones((1,3,224,224))
traced_script_module = torch.jit.trace(model, var)
traced_script_module.save("resnet34.pt")
visual studio项目配置
新建工程项目:创建c++空项目并设置路径名称等。
新建空白项目后右键源文件,点击添加新建项,生成main.cpp。
编译环境配置
在项目的管理器中设置项目的编译为Release,平台选择x64。如图:
配置项目属性
右键项目deploy_test,选择属性进入属性页的配置属性。选择VC++目录,需要添加包含目录和库目录。包含目录配置路径为
your path to libtorch\include\torch\csrc\api\include
your path to libtorch\include
your path to opencv\build\include
我的包含目录配置结果如下:
库目录的配置路径为:
your path to libtorch\lib
your path to opencv\build\x64\vc14\lib
最后添加链接器,点击链接器->输入->附加依赖项,编辑添加库目录中libtorch库目录下所有的.lib文件名。此外,为使用opencv还需添加opencv的.lib文件。本文添加如下:
opencv_world455.lib
asmjit.lib
c10.lib
c10_cuda.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
torch_cuda_cpp.lib
torch_cuda_cu.lib
动态链接库需要放入指定位置,点击调试->环境,添加
path=your libtorch path\lib;your opencv path\build\x64\vc14\bin
我的为:
path=D:\tools\libtorch-1.11.0+cu113release\lib;D:\tools\opencv\build\x64\vc14\bin
注意等号前后不包含空格。
cpp代码
#include<opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h>
int main()
{
//定义使用cuda
auto device = torch::Device(torch::kCUDA,0);
//读取图片
auto image = cv::imread("your path to\\flower.jpg");
//缩放至指定大小
cv::resize(image, image, cv::Size(224, 224));
//转成张量
auto input_tensor = torch::from_blob(image.data, { image.rows, image.cols, 3 }, torch::kByte).permute({ 2, 0, 1 }).unsqueeze(0).to(torch::kFloat32) / 225.0;
//加载模型
auto model = torch::jit::load("your path to\\resnet34.pt");
model.to(device);
model.eval();
//前向传播
auto output = model.forward({input_tensor.to(device)}).toTensor();
output = torch::softmax(output, 1);
std::cout << "模型预测结果为第" << torch::argmax(output) << "类,置信度为" << output.max() << std::endl;
return 0;
}
如果运行正常输出结果,则恭喜,若报错,请按以下添加内容。
属性-链接器-命令行-其他选项,添加
/INCLUDE:?warp_size@cuda@at@@YAHXZ /INCLUDE:?_torch_cuda_cu_linker_symbol_op_cuda@native@at@@YA?AVTensor@2@AEBV32@@Z