tensor.to(at::CUDA)&&model.to(at::CUDA)的区别
执行tensor.to(at::CUDA)发现tensor还在cpu中
官方文档如下:文档链接
注意move和return的区别
对于model,是move,即将model从cpu中移动到GPU中
对于tensor,是return,即返回一个新的tensor,新的Tensor在gpu中,原赖的Tensor还在CPU中
代码例子:
torch::Tensor a = torch::ones({2, 3}); //此时a在cpu中
a.to(at::kCUDA); // 跟pytrch不一样,这么用的话,a仍然还在cpu中,典型的被pytorch坑了
torch::Tensor b = a.to(at::kCUDA); // 此时b在gpu中,a在cpu中,正确用法
一步到位法:
torch:Tensor a = torch::ones({2, 3}).to(at::kCUDA);
如果是model的话,就直接是move可,代码例子:
torch::jit::script::Module get_jit_module(std::string model_path){
torch::jit::script::Module module;
//读取模型
try {
module = torch::jit::load(model_path);
module.to(at::kCUDA); // 直接移到cuda中
} catch (const c10::Error& e) {
std::cerr << "Error : can't load the jit file..." << std::endl;
throw(e);
}
return module;
}