PyTorch C++ API#
这些页面提供了 PyTorch C++ API 公共部分的代码文档。该 API 大致可以分为五个部分:
ATen:所有其他部分的基础,是基础张量(tensor)和数学运算库。
Autograd:为 ATen 添加了自动微分功能。
C++ Frontend:用于训练和评估机器学习模型的高级构造。
TorchScript:与 TorchScript JIT 编译器和解释器的接口。
C++ Extensions:通过自定义 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++ Frontend#
PyTorch C++ frontend 提供了一个高级的、纯 C++ 的建模接口,用于神经网络和通用的机器学习(ML)研究和生产用例,在设计和提供的功能上很大程度上遵循了 Python API。C++ frontend 包括以下内容:
一种通过分层模块系统定义机器学习模型(类似于
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++ frontend 的更详细描述,请参阅 本文档。与 C++ Frontend 相关的 torch:: 命名空间的部分包括 torch::nn、torch::optim、torch::data、torch::serialize、torch::jit 和 torch::python。C++ frontend 的示例可以在 此仓库 中找到,该仓库正在持续积极地扩展。
注意
除非你有特定原因要严格限制自己仅使用 ATen 或 Autograd API,否则 C++ frontend 是 PyTorch C++ 生态系统的推荐入口点。虽然它仍在 beta 阶段,供我们收集用户反馈(来自你!),但它提供了比 ATen 和 Autograd API 更多的功能和更好的稳定性保证。
TorchScript#
TorchScript 是 PyTorch 模型的一种表示形式,可以被 TorchScript 编译器理解、编译和序列化。本质上,TorchScript 本身就是一种编程语言。它是使用 PyTorch API 的 Python 子集。TorchScript 的 C++ 接口包含三个主要功能:
一种加载和执行在 Python 中定义的序列化 TorchScript 模型的方法;
一个用于定义自定义运算符的 API,这些运算符扩展了 TorchScript 的操作标准库;
从 C++ 对 TorchScript 程序进行即时编译。
如果你希望尽可能多地在 Python 中定义模型,然后将其导出到 C++ 以用于生产环境和无 Python 推理,那么第一种方法可能对你很有吸引力。你可以通过 此链接 了解更多信息。第二种 API 涉及你希望用自定义运算符扩展 TorchScript 的场景,这些自定义运算符可以类似地序列化并在推理过程中从 C++ 调用。最后,torch::jit::compile 函数可用于直接从 C++ 访问 TorchScript 编译器。