系统架构
TensorFlow的系统架构,自底向上分为设备层和网络层、数据操作层和图计算层、API层、应用层,其中设备层和网络层、数据操作层、图计算层是TensorFlow的核心层。
下面我们就自底向上地详细地介绍以下TensorFlow的系统架构。因为只有这样我们才能明白它的工作原理,更好地应用到我们的实际场景中去。最下层是网络通信层和设备管理层。网络通信层包括gRPC(googleRemoteProcedureCallProtocol)和远程直接数据存取,这都是在分布式计算时需要用到的。设备管理层包括TensorFlow分别在CPU、GPU、FPGA等设备上的实现,也就是对上层提供了一个统一的接口,使上层只需要处理卷积等逻辑,而不需要关心在硬件上的卷积的实现过程。
其上是数据操作层,主要包括卷积函数、激活函数等操作。再往上是图计算层,这一层是我们需要了解的核心内容,包括本地计算图和分布式计算图的实现。再往上是API层和应用层。
设计理念
TensorFlow的设计理念主要体现在以下两个方面。
将图的定义和图的运行完全分开。因此,TensorFlow被认为是一个“符号主义”的库。我们知道,编程模式通常分为命令式编程和符号式编程。命令式编程就是编写我们理解的通常意义上的程序,很容易理解和调试,按照原有逻辑执行。符号式编程涉及很多的嵌入和优化,不容易理解和调试,但运行速度有所提升。现有的深度学习框架中,Torch是典型的命令式的,Caffe、MXNet采用了两种编程模式混合的方法,而TensorFlow完全采用符号式编程。符号式计算一般是先定义各种变量,然后建立一个数据流图,在数据流图中规定各个变量之间的计算关系,最后只需要对数据流图进行编译,但此时的数据流图还是一个空壳,里面没有任何实际数据,只有把需要运算的输入放进去后,才能在整个模型中形成数据流,从而形成输出值。比如,我们来看一个具体的实例:
这一段代码可以说是异常简单了,我们很清楚在传统的程序操作中,定义了t的运算,在运行时就执行了,并输出结果为17。然而在TensorFlow中,数据流图中的节点实际上对应的是TensorFlowAPI中的一个操作,并没有真正去运行:
我们可以看到,定义了一个操作之后,但是实际上并没有运行。
由此可见,TensorFlow中涉及的运算都要放在图中,而图的运行只发生在会话(session)中。开启会话后,就可以用数据去填充节点,进行运算;关闭会话后,就不能进行计算了。因此,会话提供了操作运行和Tensor求值的环境。下面,我们再来看一个例子:
使用了会话的方式,我们就能够进行正常的运算了。了解了设计理念之后,我们将在下面继续讲解TensorFlow的编程模型。