TensorFlow主人和工人服务

时间:2016-08-03 00:28:06

标签: python tensorflow

我试图了解TensorFlow中主服务器和工作服务的确切角色。

到目前为止,我了解到我开始的每个TensorFlow任务都与tf.train.Server实例相关联。此实例导出"主服务"和"工人服务"通过实施tensorflow::Session界面" (主)和worker_service.proto(工人)。

第一个问题:我是对的,这意味着,一项任务只与一名工人有关吗?

此外,我理解......

...关于主人: 这是主服务的范围......

(1)...向客户端提供功能,以便客户端可以运行会话。

(2)...将工作委托给可用的工作人员以计算会话运行。

第二个问题: 如果我们执行使用多个任务分发的图表,是否只使用一个主服务?

第三个问题: tf.Session.run只能调用一次吗?

这至少是我如何从the whitepaper解释这个数字:

enter image description here

...关于工人: 这是工人服务的范围......

(1)在工人管理的设备上执行节点(由主服务委托给他)。

第四个问题: 一个工人如何使用多个设备?工人是否自动决定如何分配单个操作?

如果我提出错误的陈述,请纠正我! 提前谢谢!!

1 个答案:

答案 0 :(得分:12)

  

第1个问题:我是对的,这意味着,只有一项任务   与一名工人有关?

这是典型的配置,是的。每个tf.train.Server实例都包含一个完整的TensorFlow运行时,默认配置假定此运行时具有对机器的独占访问权限(就GPU分配的内存量等而言)。

请注意,您可以在同一进程中创建多个tf.train.Server实例(我们有时会执行此操作for testing)。但是,这些实例之间几乎没有资源隔离,因此在单个任务中运行多个实例不太可能产生良好的性能(使用当前版本)。

  

第二个问题:如果我们执行使用超过分布的图表   一个任务,只使用一个主服务吗?

取决于您使用的form of replication。如果使用“图中复制”,则可以使用单个主服务,该服务了解模型的所有副本(即工作任务)。如果使用“图形间复制”,则可以使用多个主服务,每个主服务都知道模型的单个副本,并且通常与运行它的工作任务共存。通常,我们发现在图形复制之间使用它会更加高效,tf.train.Supervisor库旨在简化此模式下的操作。

  

第3个问题:tf.Session.run()只能被召唤一次吗?

(我假设这意味着“每次训练一次”。用于训练模型的简单TensorFlow程序将在循环中调用tf.Session.run()。)

这取决于您正在使用的复制形式,您希望在培训更新之间进行的协调。

  • 使用图表内复制,您可以通过汇总单个tf.train.Optimizer中的损失或渐变来进行同步更新,从而提供单个train_op要运行。在这种情况下,您只需在每个培训步骤中调用tf.Session.run(train_op)一次。

  • 使用图中复制,您可以通过为每个副本定义一个tf.train.Optimizer来进行异步更新,从而提供多个train_op操作跑步。在这种情况下,您通常会同时从另一个线程调用每个tf.Session.run(train_op[i])

  • 使用图之间复制,您可以使用tf.train.SyncReplicasOptimizer进行同步更新,tf.train.replica_device_setter()在每个副本中单独构建。每个副本都有自己的训练循环,只需对tf.Session.run(train_op)进行一次调用,SyncReplicasOptimizer对这些进行协调,以便同步应用更新(通过其中一个工作人员的后台线程)。

  • 使用在图之间复制,您可以使用另一个tf.train.Optimizer子类(tf.train.SyncReplicasOptimizer除外)进行异步更新,一个类似于同步案例但没有背景协调的训练循环。

  

第四个问题:一个工人如何使用多个设备?是吗?   工人自动决定如何分发单个操作或......?

每个工作程序运行在单进程TensorFlow中使用的相同放置算法。除非另有说明,否则如果有可用(并且存在GPU加速实现),则布局器将把操作放在GPU上,否则它将回退到CPU。 with tf.device(...):设备函数可用于在充当“参数服务器”的任务之间对变量进行分片。如果您有更复杂的要求(例如,多个GPU,工作人员的局部变量等),您可以使用显式{{3}}块将子图分配给特定设备。

相关问题