tf.train.replica_device_setter 需要 tf.contrib.learn.Experiment?

tf.train.replica_device_setter needed with tf.contrib.learn.Experiment?

我使用 tf.estimator.Estimatortf.contrib.learn.Experimenttf.contrib.learn.learn_runner.run 构建了一个分布式张量流程序。

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

我的模型函数不使用任何 with device 注释。这是 Experiment class 自动完成的,还是我遗漏了一个重点?

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

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

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

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

tf.(贡献)学习库 。这意味着每个 worker 副本将构建一个单独的图,并将非变量操作分配给该 worker:任务索引为 2 的 worker 将操作定义为 /job:worker/task:2,将变量定义为 /job:ps(具体 psps_strategy 决定)。这意味着工作副本将自己计算操作(损失值和梯度),并将生成的变量更新(梯度)发送到负责保存特定变量的特定参数服务器。

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