"tf.train.replica_device_setter"如何工作?

Pau*_*aul 9 python tensorflow

据我所知,这tf.train.replica_device_setter可以用于在同一个参数服务器(PS)(使用循环法)和一个worker上的计算密集型节点上自动分配变量.

如何在多个图形副本之间重用相同的变量,由不同的工作人员构建?参数服务器是否仅查看工作人员要求的变量的名称?

这是否意味着如果在两个图中变量的名称相同,那么任务不应该并行用于执行两个不同的图形?

mrr*_*rry 19

tf.train.replica_device_setter()是它的行为非常简单:它使一个纯粹的地方决定的设备分配给每个tf.Variable因为它创建,在全国参数服务器任务的循环方式.

在TensorFlow的分布式版本中,每个设备(例如"/job:ps/task:17/cpu:0")维护从变量名称到在使用该设备的所有会话之间共享的变量的映射.这意味着当不同的工作副本使用该设备创建会话时,如果他们将相同的符号变量(具有相同Variable.name属性)分配给同一设备,则他们将看到彼此的更新.

当您跨多个副本执行"图形间复制"时,它tf.train.replica_device_setter()提供了一种将变量分配给设备的简单,确定的方法.如果在每个工作副本上构建相同的图形,则每个变量将分配给同一设备并成功共享,而无需任何外部协调.

警告:使用此方案,您的工作者副本必须创建相同的图形*,并且图形的构造方式必须没有随机性.我曾经看到过一个问题,即创建变量的顺序是通过迭代Python的键来确定的dict,这不能保证跨进程以相同的顺序发生.这导致不同工作人员将变量分配给不同的PS设备....

至于你的另一个问题,在使用相同的过程训练多个模型时,你需要注意变量名冲突.默认情况下,所有变量都在全局命名空间中共享,因此来自不同网络的两个具有相同名称的变量将发生冲突.缓解此问题的一种方法是将每个模型包装在一个with tf.container(name):块中(具有不同的值name,例如"model_1""model_2"),以将变量放在不同的命名空间中,在TensorFlow术语中称为"容器".您可以将容器视为在设备上查找时添加到所有变量名称的前缀.API中对容器的支持仍然是初步的,但有计划在将来使它们更有用.


 *从技术上讲,他们只需要以tf.Variable相同的顺序创建对象.