python - "tf.train.replica_device_setter"是如何工作的?

标签 python tensorflow

我了解到 tf.train.replica_device_setter 可用于始终在同一参数服务器 (PS)(使用循环法)和一个工作人员上的计算密集型节点上自动分配变量。

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

这是否意味着如果两个图中的变量命名相同,则不应并行使用任务来执行两个不同的图?

最佳答案

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

在 TensorFlow 的分布式版本中,每个设备(例如 "/job:ps/task:17/cpu:0")维护一个从变量名到在使用此设备的所有 session 之间共享的变量。这意味着当不同的工作副本使用该设备创建 session 时,如果它们将相同的符号变量(具有相同的 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): 中 block (name 具有不同的值,例如 “model_1”“model_2”) 将您的变量放在不同的命名空间中,这在 TensorFlow 术语中称为“容器”。您可以将容器视为在设备上查找所有变量时添加到所有变量名称的前缀。 API 中对容器的支持仍处于初步阶段,但有计划在未来使它们更有用。


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

关于python - "tf.train.replica_device_setter"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666845/

相关文章:

python - Windows xgboost 错误

python - 在 Python 中,根据自定义比较过滤短列表以仅包含唯一值的巧妙方法是什么?

python - Pandas 错误划分数据帧

python - 使用 python 使用 bcc 发送邮件

tensorflow - 如何使用SSE4.2和AVX指令编译Tensorflow?

python - 修复在 PyQt 中输入 doublespinbox 的值

python - 在 Tensorflow Object Detection API 中打印类名和分数

python - 如何在Google colab中更改Keras/tensorflow版本?

python - 在 tensorflow 中,如何将索引列表转换为指标向量?

python - 如何每次都知道如何在 Tensorflow 中定义我的变量/占位符形状