我试图了解TensorFlow中主服务器和工作服务的确切角色。
到目前为止,我了解到我开始的每个TensorFlow任务都与tf.train.Server
实例相关联。此实例导出"主服务"和"工人服务"通过实施tensorflow::Session
界面" (主)和worker_service.proto
(工人)。
第一个问题:我是对的,这意味着,一项任务只与一名工人有关吗?
此外,我理解......
...关于主人: 这是主服务的范围......
(1)...向客户端提供功能,以便客户端可以运行会话。
(2)...将工作委托给可用的工作人员以计算会话运行。
第二个问题: 如果我们执行使用多个任务分发的图表,是否只使用一个主服务?
第三个问题: tf.Session.run只能调用一次吗?
这至少是我如何从the whitepaper解释这个数字:
...关于工人: 这是工人服务的范围......
(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}}块将子图分配给特定设备。