我内置采用分布式tensorflow程序tf.estimator.Estimator
,tf.contrib.learn.Experiment
和tf.contrib.learn.learn_runner.run
。
目前看来,它工作正常。但是,tensorflow分布式教程用于tf.train.replica_device_setter
将操作固定到作业。
我的模型函数不使用任何with device
注释。这是由Experiment
班级自动完成的吗?还是我错过了重点?
我还不确定,为什么我在使用数据并行时需要分配某些设备?
感谢您的帮助和提示,Tobias
变量和操作定义在中tf.estimator.Estimator
,该变量实际使用replica_device_setter
(在此定义)。如您所见,它为ps
作业分配变量,为作业分配操作worker
,这是处理数据并行性的常用方法。
replica_device_setter
返回为设备分配操作和变量的设备函数。即使您使用数据并行性,也可能有许多参数服务器,并且设备函数将确保每个参数服务器都获得单独的变量(由ps_strategy
决定replica_device_setter
)。例如/job:ps/tasks:0
可以得到W1
和b1
,并且/job:ps/tasks:1
可以得到W2
和b2
。设备函数在将变量分配给参数服务器时必须具有确定性,因为每次实例化工作副本时都会调用该函数,并且工作人员需要就ps
哪个变量拥有哪个变量达成共识。
tf。(contrib。)学习库使用图间复制。这意味着每个工作程序副本都将构建一个单独的图,并将非变量操作分配给该工作程序:任务索引为2的工作程序将操作定义为/job:worker/task:2
,将变量定义为/job:ps
(具体ps
由决定ps_strategy
)。这意味着工作副本将自己计算操作(损耗值和梯度),并将结果变量更新(梯度)发送到负责保存特定变量的特定参数服务器。
如果您没有将变量/操作分配给设备的机制,则不清楚哪个副本应包含哪些变量和操作。如果您在一个工作副本上有多个GPU,也可能需要分配给特定设备:即使您的变量存储在参数服务器上,您也需要为每个GPU创建一次图形密集型部分(显式将创建的操作分配给相关的GPU)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句