33

TensorFlow 中的计算图

 3 years ago
source link: https://www.tuicool.com/articles/jy6Jbqz
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ra22Avn.jpg!web

作者丨stephenDC

编辑 丨 zandy

这是作者的第 19 篇文章

什幺是计算图?

一个机器学习任务的核心是模型的定义以及模型的参数求解方式,对这两者进行抽象之后,可以确定一个唯一的计算逻辑,将这个逻辑用图表示,称之为计算图。 计算图表现为有向无环图,定义了数据的流转方式,数据的计算方式,以及各种计算之间的相互依赖关系等。

计算图的基本组成

TensorFlow的计算图粒度比较细,由节点和有向边组成(后来也加入了层)。相比之下,腾讯的开源机器学习平台Angel,其计算图的粒度较粗,由层(Layer)组成。很明显,粒度越细,灵活性越好;粒度越粗,开发效率越高。用Angel手动搭建模型,层层堆叠,几行代码就够了(事实上,Angel借鉴了Caffe的方式,可以直接读取Json文件,生成深度网络);但限制在于,只能使用官方已经实现的Layer,因此诸如RNN和DNN,Angel目前是不支持的,开发者也无法自己实现。因此,开发者可以根据自己的不同需求,选择相应的平台。

下面,我们简要介绍一下TensorFlow的基本组成,即节点和有向边。

2.1

节点

基于梯度下降求解的机器学习问题,一般分为前向求值和后向求梯度两个过程。其中,前向过程由用户指定,包括模型定义,目标函数、损失函数、激活函数的选取等;后向的计算过程,包括计算梯度,更新梯度等,在优化器中已经由TensorFlow实现,用户不必关心。

前向图中的节点,根据功能主要分为 计算节点(Operation) 、 存储节点(Variable) 和 数据节点(Placeholder) 3类。

Operation: 对应无状态的计算或控制操作,主要负责算法逻辑表达或者流程控制。

Variable: 对应有状态的变量操作,通常用来存储模型参数。

Placeholder: 用于定义输入数据的类型和形状等属性,是对数据的统一抽象。

后向图中的节点,也可以分为3类,如下:

梯度: 迭代过程中,模型参数的梯度。

参数更新操作: 根据优化器的优化算法,结合梯度更新相应的模型参数。

更新后的参数: 更新后的模型参数,用于模型的下一轮训练。

2.2

计算图中的边是有向边,定义了操作之间的关系,分为两类:一类用来传输数据,称为数据边;另一类用来定义依赖关系,称为控制边。

所有的节点都通过数据边或者控制边连接,其中入度为0的节点没有前置依赖,可以立即执行;入度大于0的节点,要等待其依赖的所有节点执行结束之后,才可以执行。

计算图的运行

TensorFlow中可以定义多个计算图,不同计算图上的张量和运算相互独立,因此每一个计算图都是一个独立的计算逻辑。

3.1

图的启动

启动计算图的第一步是创建一个会话(Session)对象,如果没有任何的创建参数,会话构造器将启动默认图。一个Session可以运行多个计算图,一个计算图也可以在多个Session中运行。

3.2

运行方式

简单来说,计算图的运行参考了拓扑排序的思想,可以分为如下4个步骤:

以节点名称作为关键字、入度作为值,创建一张哈希表,并将此计算图中的所有节点放入哈希表中。

为此计算图创建一个可执行节点队列,将哈希表中入度为0的节点加入该队列,并从节点哈希表中删除这些节点。

依次执行队列中的每一个节点,执行成功之后将此节点输出指向的节点的入度减1,更新哈希表中对应节点的入度。

重复 (2) 和 (3) ,直至可执行队列为空。

对于步骤(3)来说,可执行队列中的节点在资源允许的情况下,是可以并行执行。 TensorFlow有灵活的硬件调度机制,来高效利用资源。

3.3

硬件调度

在实现上,TensorFlow 将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(如CPU或GPU)。 一般你不需要显式指定使用CPU还是GPU,TensorFlow 能自动检测。 如果检测到 GPU,TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作。

如果机器上有超过一个可用的 GPU,除第一个外的其它GPU默认是不参与计算的。 为了让TensorFlow使用这些 GPU,开发者可以用with tf.device()语句将Operation明确指派给特定的CPU或GPU 来执行。

参考文献:

《深入理解TensorFlow架构设计与实现原理》 彭靖田、林健、白小龙

http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html

https://blog.csdn.net/dcrmg/article/details/79028032


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK