PyTorch C++ API libtorch 简介

PyTorch C++ API libtorch 简介

翻译自 PyTorch 官方文档:https://pytorch.org/cppdocs/index.html#acknowledgements

整体划分

根据 PyTorch 官方文档 的介绍,PyTorch的C++ API可以粗略分为以下五个部分:

  • ATen:基础的张量和数学计算库,其他的部分都以此为基础。
  • Autograd:多 ATen 的扩展,包含自动微分功能。
  • C++ Frontend:用于训练和验证机器学习模型的高层架构。
  • TorchScript:TorchScipt JIT 编译器 / 解释器的接口。
  • C++ Extensions:一系列使用 C++ 和 CUDA 例程扩展 Python API 的方法。

ATen

ATen 是一个基础的张量库,几乎所有 PyTorch 中的 Python 和 C++ 接口的以此为基础。ATen 提供了一个核心的 Tensor 类,并定义了它的几百种操作。大部分这些操作既可以在 CPU 上进行,也可以在 GPU 上进行。Tensor 类可以根据其类型动态地调度它们。一个 ATen 的小例子:

#include 

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 的一部分,它通过增加自动求导功能扩展增强了 Tensor 类。自动求导系统记录了 Tensor 的操作来形成一张自动求导图。并在该图的叶节点上调用 backward() 通过跨越图中的函数和张量网络执行反向模式微分,最终产生梯度。以下是一个示例:

#include 
#include 

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()将会保存c关于a的导数

ATen 中的类 at::Tensor 默认是不可微的。要添加 Autograd API 提供的张量的可微性,要使用torch:: 命名空间而不是 at:: 命名空间的张量工厂函数。也就是说,使用 at::ones 创建的张量是不可微的,但使用torch::ones 创建的张量是可微的。

C++ Frontend

PyTorch C++ 前端为神经网络和通用 ML(机器学习)研究和生产用例提供了一个高级的纯 C++ 建模接口,在设计和提供的功能上很大程度上与 Python API 保持一致。C++ 前端包括以下内容:

  • 通过多层模块系统(如torch.nn.Module)定义机器学习模型的接口;
  • 一些已有模块的的常见的建模方法(例如卷积、RNN、BN等)的“标准库”;
  • 优化器 API,包括流行优化器的实现,如 SGD、Adam、RMSprop 等;
  • 一系列表示数据集和数据处理管道的方法,包括在多个 CPU 内核上并行加载数据的功能;
  • 用于保存和加载训练会话 checkpoint 的序列化格式(如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,除非有定制化的需求,否则建议直接使用更稳定的 C++ 前端

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++ Extension

C++ Extension 提供了一种访问上述所有接口的简单而强大的方法,目的是扩展 PyTorch 的常规 Python 用例。C++ 扩展最常用于在 C++ 或 CUDA 中实现自定义算子。C++ 扩展 API 没有向 PyTorch C++ API 添加任何新功能。而是提供了与 Python setuptools 的集成以及允许从 Python 访问 ATen、Autograd 和其他 C++ API 的 JIT 编译机制来进行自定义扩展。要了解有关 C++ 扩展 API 的更多信息,请阅读 本教程。

Ref:

https://pytorch.org/cppdocs/index.html#acknowledgements

你可能感兴趣的:(PyTorch,模型部署,pytorch,c++,深度学习)