tf.train.SyncReplicasOptimizer是否完成从聚合渐变到值多次的参数更新?

时间:2017-06-29 13:27:26

标签: python tensorflow distributed

/model/inception/inception/inception_distributed_training.py中,为每个工作人员调用apply_gradients。

apply_gradients_op = opt.apply_gradients(grads, global_step=global_step) 

然后进入SyncReplicasOptimizer.py:

  285       # sync_op will be assigned to the same device as the global step.
  286       with ops.device(global_step.device), ops.name_scope(""):
  287         update_op = self._opt.apply_gradients(aggregated_grads_and_vars,
  288                                               global_step)
  289

第287行将由ps设备上的每个工作进程执行。

我认为,即使聚合所有副本渐变的工作也只能工作一次,但是一旦聚合作业完成,所有副本将rpc调用远程apply_gradients操作组来生成下一个变量值。如果这是真的,可以通过检查is_chief标志来消除重复的apply_gradients。

顺便提一下两个问题:

  • 如果有多个更新操作,如何控制独占变量缓冲区访问?

  • 我们可以使用" caching_device"标志消除多个远程变量访问(多个网络通信程序)?如果可以,如果更新ps上的变量,如何触发更新(无效)缓存变量?

我仔细阅读了大量文档并做了大量实验来验证它,但官方回答可能会再次受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

在仔细审核这些代码段之后,我想自己回答。

```

  310       with ops.device(global_step.device), ops.name_scope(""):
  311         # Replicas have to wait until they can get a token from the token queue.
  312         with ops.control_dependencies(train_ops):
  313           token = sync_token_queue.dequeue()
  314         train_op = state_ops.assign(self._local_step, token)
  315
  316         with ops.control_dependencies([update_op]):
  317           # Sync_op needs to insert tokens to the token queue at the end of the
  318           # step so the replicas can fetch them to start the next step.
  319           tokens = array_ops.fill([self._tokens_per_step], global_step)
  320           sync_op = sync_token_queue.enqueue_many((tokens,))
  321
  322         if self._variable_averages is not None:
  323           with ops.control_dependencies([sync_op]), ops.name_scope(""):
  324             sync_op = self._variable_averages.apply(
  325                 self._variables_to_average)
  326
  327         self._chief_queue_runner = queue_runner.QueueRunner(dummy_queue,
  328                                                             [sync_op])

```

有两个操作集,train_ops和update_op。 update_op以sync_op结束。 'sync_op'将由QueueRunner执行,返回为self._chief_queue_runner。 train_ops最终会在每个工作人员的上下文中调用train_op。

作为一个简短的结论,sync_op被返回给主要工作者进行参数更新(由所有ps完成,实际上,主要工作者只是做控制同步机制)。 train_op由每个工人调用。

这是更新操作只能运行一次,没有重复更新。

这就是全部。