Tensorflow源码解析1 — 内核架构和源码结构

2023-05-29 0 548

1 非主流广度自学构架对比

现今的应用软件合作开发基本上都是多层化和模组化的,网络层合作开发会如前所述构架层。比如合作开发Linux Driver会如前所述Linux kernel,合作开发Android app会如前所述Android Framework。广度自学也不值得一提,构架层为下层数学模型合作开发提供了强大的多词汇USB、稳定的运转时、高效率的微分,和完整的通信层和电子设备层高层。因而,数十家公司匆匆忙忙的就开始了广度自学构架的研发,以便能占领市场。当前的构架有数百种之多,非主流的如下(截止到2018年11月)

Tensorflow源码解析1 — 内核架构和源码结构

显然TensorFlow是独有的战神。第三名Keras,它是对TensorFlow或TheanoUSB的二次PCB,严格意义上并并非两个独立的广度自学构架。TensorFlow现阶段也已经软件系统了Keras,使得加装了TensorFlow的使用者就可以直接使用Keras了。

TensorFlow之所以能从数百种构架中十强,主要缺点有

出身高贵,是Google公司出品的。但其他许多构架出身也极好,例如PyTorch奥尔奈Facebook,MXNET奥尔奈Amazon2015年就开放源代码了,比较早的掳获了一批合作开发人员。这个的确是tf的一大三垒手竞争优势,但PyTorch的创建者Caffe,和MXNET开放源代码天数都远早,而且Caffe盛行天数比tf早,后来才被迎头赶上的。更有Theano这样的当然前辈。由此看来,应用软件开放源代码是多么重要。现阶段盛行的广度自学构架也基本上都开放源代码了。全力支持的合作开发词汇多,全力支持Python Java Go C++等多种盛行词汇。较之某些构架,的确是竞争优势很大。较之MXNET则有过之而无不及了。MXNET晚期发展的两个主要方向就是后端多词汇的全力支持,连MATLAB R Julia等词汇都全力支持了。运转成本低。晚期的时候,其实tf的运转效率比许多构架都要低一些的。加装容易,使用者上五小时,文件格式齐备,街道社区活跃。这个是tf的两个较大竞争优势,特别是街道社区各方面,也就是我们常说的自然生态竞争优势。互联网颈部集中效应十分明显,体现在开放源代码应用软件上也是一样。这也是我认为最大的两个竞争优势。

总结起来,TensorFlow虽然每一各方面都并非当然领先的竞争优势,但Alzonne每一各方面都做的不错,因而最终能一骑战到,一枝独秀。

自学Tensorflow构架Mach,可以理解后端USB词汇的全力支持,session开发周期,graph的构筑、分裂和执行,operation的注册登记和运转,组件间网络设备,邻近地区运转和分布式系统运行模式,和CPU GPU TPU等直链电子设备的PCB全力支持等。自学这些,对于数学模型的填充 加速 优化等都是Lendelin的。

2 TensorFlow系统构架

TensorFlow设计十分精巧,如前所述多层和模组化的设计思想进行合作开发的。构架如下图

Tensorflow源码解析1 — 内核架构和源码结构

整个构架以C API为界,分为后端和后端两大部分。

后端:提供编程数学模型,多词汇的USB全力支持,比如Python Java C++等。通过C API建立前后端的连接,后面详细讲解。后端:提供运转环境,完成计算图的执行。进一步分为4层运转时:分为分布式系统运转时和邻近地区运转时,负责计算图的接收,构造,编排等。计算层:提供各op微分的Mach实现,例如conv2d, relu等通信层:实现组件间网络设备,如前所述GRPC和RDMA两种通信方式电子设备层:提供多种直链电子设备的全力支持,如CPU GPU TPU FPGA等

数学模型构造和执行流程

TensorFlow的一大特点是,图的构造和执行相分离。使用者添加完算子,构筑好整图后,才开始进行训练和执行,也就是图的执行。大体流程如下

图构筑:使用者在client中如前所述TensorFlow的多词汇编程USB,添加微分,完成计算图的构造。图传递:client开启session,通过它建立和master之间的连接。执行session.run()时,将构造好的graph序列化为graphDef后,以protobuf的格式传递给master。图剪枝:master根据session.run()传递的fetches和feeds列表,反向遍历全图full graph,实施剪枝,得到最小依赖子图图分裂:master将最小子图分裂为多个Graph Partition,并注册登记到多个worker上。两个worker对应两个Graph Partition。图二次分裂:worker根据当前可用硬件资源,如CPU GPU,将Graph Partition按照op微分电子设备约束规范(例如tf.device(/cpu:0),二次分裂到不同电子设备上。每一计算电子设备对应两个Graph Partition。图运转:对于每两个计算电子设备,worker依照op在kernel中的实现,完成op的运算。电子设备间网络设备可以使用send/recv节点,而worker间通信,则使用GRPC或RDMA协议。
Tensorflow源码解析1 — 内核架构和源码结构

3 后端多词汇实现 – swig包装器

TensorFlow提供了许多种词汇的后端USB,使得使用者可以通过多种词汇来完成数学模型的训练和推断。其中Python全力支持得最好。这也是TensorFlow之所以受欢迎的一大原因。后端多词汇是怎么实现的呢?这要归功于swig包装器。

swig是个帮助使用C或者C++编写的应用软件能与其它各种高级编程词汇进行嵌入联接的合作开发工具。在TensorFlow使用bazel编译时,swig会生成两个wrapper文件

pywrap_tensorflow_internal.py:对接下层Python调用pywrap_tensorflow_internal.cc:对接底层C API调用。

pywrap_tensorflow_internal.py 组件被导入时,会加载

_pywrap_tensorflow_internal.so动态链接库,它里面包含了所有运转时USB的符号。而

pywrap_tensorflow_internal.cc中,则注册登记了两个函数符号表,实现PythonUSB和CUSB的映射。运转时,就可以通过映射表,找到PythonUSB在C层的实现了。
Tensorflow源码解析1 — 内核架构和源码结构

4 tensorflow 源代码结构

TensorFlow源代码基本上也是按照构架多层来组织文件的。如下

Tensorflow源码解析1 — 内核架构和源码结构

其中core为tf的核心,它的源代码结构如下

Tensorflow源码解析1 — 内核架构和源码结构

5 总结

TensorFlow构架设计精巧,代码量也很大,我们可以从以下部分逐步自学

TensorFlowMach构架和源代码结构。先从全局上对构架进行理解。前后端连接的桥梁–Session,重点理解session的开发周期,并通过相关源代码可以加深理解Python后端如何调用底层C实现。TensorFlow核心对象—Graph。图graph是TensorFlow最核心的对象,基本上都是围绕着它来进行的。graph的节点为微分operation,边为数据tensor。TensorFlow图的节点 — Operation。operation是图graph的节点,承载了计算微分。TensorFlow图的边 — Tensor。Tensor是图graph的边,承载了计算的数据。TensorFlow邻近地区运转时。TensorFlow分布式系统运转时。和邻近地区运转时有一些共用的USB,但区别也很大。TensorFlow电子设备层。主要了解电子设备层的定义规范,和实现。TensorFlow队列和并行运算。TensorFlow断点检查checkpoint,数学模型保存Saver,和可视化tensorboard。这三个为TensorFlow主要的工具。

作者:扬易

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务