TensorFlow:编程模型和重要基本概念

一、有向图

TensorFlow的计算流程是可以采用数据流图,或者说有向图来直观地表达的。就如我们常见的神经网络中的神经细胞示意图一样,数据流图可以直观地告诉我们计算的形态。

有向图也称计算图,每一个运算操作都作为一个节点(node),节点与节点的连接称为边(edge)。其描绘了数据的计算流程,也可以用来便捷地维护、更新状态。

计算图可以映射到不同的硬件或操作平台上。这样统一的架构,TensorFlow可以方便地部署到不同的平台上,例如,可以在手机上跑CV(计算机视觉)模型。

TensorFlow的数据流图形式,还可以应用在通用数值计算和符号计算上,不仅仅拘泥于机器视觉或深度学习。

二、tensor和variable

tensor,张量。在计算图中流动的数据,都称为张量。因而得名TensorFlow。

什么是张量?张量就是一种拥有不同维度的数据结构,我们可以理解为是一个存放数据的容器。张量的维度用阶来表示,0阶张量就是常熟constant;我们常用的数组,就是1阶张量。2阶张量也可以理解为数学中的矩阵,通过x,y两个坐标来唯一确定元素。3阶张量就像在立体几何中取点一样,需要(x,y,z)三个坐标来确定。阶次继续提高,都可以有实际的物理意义。例如,4阶张量通常用来存储图像,5阶通常用于存储视频。

TensorFlow中tensor支持8至64位的int,以及float、double和复数型。

在计算图中,流动的tensor大部分寿命很短,计算一次后即消失,以不占据存储空间。但有些数据是可以被保留下来的,例如模型的参数,variable就是用来保留这些可以被留下来的tensor的,以便后续的使用和更新。

使用TensorFlow的Variable模块,可以调用运算操作。如Assign,AssignAdd,等。

三、Session

TensorFlow的客户端通过session接口模块与master和worker相连。worker再和多个硬件设备相连,比如CPU,GPU。master是负责指导worker的机构。

扫描二维码关注公众号,回复: 3387767 查看本文章

四、通信和设备

TensorFlow支持的设备包括x86架构CPU、手机上的ARM CPU、GPU、TPU。

work可以管理多个设备,每一个设备都有自己的“名字”,其包含了类型、编号、任务号(单击模式下没有)等。如:

单机模式:/job:localhost/device:cpu:0

分布式模式:/job:localhost/task:13/device:gpu:3

我们可以想象,如果只有一个硬件设备,比如自己的PC机,那么计算图就只能依赖关系,按照标准的计算拓扑序的方式来按顺序执行。从上面的计算图我们知道,对于复杂的深度学习网络,这样的执行方式有两个难点:1、那些节点让什么硬件设备去执行;2、如何管理节点间的数据通信。

对于第一个问题,TensorFlow设计了一套为节点分配设备的策略。这个策略对每个节点计算代价模型(比如计算时间,运算量等)。在模拟执行一个节点时,会把每一个能执行这个节点的设备都测试一遍,最后选择一个综合时间最短的设备作为这个节点的运行设备。当然,这样的策略其实是个简单的贪婪策略,不能确保找到全局最优解,但是可以较快地找到一个不错的节点运行方案。除了利用代价模型来遍历外,用户也可以自己给节点分配执行的设备,这是TensorFlow中有的功能。

对于第二个问题,当节点所分配的设备被确定了,整个图就会被划分为许多子图,使用同一个设备并且相邻的节点,就会被划分进同一个子图里。如下图:数据流动的边,会被发送节点和接收节点取代。也就是说,数据通信的问题,其实就转化为发送节点、接收节点的实现问题。TensorFlow的通信机制已经非常优秀,底层的原理可能不需要我们详细研究,我们只需知道它的运行机制是这样的。如果不是单机,是分布式的系统,也非常相似,只是对发送节点和接收节点的底层实现不同。而这一切对于我们使用者而言,不过是敲代码指令的事情罢了,有兴趣有需要的同学可以深入了解。

 

五、容错性和持久化

容错性:分布式TensorFlow的特点。有两种情况下,故障能被检测出来。1)信息传输失败;2)周期性检测worker的心跳失败。

当故障被检测到时,计算图就会被终止并重启。其中,variable node可以被持久化。每一个variable node都会链接一个save node,每隔几轮迭代就会保存一次数据到持久化的存储系统。每个variable node在每次重启时,都会被调用并恢复数据。直白来说,即发生故障重启后,模型的参数可以得以保留,这都得益于数据持久化的功劳。我们只需要知道:不必担心崩溃后模型参数会丢失就好了。

具体的实现原理,适合有兴趣的同学深究。

六、feed node和fetch node

节点是运算操作的实例。所以实例,即某种东西的具体的一个体现的例子。运算操作复杂多样,但在计算图中可以直观鲜明地表示出来,通过计算图的某个节点,我们可以明确地列出这个节点发生的计算是什么,写出它的算式。所以我们说,节点可以称为一个运算操作的实例。就像神经网络中,根据计算图我们可以写出每一个细胞的式子是y=wx+b。

输入数据的节点会连接一个feed node,输出数据的节点会连接一个fetch node。TensorFlow会根据输出自动推算出哪些节点需要被执行。(比如好多个节点,某个节点y=ax+b,计算图中还有c,d,e...,想象计算算式实际上就是flow。则TensorFlow自然知道这一输出只需要经过a,b两个参数的运算)。

 

除了微观上的feed node,input node可以让用户直接指定输入文件系统的路径!如果用feed node,数据必须从客户端取,如果直接使用input node,就可以直接读取本地的文件,提高效率。

七、队列

队列是TensorFlow任务调度的一个重要特性,这个特性让计算图的不同节点异步地执行。当一批数据在运算时,进出通道是空闲的,所以可以在此时读取下一个batch的数据,减少磁盘的I/O阻塞时间。

一个具体的例子:在计算梯度时,异步地计算多个梯度,最后组合成一个复杂的整体梯度。

除了先进先出队列,TensorFlow还实现了洗牌队列,以满足某些机器学习算法对随机性的要求。

八、容器

容器是管理长期变量的一种特殊机制。例如,variable对象就存在容器中。

每一个进程都有一个默认的容器一直存在。使用容器,可以允许不同计算图、不同Session之间共享一些状态值。

九、并行计算

TensorFlow提供了三种不同的并行计算模式:

1)数据并行。如并行计算多个批次的梯度数据,最后合成;

2)模型并行。讲计算图的不同部分放在不同设备上跑,就是一个简单的模型并行。模型并行要求模型本身有大量可以并行,就是说不同子图之间,耦合成都不高或不互相依赖。这比数据并行要求得高多了。

3)流水线并行:和异步的数据并行很像,只不过是在同一个硬件设备上实现并行。大致思路是将计算做成流水线,在一个设备上连续第并行执行,提高设备的利用率。

参考文献:

1、维基百科,tensor:https://en.wikipedia.org/wiki/Tensor

2、黄文坚,《TensorFlow实战》

猜你喜欢

转载自blog.csdn.net/lyxleft/article/details/81482900