范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

动手学深度学习框架(2)python端如何调用c的代码

  0 前言
  朋友们好,欢迎来到深度学习框架系列专题。在上一篇文章中,我抛出了一系列问题,算是本专题的序言了,今天我们将正式开启 paddle 学习之旅,去了解它的实现原理和技术细节。对于本文的选题,我想了许久,最后还是觉得讲讲『python 端如何调用 c++ 的代码』最为合适,阅读深度学习框架源码,不管是 pytorch 还是 tensorflow,这都是绕不开的,也是最基础的。试想:如果一个新手看着 python 端的一行行代码,却不知道它是在哪定义的,函数体里内容是什么,岂不是抓狂~
  1 什么是 pybind?
  pybind11 是一个轻量级的只包含头文件的 c++ 库,用于将你的 c++ 代码暴露给 python 调用(反之亦可,但主要还是前者)。pybind11 借鉴了  Boost::Python    库的设计,但使用了更为简洁的实现方式,使用了大量 c++11 的新特性,更易于使用。
  2 paddle 中 python 端是如何调用 c++ 代码的?
  关于 pybind 的原理,网上已经有不少文章已经介绍过了,不再赘述,这里主要讲下 paddle 框架中 python 和 c++ 端是如何绑定的。
  示例 1
  首先,我们来看一个最基础的,也是最常见的用法。Program 是 paddle 框架中用来描述 神经网络的结构,如果要使用 paddle 分布式训练功能,首先得实例化一个 Program 对象。import paddle.fluid as fluid program = fluid.Program()
  很明显,Program 是 python 中的一个类,它的定义是在文件 python/paddle/fluid/framework.py 里,代码如下: class Program(object):     def __init__(self):         self.desc = core.ProgramDesc()     ...
  由上述代码可知,实例化 Python Program 对象时,实际上调用的是 core 里的 ProgramDesc. 接着,我们先来看看 python/paddle/fluid/core.py 中干了啥: from ctypes import cdll cdll.LoadLibrary(core_avx.so)
  什么意思呢?paddle c++ 代码编译完之后生成 core_avx.so 文件,而当我们安装完 paddle wheel 包之后,python/paddle/fluid 目录下就会有 core_avx.so. 也就是说,core.py 文件的主要功能就是加载 c++ 端的 so. 那 python 端的 ProgramDesc 类型又是在哪定义的呢?答案是protobuf.cc. void BindProgramDesc(pybind11::module *m) {   pybind11::class_(*m, "ProgramDesc", "")       .def(pybind11::init<>())       .def("__init__",            [](pd::ProgramDesc &self, const pd::ProgramDesc &other) {              new (&self) pd::ProgramDesc(other);            })        //...
  到这儿,python 端终于能够访问到 c++ 端的类型了,即 pd::ProgramDesc ,其中,namespace pd = paddle::framework.
  示例 2
  我们再来看看 executor.py 中的用法。 from . import core g_scope = core.Scope() assert isinstance(scope, core._Scope) var = scope.find_var(_to_name_str(name))
  这个 Scope() 又是什么呢?pybind.cc 文件中有如下定义: PYBIND11_MODULE(core_avx, m) {       m.def("Scope",         []() -> Scope * {           auto *s = new Scope();           ScopePool::Instance().Insert(std::unique_ptr(s));           return s;         },         R"DOC(         Create a new scope.          Returns:             out (core._Scope): the created scope.         )DOC",         py::return_value_policy::reference);         //... }
  PYBIND11_MODULE 这个宏用来告诉 python: import 神马,"core_avx" 是这个 module 的名字,"m" 是一个 py::module 类型的变量,可以理解成代表 module 本身, "module::def()",也就是 "m.def",用来定义 python 端的接口函数。
  上述代码中绑定了 python 端 Scope() 和 c++ 中的函数(lambda 表达式)。进一步发现,调用 python 函数的返回值显然是 python 端的,也就是 _Scope,而它对应的也就是 c++ 端的 Scope 类,绑定代码如下: py::class_(m, "_Scope", R"DOC(     Scope is an association of a name to Variable. All variables belong to Scope.      Variables in a parent scope can be retrieved from local scope.      You need to specify a scope to run a Net, i.e., `exe.Run(&scope)`.     One net can run in different scopes and update different variable in the     scope.      You can create var in a scope and get it from the scope.      Examples:         .. code-block:: python            import paddle.fluid as fluid           # create tensor from a scope and set value to it.           param = scope.var("Param").get_tensor()           param_array = np.full((height, row_numel), 5.0).astype("float32")           param.set(param_array, place)          )DOC")       .def("_remove_from_pool",            [](Scope &self) { ScopePool::Instance().Remove(&self); })       .def("var",            [](Scope &self, const std::string &name) -> Variable * {              return self.Var(name);            },            py::arg("name"),            R"DOC(            Find or create variable named :code:`name` in the current scope.             If the variable named :code:`name` does not exist in the            current scope, the variable would be created. Otherwise,            return the existing variable.             Args:                name (str): the variable name.             Returns:                out (core.Variable): the found or created variable.            )DOC",            py::return_value_policy::reference)            //...
  示例 3
  再来看一个嵌套的例子: ExecutionStrategy = core.ParallelExecutor.ExecutionStrategy BuildStrategy = core.ParallelExecutor.BuildStrategy if self._build_strategy is None:     self._build_strategy = BuildStrategy() self._build_strategy.is_distribution = _is_pserver_mode(self._program)
  上述代码中的 BuildStrategy 类型绑定的又是 c++ 端哪个函数呢?在 pybind.cc 文件中有如下定义: py::class_ pe(m, "ParallelExecutor"); py::class_ exec_strategy(pe, "ExecutionStrategy", R"DOC( ... )
  记住:paddle 框架代码中,core、core_avx 都是 python 的 module. 除了 pybind.cc、protobuf.cc 之外,paddle 中类似地还有 data_set_py.cc 等文件中也定义了 python 与 c++ 的绑定关系。
  另外要注意的是,paddle 中并不是每一个 python 类型、函数或变量都是调用 c++ 端的,paddle 框架中也有许多 python 代码,它们的作用要么调用后端 c++ 代码,要么封装一些 c++ 功能,或者用 python 实现部分功能,以便给用户提供简洁、便捷的 api.

喵喵机家用学习打印机F1评测,免墨且支持有线无线A4打印对大多数商务办公人群而言,打印机并不陌生,虽然提倡无纸化办公,但不可否认很多时候我们依然需要打印。就拿当下孩子的成长学习而言,老师一天天地让打印各站学习资料,要不然就是承诺书啥的,一审判决判决公布长电科技追讨比特币厂商逾8000万欠款获支持A股封测龙头长电科技与昔日矿机芯片厂商芯动公司的互诉案件迎来进展,上市公司主要诉请获法院一审判决支持。另一方面,长电科技起诉同行拟上市公司甬矽电子窃密挖人。追讨比特币厂商8716万不花一分钱,让电脑空间免费新增300G!这一招你学会了没?你的硬盘空间够使唤吗?如果不够,今天小编就跟大家分享一个方法,免费新增300G!有了它,就再也不用担心空间不够了所谓不花一分钱就能新增空间,其实就是把云盘挂载成本地磁盘。简单来说,组装电脑,买什么主板好?如果考虑自行DIY电脑主机,尽量选择台系的华硕技嘉微星华擎等大厂主板产品,一般大主板厂商拥有独立的研发团队,研发实力非常强,和上游芯片厂商关系较好,主板产品的设计做工用料和兼容性方团车进入电动汽车制造领域新能源汽车补贴退坡团车进入电动汽车制造领域新能源汽车补贴退坡28。66万起广汽埃安AIONLXPLUS上市1月5日,广汽埃安AIONLXPLUS通过2022年首场元宇宙新车发布会正式上市,新车共分815种清洁模式,同同家T9U电动牙刷真实洁牙体验哈喽,大家好我是西言。刷牙是每天都要做的事情,洁白的牙齿一方面提升年轻人的自信,另一方面能最大程度保证牙齿的健康。在做自媒体之前我是真没有考虑过电动牙刷这个事情,但是接触之后我深深适合中小团队办公协作和沟通的工具有哪些?其实国内外现在都有许多不错的协同平台,但大小不一的团队,不同的工作流程,各式各样的需求,都会影响团队应该选择什么样的平台,所以一定要选择适合自己的。我现在做的氢协作的任务板块非常的为什么不能把互联网交易用火车和马车比较国内一提到互联网交易,网络购物。总有人喜欢用火车取代马车的例子来比较。众所周知。火车的速度,以及运载力不是马车能比较的,火车取代马车是生产力的提升,反观电商,网络平台交易是什么,是数字人民币App在应用商店全面上架,十个城市可以使用11月4日,内蒙古首个5G无人驾驶新能源矿用车项目正式投产。狮评内蒙古铁辰智能装备有限公司总投资10亿元的5G无人驾驶新能源矿用车项目,可在矿山场景实现精准平稳地自动装载运输停靠自兆新股份,九安医疗,兆易创新,美锦能源,莱茵体育,京东方加油露笑科技第三代半导体总龙头。莱茵体育是房地产概念和冰雪概念的叠加,走的非常强势。美锦能源是氢能源概念,不如京城股份牛。旗天科技是数字货币概念。京东方是面板行业科技巨头。九安医疗还在中国科技自主让世界不安?美国代表不了全世界文行走斯图卡随着中国不断进步,华盛顿的敌意也越来越浓烈,已经发展到只要是中国就一定没有好话的程度美国政府的喉舌美国之音日前就刊登了一篇让人莫名其妙的文章,扬言中国寻求科技自主发展让
手机如何恢复出厂设置这段时间去忙于其它方面,很少发帖子。有很多粉丝朋友私信给我说,手机用了几年以后内存都满了,简直不能用了老卡老卡的,怎么处理?今天我就来分享一篇这个问题的帖子,让大家解决这个令人头疼手机文档直接打印,米家连供打印一体机一键直连全家都能用居家办公,延迟开学,开始网课相信很多家长在看到这类消息时就直接蒙了吧,有学生的家庭也一定被打印这件事困扰过,无论是日常的学习资料,还是彩色健康码行程码都得打印。先别慌,首先我们得积海信墨水屏手机发布1799元起售搭载骁龙662昨日晚间,国产家电品牌海信举办了新品发布会,不过这次并不是发布家电产品,而是带来了一款颇为独特的手机新品。海信的这款手机型号为A9,正面采用了一块6。1英寸的单色墨水屏,也就是说它手机与汽车交互,CarPlay和CarLife哪个好用?日更第36551天。大家好,我是大船,今天和大家聊聊手机和汽车的交互。在以前老一点的汽车上,手机和汽车上的车机是不能交互的,汽车的车机一般只有一些操作汽车的功能,缺乏足够的娱乐性,5个手机必备的实用APP,我越用越喜欢哈喽大家好呀,不知道你们的手机一般使用最多的APP是哪些呢?今天我给大家分享5款手机必备的实用APP,我越用越喜欢。01。波点音乐说到手机必备,我觉得听用来音乐的APP是不可少,波IP属地功能上线应同步加强监管近日,为减少冒充热点事件当事人恶意造谣蹭流量等不良行为,确保传播内容真实透明,微博知乎抖音等网络平台纷纷上线显示用户IP属地功能,用户发送内容时显示IP属地,境外显示国家,境内显示天猫公布618助力商家举措首次上线直播间专享权益北京商报讯(记者何倩)5月13日,天猫公布25条天猫618助力商家举措,包括金融补贴物流疏通流量补贴疫情特别举措和技术升级。值得注意的是,天猫618将首次上线直播间专享权益,可叠加OPPOColorOS率先适配安卓13,开发者预览版已上线谷歌将在5月12日凌晨正式发布新一代安卓13系统。今日,OPPOColorOS官方宣布,ColorOS现已适配Android13,首批机型OPPOFindNOPPOFindX5Pr华为鸿蒙系统推出新版本,上线这些实用的新功能华为鸿蒙系统自上线以来就受到了网友的好评,而且有消息称最新的鸿蒙3。0系统将会在今年7月份正式发布,也让广大网友们非常期待。最近,鸿蒙2系统又发布了一个小版本的更新,而且上线了一些荣耀CEO赵明折叠机市场明年将增长510倍,5年后荣耀手机海外出货量超国内品玩5月12日讯,据日经新闻报道,近日,荣耀CEO赵明接受采访时表示,概述了荣耀的发展计划。他说基本上,在去年之后,我们所有的海外市场份额都降到了几乎为零,现在是从头开始的时候了。科技早报中芯国际一季度收入同比增66。9ARM上市后软银计划保留多数股权中芯国际一季度收入同比增66。95月12日,中芯国际发布一季度业绩,其实现营收18。4亿美元,同比增长66。9,环比增长16。6净利润4。47亿美元,同比增长181。5,环比下降1