libtorch torch::from_blob踩坑

libtorch中 torch::from_blob函数 可以把外部内存创建一个tensor,这里给个简单错误示例

 torch::Tensor example()
 {
		std::vector<float> res_data;
		res_data.resize(3 * 224* 224);
		torch::Tensor res_tensor = torch::from_blob(res_data.data(),{1, 3,244, 224});
		return std::move(res_tensor);
}

开始认为这个函数会拷贝一份到内存,但是这个把res_data指针传入,他内部并不会拷贝到tensor的cpu内存,只是把指针指向了这块地址,当你的res_data被析构,然后被其他地方使用,里面内容就会变化。

如果后续你不需要tensor的cpu内容,可以简单改成

return std::move(res_tensor.cuda());

就是在析构之前这里会创建一个指向gpu的tensor,并把内容拷贝到显存.

如果需要cpu做计算那就不能释放res_data,在libtorch头文件里能找到该函数的一个重载接口

using Deleter = std::function<void(void*)>;
inline at::Tensor from_blob(
    void* data,
    at::IntArrayRef sizes,
    const Deleter& deleter,
    const at::TensorOptions& options = at::TensorOptions())

这里的res_data需要在堆区new 出来,同时把析构方法作为低三个参数传入from_blob函数
Tensor在析构的时候会调用你的释放方法,释放掉这段内存.

你可能感兴趣的:(libtorch)