LibTorch (PyTorch C++ 前端)
LibTorch 是 Pytorch 官方的 C++ 前端。然而,因为它几乎没啥文档,我在用它的过程中(被迫)一边读源码又一边踩了不少坑。于是我打算把踩过的一些坑/有用的 tricks 记录下来以供参考。
截至 2021 年 7 月,这份文档是基于我使用 libtorch v1.9 开发过程中的经验写成的。
性能:比 Pytorch 更慢
许多用户都报告过使用 LibTorch 进行推理的速度要远远比 使用 Python 中的 Pytorch 更慢。可以参见 #19106 中的讨论。
同时,有一篇 知乎文章 对此进行了深入的分析,并提出解决方案:链接 Pytorch 使用的 libraries 之后重新编译 libtorch。
兼容 Python 中读/写 Tensor
这一部分讲述了如何在 C++ 中保存 tensor 并在 Python 中读取;以及如何在 Python 中保存 tensor 后在 C++ 中读取。这对于程序调试来说很有用(因为 libtorch 的调试过程和报错信息实在是过于不友好了……)
信息
在 C++ 中保存 tensor 并在 Python 中读取
在 C++中,调用 torch::save()
进行保存。
#include <torch/torch.h>
// 保存单个 tensor
torch::save(tensor, "tensor.pt");
// 保存多个 tensors
torch::save({tensora, tensorb, tensorc}, "tensors.pt");
在 Python 中,调用 torch.jit.load()
进行读取并通过 parameters
获取存储在 module 中的 tensor。
import torch
# 读取单个 tensor
tensor_model = torch.jit.load("tensor.pt")
tensor = list(tensor_model.parameters())[0]
# 读取多个 tensor
tensors_model = torch.jit.load("tensors.pt")
tensora = list(tensors_model.parameters())[0]
tensorb = list(tensors_model.parameters())[1]
tensorc = list(tensors_model.parameters())[2]