TensorFlow与自然语言处理应用
上QQ阅读APP看书,第一时间看更新

3.6 TensorFlow工作原理

TensorFlow是一个具有“client—master—worker”架构的分布式系统。在TensorFlow中,参与分布式系统的所有节点或者设备被统称为一个cluster(集群),一个cluster中包含多个server(服务器),每个server去执行一项task(任务),而server和task又是一一对应的。这样看来,我们可以把cluster看成是server的集合,也可以看成是task的集合。TensorFlow为每个task又增加了一个抽象层,将一系列相似的task集合称为一个job(工作)。例如,我们在PS架构中,习惯称parameter server(参数服务器)的task集合为ps,而把执行梯度计算的task集合称为worker。因此,cluster又可以被看成是job的集合,实际上这只是逻辑上的意义,我们还需要具体看一下这个server真正做的是什么。在TensorFlow中,job用name(字符串)标识,task用index(整数索引或整数下标)标识,cluster中的每个task都可以用job的name加上task的index来作唯一标识。在分布式系统中,一般情况下各个task在不同的节点或者设备上执行。

通常情况下,客户端(client)通过会话tf.Session接口和master展开通信,且将触发执行的请求提交给master,而master会把所要执行的任务分派给单个或多个worker进程,相关结果通过master返回给客户端。这里,worker负责计算的执行,任何一个worker进程都会管理和使用计算机上的计算硬件设备资源,比如一块或者多块CPU和GPU,进而处理计算子图(Subgraph)的运算或操作过程。

其实,TensorFlow的架构横向扩展是很灵活的。在单机模式的多数情况下,client、master和worker均在同一个进程中启动,而worker进程会管理本机上所有的计算设备资源。在分布式的架构中,我们可以通过远程调用的方式将client、master和worker连接在一起,且任何一个worker进程各自监控关联执行机上的计算设备。关于TensorFlow的单机和分布式架构如图3-4所示。

图3-4 TensorFlow的单机和分布式架构示意图

在创建计算图之后,TensorFlow需要以分布式方式由多个CPU(以及GPU,如果可用)执行激活的会话。通常,实际上不需要明确指定是使用CPU还是GPU,因为TensorFlow可以选择并使用其中一个。默认情况下,将选择GPU进行尽可能多的运算;否则,将使用CPU。因此,从广义上看,以下是TensorFlow的主要组件:

  • 变量(Variable):用于包含TensorFlow会话之间权重值和偏差的值。
  • 张量(Tensor):在节点之间传递的一组值。
  • 占位符(Placeholder):用于在程序和TensorFlow图之间发送数据。
  • 会话(Session):启动会话时,TensorFlow会自动计算图中所有计算的梯度,并在链式规则中使用它们。实际上,在执行图形时会调用会话。

从技术上说,我们要编写的程序可以被视为客户端,而客户端用于以符号方式在C/C ++或Python中创建计算图,接着,我们的代码可以要求TensorFlow执行此该图,请参见图3-5中的详细信息。

图3-5 在TensorFlow分布式架构下执行代码示意图

计算图有助于在具有CPU或GPU的多个计算节点上分配工作负载。这样,神经网络等同于复合函数,其中每个层(输入层、隐藏层或输出层)可以表示为函数。现在想要了解在张量上执行的运算或操作,有必要探讨TensorFlow编程模块方面的解决方案。