翻译自 PyTorch 官方文档:https://pytorch.org/cppdocs/index.html#acknowledgements
根据 PyTorch 官方文档 的介绍,PyTorch的C++ API可以粗略分为以下五个部分:
ATen 是一个基础的张量库,几乎所有 PyTorch 中的 Python 和 C++ 接口的以此为基础。ATen 提供了一个核心的 Tensor
类,并定义了它的几百种操作。大部分这些操作既可以在 CPU 上进行,也可以在 GPU 上进行。Tensor
类可以根据其类型动态地调度它们。一个 ATen 的小例子:
#include
at::Tensor a = at::ones({2, 2}, at::kInt);
at::Tensor b = at::randn({2, 2});
auto c = a + b.to(at::kInt);
Tensor
类在 ATen 中所有其他的符号都可以在 at::
命名空间中,可参考文档。
Autograd 是 PyTorch 的 C++ API 的一部分,它通过增加自动求导功能扩展增强了 Tensor
类。自动求导系统记录了 Tensor 的操作来形成一张自动求导图。并在该图的叶节点上调用 backward()
通过跨越图中的函数和张量网络执行反向模式微分,最终产生梯度。以下是一个示例:
#include
#include
torch::Tensor a = torch::ones({2, 2}, torch::requires_grad());
torch::Tensor b = torch::randn({2, 2});
auto c = a + b;
c.backward(); // a.grad()将会保存c关于a的导数
ATen 中的类 at::Tensor
默认是不可微的。要添加 Autograd API 提供的张量的可微性,要使用torch::
命名空间而不是 at::
命名空间的张量工厂函数。也就是说,使用 at::ones
创建的张量是不可微的,但使用torch::ones
创建的张量是可微的。
PyTorch C++ 前端为神经网络和通用 ML(机器学习)研究和生产用例提供了一个高级的纯 C++ 建模接口,在设计和提供的功能上很大程度上与 Python API 保持一致。C++ 前端包括以下内容:
torch.nn.Module
)定义机器学习模型的接口;torch.utils.data.DataLoader
);torch.nn.parallel.DataParallel
);有关C++ 前端的更详细说明,可参阅此文档。 与 C++ 前端相关的torch::命名空间的相关部分包括torch::nn、 torch::optim、 torch::data、 torch::serialize、 torch::jit 和torch::python。C++ 前端的示例可以在此存储库中找到,该存储库正在持续且积极地扩展。
一般不推荐用 ATen 和 Autograd,除非有定制化的需求,否则建议直接使用更稳定的 C++ 前端。
TorchScript 是一种 PyTorch 模型的表示,可以被 TorchScript 编译器理解、编译和序列化。从根本上说,TorchScript 本身就是一种编程语言。它是使用 PyTorch API 的 Python 子集。TorchScript 的 C++ 接口包含三个主要功能:
如果您想尽可能在 Python 中定义模型,但随后将它们导出到 C++ 以用于生产环境和非 Python 推理,则第一种机制可能对您很感兴趣。您可以通过此链接了解更多信息。第二个 API 涉及您希望使用自定义算子扩展 TorchScript 的场景,这些算子同样可以在推理期间从 C++ 序列化和调用。最后,torch::jit::compile 函数可用于直接从 C++ 访问 TorchScript 编译器。
C++ Extension 提供了一种访问上述所有接口的简单而强大的方法,目的是扩展 PyTorch 的常规 Python 用例。C++ 扩展最常用于在 C++ 或 CUDA 中实现自定义算子。C++ 扩展 API 没有向 PyTorch C++ API 添加任何新功能。而是提供了与 Python setuptools 的集成以及允许从 Python 访问 ATen、Autograd 和其他 C++ API 的 JIT 编译机制来进行自定义扩展。要了解有关 C++ 扩展 API 的更多信息,请阅读 本教程。
Ref:
https://pytorch.org/cppdocs/index.html#acknowledgements