使用tf.contrib.learn.Experiment需要tf.train.replica_device_setter吗?

时间:2017-10-27 12:10:24

标签: tensorflow distributed-computing

我使用tf.estimator.Estimatortf.contrib.learn.Experimenttf.contrib.learn.learn_runner.run构建了分布式tensorflow程序。

现在似乎工作正常。但是,tensorflow distributed tutorial使用tf.train.replica_device_setter将操作固定到作业。

我的模型函数不使用任何with device注释。这是由Experiment课程自动完成还是我错过了一个重点?

我还不确定,为什么在使用数据并行时需要分配某些设备?

感谢您对此提供任何帮助和提示, 托拜厄斯

1 个答案:

答案 0 :(得分:0)

变量和操作在tf.estimator.Estimator中定义,实际上使用replica_device_setterdefined here)。如您所见,它将变量分配给ps个作业,并将操作分配给worker个作业,这是处理数据并行性的常用方法。

replica_device_setter返回一个设备函数,用于将ops和变量分配给设备。即使您使用的是数据并行,也可能有许多参数服务器,设备函数将确保每个参数服务器获得单独的变量(由ps_strategy replica_device_setter确定)。例如/job:ps/tasks:0可以获得W1b1/job:ps/tasks:1可以获得W2b2。在为参数服务器分配变量时,设备功能必须是确定性的,因为每次实例化工作副本时都会调用该函数,并且工作人员需要就哪个ps保存哪些变量达成一致。

。(contrib。)学习图书馆use between-graph replication。这意味着每个工作副本将构建一个单独的图,并将非变量操作分配给该工作者:具有任务索引2的工作程序将操作定义为/job:worker/task:2,将变量定义为/job:ps(具体为{{ 1}}由ps确定。这意味着工作者副本将计算操作(损失值和梯度)本身,并将生成的变量更新(梯度)发送到负责保存特定变量的特定参数服务器。

如果您没有将变量/操作分配给设备的机制,则不清楚哪个副本应该包含哪些变量和操作。如果工作副本上有多个GPU,则可能还需要分配给特定设备:即使您的变量存储在参数服务器上,您也需要为每个GPU创建一次图形的计算密集型部分(明确地)将创建的操作分配给相关的GPU)。