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