本文讨论tensorflow如何执行您的机器学习模型。我们将简要概述tensorflow graph的组件,然后深入研究如何跨单个和多个设备执行此图。

tensorflow graph具有以下特性。每个节点都有零个或多个输入,并表示一个操作的实例化。

从图的边缘流出的值称为张量。这些张量在经过这些节点时会经历各种变换。

张量是任意维度数组 ,其中在图形构建时间内推断出基础元素类型。这使得Tensorflow非常快,因为它通过这个图表知道未来会发生什么操作。因此,这些知识允许进行各种编译时优化。

特殊的边称为控制依赖—没有数据流通过这些边,但是它们表明,控制依赖的源节点必须在目标节点执行之前完成执行

此属性允许客户端在关系发生之前执行。例如,这对于控制峰值内存使用非常有用。

操作和内核

一个操作定义了一个计算:例子可能是 -

加矩阵乘法

操作可以具有属性。属性的一个用例是使操作具有多态性(在相同数据类型的元素之间执行操作)

内核定义为:可以在特定类型的设备(CPU,GPU,TPU)等上运行的操作的实现。

会话(Sessions)

客户端通过创建会话(Session)与Tensorflow系统交互。

会话接口有一个名为Extend的方法。这允许我们用附加的节点和边来修改计算图。会话接口有另一个方法Run。

此函数计算所有必须执行的节点的传递闭包,以便计算所请求的输出。然后,它按照尊重节点依赖关系的顺序排列节点

通常,Tensorflow的用途是

使用图表设置一次会话。通过运行图或不同的子图的时间数以百万计的运行

注意:图的传递闭包是一个矩阵,它定义了图中每个节点之间的可达性。这个矩阵将被填入0和1。0定义不可达,1定义可达

变量

变量是持久张量。大多数张量运行后都无法生存。变量在运行操作后存活。变量的用例是存储神经网络的参数。在图形上调用Run时,将更新这些变量。

设备

工作人员处理一个或多个设备。这些设备可以是CPU内核、GPU等。它们通过设备名称和设备类型进行标识。设备名称可以是

/job:localhost/device:cpu:0

在分布式设置中,作业名称是指设备执行的作业。每个设备对象有两个功能:

分配/释放内存安排高级层请求的内核的执行

张量(Tensors)

类型化多维数组 ,这些张量是Tensorflow的基本数据类型。张量可以是各种类型,范围从:

8位到64位IEEE浮点和双精度类型复数数据类型字符串类型(任意字节数组)

执行图:实施视角

概观

客户端与主程序和一个或多个工作进程联系。

工作进程处理comptation设备如gpu和CPU核心。

在Tensorflow中有两个设置:

本地设置——客户机、主服务器和工作人员都在同一台计算机中。分布式设置——客户机、主设备和工作人员都可以位于不同的设备中。在分布式环境中,我们在容器中运行这些不同的组件。这些容器通过像Kubernetes这样的集群调度系统进行调度。

单一设备设置

运行Tensorflow的最简单方案。

单个工作进程单个设备

以尊重节点之间的依赖关系的方式处理节点。进一步来说

每个节点都保留需要处理多少个从属节点的计数。每次执行依赖项时,此计数都会递减。当count为0时 ,节点被放入就绪队列,随后进行处理。

请注意:未指定就绪队列如何处理节点

多设备设置

一旦我们有多个设备。我们有两件事需要担心:

确定为每个节点放置计算的设备管理这些设备之间的通信。

节点放置

节点放置算法计算出给予哪个设备的节点。该算法使用成本模型来做出决策。根据白皮书,节点放置算法使用贪婪启发式算法 ,通过成本模型和其他参数来决定放置节点的设备。这种贪婪的启发式算法考虑到了

执行计算的成本。从其他设备向此节点传输输入的成本。

选择最快完成此计算的设备作为设备。遵循这个放置过程直到放置节点。

由于该论文是在2016年编写的,因此该算法现在可能已经改变。

将节点放入设备后,需要在这些设备之间建立通信协议。

设备间通信

Tensorflow删除不同设备中节点之间的边缘,并用发送和接收调用替换它们。在运行时,发送和接收调用协调一致地跨设备传输数据。

该方法具有以下优点:

数据仅通过接收调用发送一次,并且内存仅针对单个张量分配一次。因此,张量的所有用户都不需要单独的接收/发送呼叫。通过这种方式处理通信,我们让设备中不同节点的调度分散到工作者中。主设备无需跟踪此情况,因为发送和接收呼叫处理不同工作人员和设备之间的同步。

在分布式设置中执行

分布式设置与多设备设置非常相似。因为发送和接收调用是通过TCP或RDMA调用实现的,以跨机器边界移动数据。分布式设置中的执行需要容错。通过两件事检测到故障:

发送和接收呼叫之间的通信出错。从主进程到每个工作进程的定期运行状况检查。

检测到故障时,将中止整个图形执行并从头开始。

然而,Tensorflow系统支持重启后的检查点和恢复。

变量值通过名为Save节点的东西进行检查点

这些保存节点与变量连接。可以将这些节点配置为定期执行。在每N次迭代之后,或者在N秒之后。

同样,这些变量也与还原节点连接,以便在重新启动后恢复它们的值。

多设备训练技术

同步SGD

这个SGD依赖一个主服务器来跟踪模型的参数,以及几个执行一些计算的工作线程。然后这些worker会将数据发回给master,以更新参数。一旦master从worker接收到所有的参数,它就会积累这些梯度,然后将新的梯度的副本发送给每个worker,这样worker就可以处理下一批梯度了

异步SGD

上述方法很好,但我们可以做得更好。异步SGD只是意味着主机在接收到一些参数后,执行更新并将梯度推送给所有工作人员。它不等待所有worker完成任务。

模型并行训练

用于训练深LSTMS。这种类型的训练是对于同一批示例,在不同的计算设备上同时完成模型计算的不同部分。

模型计算流水线的并发步骤

另一种更好地利用训练深度神经网络的常用方法是在同一设备中管道模型的计算。它与ASGD完全相同,但是在同一设备中执行相同的模型而不是多个设备,以更好地使用设备并行操作的能力。

结论

总之,Tensorflow是一个系统,支持

多种设备的训练和推理,非常适合在分布式环境中使用。其设计方式可以通过数据流图结构实现未来的优化。通过使用压缩技术使设备之间的通信更简单。放置算法特别有趣,作者说它有可能被深度学习算法取代。

相关文章