2017-10-06 68 views
0

分布式Tensorflow的当前体系结构基于“Parameter-Server-like”框架。使用tf.device(tf.train.replica_device_setter()),所有张量“变量”被放置在“参数服务器”(“PS”)上,并且其他张量操作被分配给“工人”。据我所知,“工作人员”和“PS”之间会有很多通信开销。原因是每个工作人员没有没有存储在“PS”中的那些“变量”的本地副本,其实际上在训练期间引入更多的通信,从“PS”检索变量,计算中间结果并将它们发送回“PS “更新那些张量”变量“...如何在分布式Tensorflow中实现“DistBelief”体系结构

现在,如果我们不遵循规则,而是采用”DistBelief“架构:所有共享参数(如神经网络权重)仍然放在”PS “,但是每个工作人员现在都拥有存储在”PS“中的共享张量”变量“的副本。好处是在训练期间每个工作人员不必与“PS”进行通信,而只是使用其本地副本来计算梯度,而“工作人员”和“PS”之间的通信仅在共享参数(神经网络权重)为在“PS”中更新。在分布式Tensorflow中,有没有办法做到这一点?

回答

0

您的问题是,除了主要工作人员处理的全局变量之外,非主要工作人员还有自己的局部变量集,需要在工人重新启动时对其进行初始化。

看看这个exampleabenmao。你可以创建session.run钩子来初始化局部变量或全局变量。然后,根据工人是否主管,使用正确的钩子创建MonitoredTraining会话。

ma_hook = ma.make_ma_run_hook() 
    # And also, create the hook which handles initialization and queues. 
    ma_replicas_hook = ma.make_session_run_hook(is_chief) 
    ``` 
    In the training program, every worker will run the train_op as if not 
    model_average or synchronized. Note that if you want to run other ops like 
    test op, you should use common session instead of monitoredSession: 
    ```python 
    with training.MonitoredTrainingSession(
     master=workers[worker_id].target, is_chief=is_chief, 
     hooks=[ma_replicas_hook, ma_hook]) as mon_sess: 
    while not mon_sess.should_stop(): 
     mon_sess.run(training_op) 
    ... 

    def make_session_run_hook(self, is_chief, num_tokens=0): 
    """Creates a hook to handle ReplicasHook ops such as initialization.""" 
    if self._ma_run_hook is False: 
     raise ValueError("make_session_run_hook Should be " 
         "called after make_ma_run_hook.") 

    if is_chief: 
     return self._ReplicasHook(self.chief_init_op, 
           self.ready_for_local_init_op, 
           self.get_chief_queue_runner(), 
           self.get_init_tokens_op(num_tokens)) 

    return self._ReplicasHook(self.local_step_init_op, 
           self.ready_for_local_init_op, None, None) 
+0

感谢您的回复!似乎答案解决了我的其他问题;)但示例链接很好 - 'model_average_device_setter()'可以将全局模型变量放在PS上,而每个工作人员也有副本。因为当前的tf只支持'tf.device(tf.train.replica_device_setter())',所有的张量“变量”放在PS上,而且每个worker都不'没有它们的本地复制品,这导致了如上所述的大量通信成本。 –

相关问题