PyTorch C++ API#

这些页面提供了 PyTorch C++ API 公开部分的文档。该 API 大致可以分为五个部分

  • ATen:所有其他构建的基础张量和数学运算库。

  • Autograd:通过自动微分增强 ATen。

  • C++ 前端:用于机器学习模型训练和评估的高级结构。

  • TorchScript:与 TorchScript JIT 编译器和解释器的接口。

  • C++ 扩展:一种使用自定义 C++ 和 CUDA 例程扩展 Python API 的方法。

这些构建块结合起来,形成了一个用于张量计算和动态神经网络的强大 C++ 库,该库非常强调 GPU 加速以及快速的 CPU 性能。它目前在 Facebook 的研究和生产中使用;我们期待欢迎更多 PyTorch C++ API 的用户。

警告

目前,C++ API 应该被认为是“beta”稳定版本;我们可能会对后端进行重大破坏性更改,以改进 API,或者为了提供 PyTorch 的 Python 接口,这是我们最稳定和最受支持的接口。

ATen#

ATen 基本上是一个张量库,几乎所有其他 PyTorch 的 Python 和 C++ 接口都是在其之上构建的。它提供了一个核心 Tensor 类,在其上定义了数百个操作。这些操作中的大多数都具有 CPU 和 GPU 实现,Tensor 类将根据其类型动态地分派到这些实现。使用 ATen 的一个小例子可能如下所示

#include <ATen/ATen.h>

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 的部分,它通过有关自动微分的功能增强了 ATen Tensor 类。autograd 系统记录张量上的操作以形成一个autograd 图。在 autograd 图中的叶变量上调用 backwards() 会通过函数和张量网络进行反向模式微分,最终产生梯度。以下示例提供了此接口的示例

#include <torch/csrc/autograd/variable.h>
#include <torch/csrc/autograd/function.h>

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() will now hold the gradient of c w.r.t. a.

ATen 中的 at::Tensor 类默认情况下不可微分。为了添加 autograd API 提供的张量可微性,您必须使用 torch:: 命名空间中的张量工厂函数,而不是 at:: 命名空间。例如,使用 at::ones 创建的张量将不可微分,而使用 torch::ones 创建的张量将是可微的。

C++ 前端#

PyTorch C++ 前端为神经网络和通用机器学习 (ML) 研究和生产用例提供了一个高级的纯 C++ 建模接口,其设计和提供的功能在很大程度上遵循 Python API。C++ 前端包括以下内容

  • 一个用于通过分层模块系统定义机器学习模型的接口(类似于 torch.nn.Module);

  • 一个“标准库”,其中包含用于最常见的建模目的的预先存在的模块(例如卷积、RNN、批量归一化等);

  • 一个优化 API,包括 SGD、Adam、RMSprop 等流行优化器的实现;

  • 一种表示数据集和数据管道的方法,包括以并行方式在许多 CPU 核心上加载数据的功能;

  • 一种用于存储和加载训练会话检查点的序列化格式(类似于 torch.utils.data.DataLoader);

  • 自动将模型并行化到多个 GPU(类似于 torch.nn.parallel.DataParallel);

  • 支持代码,以便使用 pybind11 轻松地将 C++ 模型绑定到 Python;

  • 进入 TorchScript JIT 编译器的入口点;

  • 有用的工具,以促进与 ATen 和 Autograd API 的接口。

请参阅 此文档,以获取 C++ 前端的更详细描述。与 C++ 前端相关的 torch:: 命名空间的各个部分包括 torch::nntorch::optimtorch::datatorch::serializetorch::jittorch::python。C++ 前端的示例可以在 此存储库 中找到,该存储库正在不断扩展和积极维护。

注意

除非您有特别的原因要将自己限制在 ATen 或 Autograd API,否则 C++ 前端是进入 PyTorch C++ 生态系统的推荐入口点。虽然它仍在 beta 版本(因为我们收集用户反馈(来自您!))中,但它比 ATen 和 Autograd API 提供了更多的功能和更好的稳定性保证。

TorchScript#

TorchScript 是 PyTorch 模型的一种表示形式,该模型可以被 TorchScript 编译器理解、编译和序列化。从根本上说,TorchScript 是一种编程语言。它是使用 PyTorch API 的 Python 的一个子集。C++ 与 TorchScript 的接口包含三个主要功能

  • 一种加载和执行在 Python 中定义的序列化 TorchScript 模型;

  • 一个用于定义自定义运算符的 API,这些运算符扩展了 TorchScript 标准操作库;

  • 从 C++ 即时编译 TorchScript 程序。

第一种机制可能对您有很大的兴趣,如果您希望尽可能多地在 Python 中定义您的模型,但随后将其导出到 C++ 以用于生产环境和无 Python 推理。您可以按照 此链接 了解更多信息。第二个 API 涉及您希望使用自定义运算符扩展 TorchScript 的场景,这些运算符可以类似地序列化并在 C++ 推理期间调用。最后,torch::jit::compile 函数可用于直接从 C++ 访问 TorchScript 编译器。

C++ 扩展#

C++ 扩展 提供了一种简单但强大的访问上述所有接口的方法,目的是为了扩展 PyTorch 的常规 Python 用例。C++ 扩展最常用于在 C++ 或 CUDA 中实现自定义运算符,以加速普通 PyTorch 设置中的研究。C++ 扩展 API 没有为 PyTorch C++ API 添加任何新功能。相反,它提供了与 Python setuptools 以及允许从 Python 访问 ATen、autograd 和其他 C++ API 的 JIT 编译机制的集成。

内容#

索引和表格#

致谢#

PyTorch C++ 世界的此文档网站已由 Exhale 项目和维护者 svenevs 投入大量时间和精力而得以实现。我们感谢 Stephen 的工作以及他为 PyTorch C++ 文档提供的帮助。