在/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上的变量,如何触发更新(无效)缓存变量?
我仔细阅读了大量文档并做了大量实验来验证它,但官方回答可能会再次受到高度赞赏。
答案 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由每个工人调用。
这是更新操作只能运行一次,没有重复更新。
这就是全部。