1 主流深度学习框架对比
当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层。好比开发Linux Driver会基于Linux kernel,开发Android app会基于Android Framework。深度学习也不例外,框架层为上层模型开发提供了强大的多语言接口、稳定的运行时、高效的算子,以及完备的通讯层和设备层管理层。所以,各大公司早早的就开始了深度学习框架的研发,以便能占领市场。当前的框架有数十种之多,主流的以下(截止到2018年11月)前端

显然TensorFlow是独一无二的王者。第二名Keras,它是对TensorFlow或Theano接口的二次封装,严格意义上并非一个独立的深度学习框架。TensorFlow目前也已经集成了Keras,使得安装了TensorFlow的用户就能够直接使用Keras了。编程
TensorFlow之因此可以从数十种框架中脱颖而出,主要优势有后端
- 出身高贵,是谷歌出品的。但其余不少框架出身也不差,例如PyTorch之于Facebook,MXNET之于Amazon
- 2015年就开源了,比较早的俘获了一大批开发者。这个确实是tf的一大先发优点,但PyTorch的前身Caffe,以及MXNET开源时间都不晚,并且Caffe流行时间比tf早,后来才被赶超的。更有Theano这样的绝对老前辈。因而可知,软件开源是多么重要。目前流行的深度学习框架也基本都开源了。
- 支持的开发语言多,支持Python Java Go C++等多种流行语言。相比某些框架,确实是优点很大。相比MXNET则小巫见大巫了。MXNET早期发展的一个主要方向就是前端多语言的支持,连MATLAB R Julia等语言都支持了。
- 运行效率高。早期的时候,其实tf的运行效率比不少框架都要低一些的。
- 安装容易,用户上手快,文档齐全,社区活跃。这个是tf的一个较大优点,特别是社区方面,也就是咱们常说的生态优点。互联网头部集中效应十分明显,体如今开源软件上也是同样。这也是我认为最大的一个优点。
总结起来,TensorFlow虽然每一个方面都不是绝对领先的优点,但贵在每一个方面都作的不错,所以最终可以一骑绝尘,独领风骚。session
学习Tensorflow框架内核,能够理解前端接口语言的支持,session生命周期,graph的构建、分裂和执行,operation的注册和运行,模块间数据通讯,本地运行和分布式运行模式,以及CPU GPU TPU等异构设备的封装支持等。学习这些,对于模型的压缩 加速 优化等都是大有裨益的。
架构
2 TensorFlow系统架构
TensorFlow设计十分精巧,基于分层和模块化的设计思想进行开发的。框架以下图app

整个框架以C API为界,分为前端和后端两大部分。框架
- 前端:提供编程模型,多语言的接口支持,好比Python Java C++等。经过C API创建先后端的链接,后面详细讲解。
-
后端:提供运行环境,完成计算图的执行。进一步分为4层编程语言
- 运行时:分为分布式运行时和本地运行时,负责计算图的接收,构造,编排等。
- 计算层:提供各op算子的内核实现,例如conv2d, relu等
- 通讯层:实现组件间数据通讯,基于GRPC和RDMA两种通讯方式
- 设备层:提供多种异构设备的支持,如CPU GPU TPU FPGA等
模型构造和执行流程
TensorFlow的一大特色是,图的构造和执行相分离。用户添加完算子,构建好整图后,才开始进行训练和执行,也就是图的执行。大致流程以下分布式
- 图构建:用户在client中基于TensorFlow的多语言编程接口,添加算子,完成计算图的构造。
- 图传递: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协议。

3 前端多语言实现 - swig包装器
TensorFlow提供了不少种语言的前端接口,使得用户能够经过多种语言来完成模型的训练和推断。其中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动态连接库,它里面包含了全部运行时接口的符号。而pywrap_tensorflow_internal.cc中,则注册了一个函数符号表,实现Python接口和C接口的映射。运行时,就能够经过映射表,找到Python接口在C层的实现了。

4 tensorflow 源码结构
TensorFlow源码基本也是按照框架分层来组织文件的。以下

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

5 总结
TensorFlow框架设计精巧,代码量也很大,咱们能够从如下部分逐步学习
- TensorFlow内核架构和源码结构。先从全局上对框架进行理解。
- 先后端链接的桥梁--Session,重点理解session的生命周期,并经过相关源码能够加深理解Python前端如何调用底层C实现。
- TensorFlow核心对象—Graph。图graph是TensorFlow最核心的对象,基本都是围绕着它来进行的。graph的节点为算子operation,边为数据tensor。
- TensorFlow图的节点 -- Operation。operation是图graph的节点,承载了计算算子。
- TensorFlow图的边 -- Tensor。Tensor是图graph的边,承载了计算的数据。
- TensorFlow本地运行时。
- TensorFlow分布式运行时。和本地运行时有一些共用的接口,但区别也很大。
- TensorFlow设备层。主要了解设备层的定义规范,以及实现。
- TensorFlow队列和并行运算。
- TensorFlow断点检查checkpoint,模型保存Saver,以及可视化tensorboard。这三个为TensorFlow主要的工具。
原文连接本文为云栖社区原创内容,未经容许不得转载。