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

#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()将会保存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 C++ API libtorch 简介相关推荐

  1. 安装 PyTorch C++ API libtorch 及一个最小例子

    安装 PyTorch C++ API libtorch 及一个最小例子 翻译自:https://pytorch.org/cppdocs/installing.html 我们提供依赖 PyTorch 所 ...

  2. PyTorch导出JIT模型并用C++ API libtorch调用

    PyTorch导出JIT模型并用C++ API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 C++API libtorch运行这个模型 ...

  3. DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略

    DL框架之TensorFlow:TensorFlow Core(低级别TensorFlow API)的简介.安装.使用方法之详细DL框架之TensorFlow:深度学习框架TensorFlow Cor ...

  4. ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略

    ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介.使用方法之详细攻略 目录 一.百度云api 1.api之CV 二.旷视科技(face++)api 1.a ...

  5. OpenCASCADE:拓扑 API之简介

    OpenCASCADE:拓扑 API之简介 Open CASCADE Technology ( OCCT )的拓扑 API包括以下六个包: BRepAlgoAPI BRepBuilderAPI BRe ...

  6. API Server简介

    一.API Server简介 1.1 API Server功能 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是 ...

  7. 身份信息核验API接口简介

    身份信息核验接口可以帮助互联网行业解决用户实名难题,有助于搭建互联网信用体系,促进互联网良性发展.目前,身份信息核验接口广泛的用于注册.实名验证.门禁.酒店登记系统等应用场景.下面,我们来具体的了解下 ...

  8. .NET Framework 中新托管 Direct3D 图形 API 的简介

    .NET Framework 中新托管 Direct3D 图形 API 的简介 发布日期: 12/6/2004 | 更新日期: 12/6/2004 Yahya H. Mirza 和 Henry da ...

  9. OpenTSDB的/ API / PUT(opentsdb的输入的api)简介

    写在前面,这里是补充宇毅的博客内容翻译几篇文档,补充下java代码的一些实现,参考文献和其他文章列表放在末尾 翻译原文档http://opentsdb.net/docs/build/html/api_ ...

最新文章

  1. ActiveMQ依赖JDK版本关系
  2. Java:Object.hashCode()和System.identityHashCode()的区别
  3. css之命名规范 BEM
  4. Android蓝牙开发其二
  5. 《C++ primer》--第10章
  6. 清华毕业生开发新特效编程语言:99 行代码背后 20 多年的故事...
  7. error C2018: unknown character '0xa1'解决方法
  8. 数据结构——最小生成树之克鲁斯卡尔算法(Kruskal)
  9. 【MyBatis学习05】SqlMapConfig.xml文件中的配置总结
  10. Twitter 有权删除去世用户的账号吗?
  11. LFS6.3安装全过程(一)
  12. pfSense®与OPNsense®技术比较
  13. Spring Boot优点和缺点
  14. 小程序: getPhoneNumber功能详解,获取手机号登录 2019
  15. python使用moviepy对视频提取音频和增加音频
  16. 一个完整的Installshield安装程序实例
  17. Android实例-手机安全卫士(四十一)-选择自定义Toast背景
  18. python量化交易第五章
  19. git大文件记录清除解决方案
  20. b站coderwhy老师_购物首页开发

热门文章

  1. MyBatis-Plus_入门试炼03
  2. vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
  3. html实体转换成xa0,关于javascript:反应道具:在JSX动态内容中使用HTML实体?
  4. pipelines mysql_Scrapy爬取豆瓣图书数据并写入MySQL
  5. Python max 函数 - Python零基础入门教程
  6. axis2接收json_AXIS2 如何返回JSON数据
  7. android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...
  8. linux svn 面板,Linux下SVN服务器搭建(CentOS+Subversion)
  9. Linux中fdisk对应的c函数,linux下fdisk命令实战案例之详解
  10. datax oracle mysql_从 MySQL 到 Lindorm时序引擎 的数据迁移