PyTorch C++ API#

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

  • ATen:基础张量和数学运算库,所有其他功能均构建于此之上。

  • Autograd:为 ATen 增强了自动微分功能。

  • C++ Frontend (C++ 前端):用于机器学习模型训练和评估的高层构建块。

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

  • C++ Extensions (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 图。在该图的叶子变量上调用 backwards() 将通过跨越 autograd 图的函数和张量网络执行反向模式微分,最终产生梯度。以下示例展示了该接口的用法:

#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++ Frontend (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++ 前端的更详细描述,请参阅此文档torch:: 命名空间中与 C++ 前端相关的部分包括 torch::nn, torch::optim, torch::data, torch::serialize, torch::jit 以及 torch::python。C++ 前端的示例可以在此仓库中找到,该仓库正在持续且积极地扩展中。

注意

除非您有特别的理由需要仅限于使用 ATen 或 Autograd API,否则 C++ 前端是进入 PyTorch C++ 生态系统的推荐入口。虽然在收集用户反馈(来自您!)期间它仍处于 beta 阶段,但它比 ATen 和 Autograd API 提供了更多功能和更好的稳定性保证。

TorchScript#

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

  • 一种加载并在 C++ 中执行在 Python 中定义并序列化的 TorchScript 模型的机制;

  • 一个用于定义自定义算子的 API,用以扩展 TorchScript 的标准操作库;

  • 在 C++ 中对 TorchScript 程序进行即时 (JIT) 编译。

如果您希望尽可能在 Python 中定义模型,随后将其导出到 C++ 以用于生产环境和无 Python 推理,那么第一个机制会对您非常有帮助。您可以点击此链接了解更多信息。第二个 API 关注的是您希望使用自定义算子扩展 TorchScript 的场景,这些算子同样可以被序列化并在推理期间从 C++ 中调用。最后,可以使用 torch::jit::compile 函数直接从 C++ 访问 TorchScript 编译器。

C++ Extensions (C++ 扩展)#

C++ Extensions 提供了一种简单而强大的方式,可以通过访问上述所有接口来扩展 PyTorch 的常规 Python 用例。C++ 扩展最常用于用 C++ 或 CUDA 实现自定义算子,以加速原生 PyTorch 设置中的研究。C++ 扩展 API 没有为 PyTorch C++ API 增加任何新功能。相反,它提供了与 Python setuptools 的集成以及 JIT 编译机制,允许从 Python 访问 ATen、autograd 和其他 C++ API。要详细了解 C++ 扩展 API,请阅读此教程

目录#

索引与表格#

致谢#

这个 PyTorch C++ 世界的文档网站使用 Sphinx C++ 域进行 API 文档编写。