【问题标题】:Where are the gradient queues and token queue created in Tensorflow between-graph sync trainingTensorflow 图间同步训练中创建的梯度队列和令牌队列在哪里
【发布时间】:2016-12-05 06:09:35
【问题描述】:
我一直在研究 Tensorflow 图间同步训练应用程序。同步训练由 SyncReplicasOptimizerV2 类实现。从class SyncReplicasOptimizerV2的文档中,我了解到一组梯度队列和一个令牌队列是为了同步而创建的。
我想知道
- 这些队列位于何处,主要工作任务或 ps 任务?
如果梯度队列是主要工作人员,据我所知,主要工作人员任务还必须处理检查点、初始化、摘要......
- 这个单一的 Chief Worker 任务是否容易出现性能瓶颈?
- 不同的工作任务(除了负责人)之间是否有任何网络通信,如果有,网络通信的目的是什么?
PS:我所有的问题都是在进行图间复制训练的场景中,每个任务都在不同的机器上。
【问题讨论】:
标签:
tensorflow
tensorflow-serving
【解决方案1】:
首先,同步训练的新实现,在tf.train.SyncReplicasOptimizerV2,实际上并没有为变量使用一组队列。它使用了一种更高效的有状态对象,称为“条件累加器”,它避免了将未聚合的部分梯度存储在内存中,并改善了在某些具有陈旧梯度的极端情况下的行为。
每个变量的条件累加器与该变量位于同一设备上,通常在 PS 任务上 (source);因此,许多条件累加器将根据用于共享变量的相同策略进行分片。用于同步的令牌队列(工作人员在开始下一步之前阻塞)在与全局 step 变量相同的设备上创建,这通常也是单个 PS 任务 (source)。
通常情况下,首席工作人员任务协调同步培训所要做的工作很少。执行同步训练时,没有额外的数据流经主工作人员(在典型设置中,使用例如tf.traing.replica_device_setter() 将设备分配给变量)。
同步训练不会产生任何额外的工作线程间网络流量。当然,您可以选择将模型的不同部分放在不同的工作人员上进行模型并行训练,在这种情况下,TensorFlow 会添加适当的通信。但是,我们常用同步训练的图像模型(如 Inception)不需要模型并行,在单 GPU 上运行效率更高。