我使用tf.estimator.Estimator
,tf.contrib.learn.Experiment
和tf.contrib.learn.learn_runner.run
构建了分布式tensorflow程序。
现在似乎工作正常。但是,tensorflow distributed tutorial使用tf.train.replica_device_setter
将操作固定到作业。
我的模型函数不使用任何with device
注释。这是由Experiment
课程自动完成还是我错过了一个重点?
我还不确定,为什么在使用数据并行时需要分配某些设备?
感谢您对此提供任何帮助和提示, 托拜厄斯
答案 0 :(得分:0)
变量和操作在tf.estimator.Estimator
中定义,实际上使用replica_device_setter
(defined here)。如您所见,它将变量分配给ps
个作业,并将操作分配给worker
个作业,这是处理数据并行性的常用方法。
replica_device_setter
返回一个设备函数,用于将ops和变量分配给设备。即使您使用的是数据并行,也可能有许多参数服务器,设备函数将确保每个参数服务器获得单独的变量(由ps_strategy
replica_device_setter
确定)。例如/job:ps/tasks:0
可以获得W1
和b1
,/job:ps/tasks:1
可以获得W2
和b2
。在为参数服务器分配变量时,设备功能必须是确定性的,因为每次实例化工作副本时都会调用该函数,并且工作人员需要就哪个ps
保存哪些变量达成一致。
。(contrib。)学习图书馆use between-graph replication。这意味着每个工作副本将构建一个单独的图,并将非变量操作分配给该工作者:具有任务索引2的工作程序将操作定义为/job:worker/task:2
,将变量定义为/job:ps
(具体为{{ 1}}由ps
确定。这意味着工作者副本将计算操作(损失值和梯度)本身,并将生成的变量更新(梯度)发送到负责保存特定变量的特定参数服务器。
如果您没有将变量/操作分配给设备的机制,则不清楚哪个副本应该包含哪些变量和操作。如果工作副本上有多个GPU,则可能还需要分配给特定设备:即使您的变量存储在参数服务器上,您也需要为每个GPU创建一次图形的计算密集型部分(明确地)将创建的操作分配给相关的GPU)。