1 计算图在TensorFlow中,算法都被表示成计算图(computational graphs)。计算图也叫数据流图,可以把计算图看做是一种有向图,图中的节点表示操作,图中的边代表在不同操作之间的数据流动。 如图所示,左边的图表示 在这样的数据流图中,有四个主要的元素: 操作把算法表示成一个个操作的叠加,可以非常清晰地看到数据之间的关系,而且这样的基本操作也具有普遍性。在TensorFlow中,当数据流过操作节点的时候就可以对数据进行操作。一个操作可以有零个或多个输入,产生零个或多个输出。一个操作可能是一次数学计算,一个变量或常量,一个数据流走向控制,一次文件IO或者是一次网络通信。其中,一个常量可以看做是没有输入,只有一个固定输出的操作。具体操作如下所示:
每一种操作都需要相对应的底层计算支持,比如在GPU上使用就需要实现在GPU上的操作符,在CPU上使用就要实现在CPU上的操作符。 张量在计算图中,每个边就代表数据从一个操作流到另一个操作。这些数据被表示为张量,一个张量可以看做是多维的数组或者高维的矩阵。 变量变量是计算图中可以改变的节点。比如当计算权重的时候,随着迭代的进行,每次权重的值会发生相应的变化,这样的值就可以当做变量。在实际处理时,一般把需要训练的值指定为变量。在使用变量的时候,需要指定变量的初始值,变量的大小和数据类型就是根据初始值来推断的。 在构建计算图的时候,指定一个变量实际上需要增加三个节点: 如图所示, 会话在TensorFlow中,所有操作都必须在会话(session)中执行,会话负责分配和管理各种资源。在会话中提供了一个 2 执行在执行的时候,TensorFlow支持两种方式:一种是单机版本,可以在单机上支持多个计算设备,还有一种是分布式版本,支持多机多设备。在TensorFlow刚出来的时候,只支持第一种方式,后来开源了分布式版本。 当client发出 计算设备所有的计算任务最终都将分配到实际的硬件上执行。除了CPU和GPU之外,TensorFlow也支持自定义硬件,比如谷歌自己使用的TPU(Tensor Processing Unit)。一个worker需要管理多个设备,所以这些设备的名称需要加上worker的名字,比如 任务分配算法如何将某个计算节点分配到具体设备上,TensorFlow提供了分配算法(placement algorithm)。
跨设备执行如果用户系统有多个设备,任务分配算法就需要将节点分配到不同的设备上,在这个分配过程中,可能会出现一个设备中的输入依赖于另一个设备上的输出。此时就需要设备之间交叉执行。 如图所示,设备A上有节点 3 优化在编译的时候,TensorFlow还会进行一些优化以提高性能。 子图消除在程序中,常常有一些重复的操作,可以把这些操作进行合并。可以将反复进行计算的同一个子图进行合并,保存其中的一个输出,在其他地方只需要直接调用就可以了。 调度优化节点的执行越晚越好,这样的话,这个节点只在内存中保留较短的时间,可以有效降低内存的使用量。合理调度也能降低 精度优化许多机器学习算法不需要高的浮点精度,比如float32,只需要16位精度就够了,因此可以将32位精度降低为16位精度。当需要转换成32位精度时,只需要将尾部直接补0即可。 4 反向传播的计算图在神经网络训练中,需要使用到反向传播算法。在TensorFlow等深度学习框架中,梯度计算都是自动进行的,不需要人工进行梯度计算,这样只需要使用者定义网络的结构,其他工作都由深度学习框架自动完成,大大简化了算法验证。在TensorFlow中,梯度计算也是采用了计算图的结构。 如图,在神经网络中常常需要对权重
|
|