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#
我们称之为 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++ 前端#
PyTorch C++ 前端提供了一个高级的、纯 C++ 模型接口,用于神经网络和通用 ML (机器学习) 的研究和生产用例,其设计和提供的功能很大程度上遵循了 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::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++ 接口包含三个主要功能
加载和执行在 Python 中定义的序列化 TorchScript 模型的功能;
一个用于定义扩展 TorchScript 标准操作库的自定义操作符的 API;
从 C++ 进行 TorchScript 程序的即时编译 (JIT)。
如果您想尽可能在 Python 中定义模型,然后将其导出到 C++ 用于生产环境和无 Python 推理,那么第一个机制可能会让您非常感兴趣。您可以按照此链接了解更多信息。第二个 API 涉及您希望使用自定义操作符扩展 TorchScript 的场景,这些操作符同样可以在推理期间从 C++ 序列化和调用。最后,torch::jit::compile 函数可用于直接从 C++ 访问 TorchScript 编译器。