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 <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 简介相关推荐
- 安装 PyTorch C++ API libtorch 及一个最小例子
安装 PyTorch C++ API libtorch 及一个最小例子 翻译自:https://pytorch.org/cppdocs/installing.html 我们提供依赖 PyTorch 所 ...
- PyTorch导出JIT模型并用C++ API libtorch调用
PyTorch导出JIT模型并用C++ API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 C++API libtorch运行这个模型 ...
- DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略
DL框架之TensorFlow:TensorFlow Core(低级别TensorFlow API)的简介.安装.使用方法之详细DL框架之TensorFlow:深度学习框架TensorFlow Cor ...
- ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介、使用方法之详细攻略
ML之API:国内外各大人工智能平台(百度云/华为云/阿里云/Face++等)及其API的简介.使用方法之详细攻略 目录 一.百度云api 1.api之CV 二.旷视科技(face++)api 1.a ...
- OpenCASCADE:拓扑 API之简介
OpenCASCADE:拓扑 API之简介 Open CASCADE Technology ( OCCT )的拓扑 API包括以下六个包: BRepAlgoAPI BRepBuilderAPI BRe ...
- API Server简介
一.API Server简介 1.1 API Server功能 k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是 ...
- 身份信息核验API接口简介
身份信息核验接口可以帮助互联网行业解决用户实名难题,有助于搭建互联网信用体系,促进互联网良性发展.目前,身份信息核验接口广泛的用于注册.实名验证.门禁.酒店登记系统等应用场景.下面,我们来具体的了解下 ...
- .NET Framework 中新托管 Direct3D 图形 API 的简介
.NET Framework 中新托管 Direct3D 图形 API 的简介 发布日期: 12/6/2004 | 更新日期: 12/6/2004 Yahya H. Mirza 和 Henry da ...
- OpenTSDB的/ API / PUT(opentsdb的输入的api)简介
写在前面,这里是补充宇毅的博客内容翻译几篇文档,补充下java代码的一些实现,参考文献和其他文章列表放在末尾 翻译原文档http://opentsdb.net/docs/build/html/api_ ...
最新文章
- ActiveMQ依赖JDK版本关系
- Java:Object.hashCode()和System.identityHashCode()的区别
- css之命名规范 BEM
- Android蓝牙开发其二
- 《C++ primer》--第10章
- 清华毕业生开发新特效编程语言:99 行代码背后 20 多年的故事...
- error C2018: unknown character '0xa1'解决方法
- 数据结构——最小生成树之克鲁斯卡尔算法(Kruskal)
- 【MyBatis学习05】SqlMapConfig.xml文件中的配置总结
- Twitter 有权删除去世用户的账号吗?
- LFS6.3安装全过程(一)
- pfSense®与OPNsense®技术比较
- Spring Boot优点和缺点
- 小程序: getPhoneNumber功能详解,获取手机号登录 2019
- python使用moviepy对视频提取音频和增加音频
- 一个完整的Installshield安装程序实例
- Android实例-手机安全卫士(四十一)-选择自定义Toast背景
- python量化交易第五章
- git大文件记录清除解决方案
- b站coderwhy老师_购物首页开发
热门文章
- MyBatis-Plus_入门试炼03
- vue 单文件组件中,输入template 按 tab 键不能自动补全标签的解决办法
- html实体转换成xa0,关于javascript:反应道具:在JSX动态内容中使用HTML实体?
- pipelines mysql_Scrapy爬取豆瓣图书数据并写入MySQL
- Python max 函数 - Python零基础入门教程
- axis2接收json_AXIS2 如何返回JSON数据
- android 自定义progressbar demo,Android 自定义进度条ColorfulProgressbar,原理简单、效果还行...
- linux svn 面板,Linux下SVN服务器搭建(CentOS+Subversion)
- Linux中fdisk对应的c函数,linux下fdisk命令实战案例之详解
- datax oracle mysql_从 MySQL 到 Lindorm时序引擎 的数据迁移