TensorFlow实战(一)- TensorFlow基础
一,TensorFlow基础架构和主要技术特性
二,TensorFlow编程模型
核心概念
1,计算图
计算图描述了数据的计算流程,也负责维护和更新状态,用户可以对计算图的分支进行条件控制和循环控制。
- 节点(node):每个节点描述了一个运算操作(operation),可以有任意多输入和输出。
- 边(edge):流动着数据,边中流动的数据成为张量(tensor)。
- 特殊的边:这种边没有数据流动,称为依赖控制,作用是让它的起始节点执行完之后再执行目标节点,用户可以使用这样的边进行灵活的条件控制。
如下图所示:
2,运算操作
运算操作可以有自己的属,但所有属性必须被预先设置,或者在创建计算图时被推断出来。
运算核是一个运算操作在某个具体硬件(CPU或GPU)上的实现。
TensorFlow内建的运算操作主要如下:
3,运行过程
Session是用户使用TensorFlow时的交互式接口,主要是通过Session的Run方法来执行计算图,过程如下:
- 用户给出需要计算的节点,同时提供输入数据,TensorFlow就会自动寻找需要计算的节点并按照顺序执行它们。
- 对绝大多事用户来说,他们只需创建一次计算图,然后反复执行整个计算图或者其中的部分子图。
在大多数的运算中,计算图会被反复执行多次,而数据也就是tensor并不会被持续保留,只是在计算图中过一遍。但Variable这一特殊的运算操作,可以将过程中的tensor保存,也可进行更新。
实现原理
1,模式
TensorFlow有一个重要的组件client,即客户端,它可以通过Session的接口与master及多个worker相连。其中每个worker可以和多个硬件设备(如CPU和GPU)相连,并负责管理这些硬件。而master则负责指导所有的worker按流程执行计算图。
2,计算顺序
- 单个硬件设备时:计算图会按照依赖关系被顺序执行。当一个节点的所有上游依赖都被执行完时,这个节点就会被加入到ready queue以等待执行。实际上这就是标准的计算拓扑序的方式。
- 多个硬件设备时:稍微有点复杂,难点有二:(1)每个节点该让什么硬件设备执行。(2)如何管理节点间的数据通信。
3,自动求导原理
求解梯度的过程本质上是通过在计算图扩展节点的方式实现的,只不顾求梯度的节点对用户是透明的。求解梯度的原理有:
- 链式法则
- 反向传播算法
如下图所示:
4,其他功能
- TensorFlow支持单独执行子图,用户可以选择计算图中的任意子图,并沿着某些边输入数据,同时从另一边获取输出结果。TensorFlow用节点名加port的形式指定数据。输入数据的节点会连接一个feed node,而输出数据的节点会连接一个fetch node。
- 队列也是TensorFlow任务调度的一个重要特性,它可以让计算图的不同节点异步地执行。
- 容器是TensorFlow中一个特殊的管理长期变量的机制,如Variable对象就是存储在容器中。
性能优化
1,TensorFlow同时支持几种高度优化的第三方计算库
线性代数计算库:
- Eigen
矩阵乘法计算库:
- BLAS
- cuBLAS(CUDA BLAS)
深度学习计算库:
- cuda-convnet
- cuDNN
2,TensorFlow三种加速神经网络训练的并行计算模式
-
数据并行:通过将一个mini-batch的数据放在不同设备上计算,实现梯度计算的并行化。
模型并行:将计算图的不同部分放在不同的设备上运算,可以实现简单的模型并行,其目标在于减少每一轮训练迭代的时间,不同于数据并行同时进行多份数据的训练。
-
流水线并行:和异步的数据并行很像,只不过是在同一硬件设备上实现并行。