快捷方式

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 应被视为“测试版”稳定性;我们可能会对后端进行重大更改,以改进 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++ 前端为神经网络和一般 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++ 生态系统的推荐入口点。虽然它仍处于测试阶段,因为我们正在收集用户反馈(来自你!),但它提供的功能和稳定性保证都比 ATen 和 Autograd API 更好。

TorchScript

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

  • 一种机制,用于加载和执行在 Python 中定义的已序列化 TorchScript 模型;

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

  • 从 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 以及 JIT 编译机制的集成,这些机制允许从 Python 访问 ATen、自动微分和其他 C++ API。要了解更多关于 C++ 扩展 API 的信息,请阅读本教程

索引和表格

鸣谢

PyTorch C++ 世界的这个文档网站得益于Exhale项目,以及其维护者svenevs的慷慨投入时间和精力。我们感谢 Stephen 的工作以及他在 PyTorch C++ 文档方面提供的帮助。

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源