" tf.train.replica_device_setter"工作?

时间:2016-09-23 17:56:29

标签: python tensorflow

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

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

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

1 个答案:

答案 0 :(得分:17)

tf.train.replica_device_setter()的行为非常简单:它做出了一个纯粹的本地决定,即在创建时为每个tf.Variable分配一个设备 - 以参数服务器任务的循环方式。

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

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

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

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

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