LibTorch问题整理
#C++ tensor cannot move from cpu to gpu
#libtorch C++ GPU版本编译问题
1.首先进行cuda版本编译,不建议手动在VS中创建项目然后进行,包含头include以及链接lib库,建议使用cmake进行编译。
按照如下的目录结构创建CMakeLists.txt文件
CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)
find_package(Torch REQUIRED)
add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)
example_app.cpp中可先创建一个main的简单函数
#include <iostream>
#include "torch/torch.h"
#include "torch/jit.h"
int main() {
std::cout << "Hello, World!" << std::endl;
auto a = torch::tensor({{1, 2}, {3, 4}});
std::cout << a << std::endl;
return 0;
}
cd build
cmake -DCMAKE_PREFIX_PATH=/media/DATA2/libtorch ..
/media/DATA2/libtorch 指向libtorch cuda版库的路径,注意最后结尾的…不可少
编译后build内容大致如下
2.VS打开工程,torch::cuda::is_available() 一直返回false,网上很多说cuda版本与显卡驱动版本不兼容,可以检查下自己电脑上的cuda版本与显卡驱动是否兼容?自己本地显卡支持CUDA版本为10.1,本地安装的也是CUDA10.1。
另外太低的CUDA版本可能不支持libtorch。本地配置libtorch1.5,libtorch1.6,cuda10.1版本,仍然找不到可用的显卡。升级libtorch到最新的libtorch1.7后问题解决,具体问题没有深度分析,估计是libtorch库开源时间不久,仍存在一些小的兼容性问题。
auto cuda_available = torch::cuda::is_available();
std::cout << cuda_available << std::endl;
3.配置好需要的环境后,可能还存在找不到显卡问题,需要在VS连接器中加入 /INCLUDE:"?warp_size@cuda@at@@YAHXZ",该指令应该是指定编译程序需要cuda的一些库。
4.如何将tensor从cpu移动到gpu上,C++ Tensor not work move form cpu to gpu using opeator to 在Python中直接to操作即可完成数据CPU到GPU,或者GPU到CPU,但是在C++中遇到使用to结果数据移动不成功。
本人遇到的问题是模型从CPU 到GPU成功,例如:model.to(“cuda:0”)成功,但是输入数据input_tensor.to(“cuda:0”)不成功,改为input_tensor = input_tensor.to(“cuda:0”)之后成功,在判断input_tensor是在显卡显存空间。
torch::Tensor input_tensor = torch::rand({ 3,4 });
std::cout << input_tensor.device() << std::endl;
#输出cpu
torch::Device device(torch::kCUDA, 0);
torch::Tensor a = input_tensor.to(device)
std::cout << input_tensor.device() << std::endl;
#输出cpu
std::cout << a.device() << std::endl;
#输出cuda:0