一、使用环境
-
VS2017:将自己的插件更到最近,重要的事情说三遍!
由于我的是社区版,更新在“工具”->“扩展与更新” -
libtorch,
libtorch的版本是对下兼容的,这很好理解。比如,你2020年训练了一个模型,到了2030年,别人要想加载你的模型,只需要最先进的libtorch配合最先进的cuda就可以了。
注意:有release和debug版本,我下载的是release版本。
(1)安装cpu版本:
去官网下载最新的版本就可以。
(2)安装GPU版本:
我的电脑的cuda是安装版本是11.0。查看方式为:打开NVIDIA控制面板->系统信息->组件,图片如下:
但我用的aconda 环境中 pytorch版本是1.10.1的,所以我下载的gpu版本的libtorch版本是:libtorch-win-shared-with-deps-1.10.0+cu102.zip。虽然落后了0.0.1个版本,还能用。
下载好后,记得添加环境变量,我这里为"C:\install\libtorch\lib"
注意:这里是release,VS中的配置也必须是release!!!
-
Cmake的windows安装,略
二、各种配置
从“项目”->“**属性”,打开配置页面
-
VC++目录
(1)“库目录”中添加
最上面一个是GPU在本机的安装位置,使用的是CPU版本的话,这句可以去掉。 -
C/C++
(1)"常规"中“附加包含目录”添加
窃以为这里和上面是重复配置,可以去掉。
(2)“常规”中其他选项
(3)“语言”中的“符合模式”->"否” -
链接器
(1)“常规”中的
窃以为这里和上面是重复配置,可以去掉。
(2)“输入”中的“附加依赖项”
(2.1)cpu的配置如下:
(2.2)GPU的配置如下:
将下面命令添加到 “命令行”中去
/INCLUDE:?warp_size@cuda@at@@YAHXZ
添加完全后是:
/INCLUDE:?warp_size@cuda@at@@YAHXZ "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
新版本的是:
/INCLUDE:?warp_size@cuda@at@@YAHXZ /INCLUDE:?_torch_cuda_cu_linker_symbol_op_cuda@native@at@@YA?AVTensor@2@AEBV32@@Z "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'"
三、编写代码,然后,点击“生成”中的“重新生成xxx”
#include <torch/script.h>
#include <iostream>
#include <memory>
using namespace std;
int main() {
torch::Tensor tensor = torch::rand({ 2, 3 });
cout << tensor << endl;
std::cout <<"cuda::is_available():" << torch::cuda::is_available() << std::endl;
system("pause"); //验证GPU是否可用
std::cout << "torch::cuda::device_count:" << torch::cuda::device_count() << endl;
system("pause");
std::string model_path = "../../model_libtorch_win_125.pt"; //两级目录
torch::jit::script::Module module;
// Deserialize the ScriptModule from a file using torch::jit::load().
module = torch::jit::load(model_path);
std::cout << "model is load !\n";
torch::DeviceType device_type = at::kCPU; // 定义设备类型
if (torch::cuda::is_available()) {
device_type = at::kCUDA;
std::cout << "cuda is used." << endl;
}
else {
std::cout << "cpu is used." << endl;
}
module.to(device_type);
}
四、注意事项
- #include <windows.h> 和 include <torch/torch.h> 冲突
表现如下:
解决办法:
(1)把 include <windows.h> 注释掉
(2)改成这样,未试过
- 如果自身电脑的cuda是 大版本的11.5的,那么你需要的libtorch应该选用 cu11*上的版本,相应的配置需要更改。参考链接。其中,重点需要修改的地方是:
(1)4.1链接器–input
(2)4.2链接器–Command Line