阅读(2.6k) 书签 (0)

PyTorch C ++ API

2020-09-11 11:25 更新
原文: https://pytorch.org/cppdocs/

这些页面提供了 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 接口(这是我们最稳定和最受支持的接口)时使用。

en

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 提供的张量的可微性,必须使用 <cite>torch ::</cite> 命名空间中的张量工厂函数,而不是位于::: 命名空间中的<cite>。 例如,使用<cite>在:: ones</cite> 创建的张量将是不可微的,而使用 <cite>Torch :: ones</cite> 创建的张量将是可微的。</cite>

C ++前端

PyTorch C ++前端为神经网络以及一般的机器学习研究和生产用例提供了一个高级的纯 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 ++前端相关的 <cite>torch ::</cite> 命名空间的相关部分包括 torch :: nn ,  torch :: optim 和 [torch :: data  , torch :: serialize , torch :: jit 和 torch :: python 。 C ++前端的示例可以在该存储库的中找到,该存储库正在持续不断地扩展。

注意

除非有特殊原因要专门限制自己使用 ATen 或 Autograd API,否则 C ++前端是 PyTorch C ++生态系统的推荐入口点。 尽管它仍处于测试阶段,因为我们收集了您的用户反馈,但与 ATen 和 Autograd API 相比,它提供了更多的功能和更好的稳定性保证。

torch脚本

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 编译器。

C ++扩展

C ++扩展提供了一种简单而强大的方法来访问上述所有接口,以扩展 PyTorch 的常规 Python 用例。 C ++扩展最常用于在 C ++或 CUDA 中实现自定义运算符,以加快对原始 PyTorch 设置的研究。 C ++扩展 API 不会向 PyTorch C ++ API 添加任何新功能。 相反,它提供了与 Python setuptool 以及 JIT 编译机制的集成,该机制允许从 Python 访问 ATen,autograd 和其他 C ++ API。