Tensorflow中分散-聚集模式的扩展性能限制

Tensorflow中分散-聚集模式的扩展性能限制,tensorflow,Tensorflow,分散-聚集数据流管道的扩展性能是有限的,我不确定这是否正确 Tensorflow()中的一个错误 为分布式会话设计图表的一种性能不佳的方法 我使用Tensorflow构建自定义管道(即,我编写自己的操作内核),解决“令人尴尬的并行”问题(不需要“本地”管道之间的协调)。通常,这涉及到在集群中的所有机器上复制本地管道,并有一个源队列和接收队列分别为输入和接收输出提供数据 单独机器上的管道之间没有协调,除了 从“源”队列中退出输入队列 将输出排队到“接收器”队列 由于我使用的确切代码库仍然是

分散-聚集数据流管道的扩展性能是有限的,我不确定这是否正确

  • Tensorflow()中的一个错误
  • 为分布式会话设计图表的一种性能不佳的方法
我使用Tensorflow构建自定义管道(即,我编写自己的操作内核),解决“令人尴尬的并行”问题(不需要“本地”管道之间的协调)。通常,这涉及到在集群中的所有机器上复制本地管道,并有一个源队列和接收队列分别为输入和接收输出提供数据

单独机器上的管道之间没有协调,除了

  • 从“源”队列中退出输入队列
  • 将输出排队到“接收器”队列
由于我使用的确切代码库仍然是封闭源代码,所以我创建了一个。I通过pip(v0.12.1)安装

这个脚本通过一个while循环复制我的“本地”管道,该循环会导致一定的延迟。这个while循环的效率不是重点。关键是,当我在机器上扩展时,我看到的加速不是很好。(由于承载源/接收器队列的计算机已“卸载”,因此仅升到9)

理想的时间是平坦的,因为工作负载随节点数线性增加(因此,无论节点数多少,都应该花费恒定的时间)

我的问题是

  • 这是张量流的已知限制吗?我目前通过使用ZeroMQ在本地节点之间进行协调(即,我不使用分布式会话)来避开这一点,我知道其他人使用MPI或其他类似的非TF系统
  • 有没有一种方法可以通过Tensorflow中我目前没有使用的一些原语,或者通过一种构造图形的方法,在执行时需要更少的协调,使这种分散-聚集模式更快

您是否面临排队不足的问题?您当前的实现将排队和出列部分的并行化留给Python,而Python对并发性的处理不是很好(这里是一个Python线程调度导致队列饥饿的例子)。另一种方法是让每个工人在自己的流程中运行。这是TensorFlow中分布式ML最常见的模式,这里有一个玩具式的非机器学习示例——这是一个很好的方法,但我的应用程序唯一的陷阱(与您提供的好示例或我发布的while_循环模拟相比)是,我的自定义应用程序的工作单元可能会有很大差异。处理一个队列元素可能需要更长的时间,而不是固定的延迟时间。由于工作不平衡,分割apriori(并分离成这样的过程)会留下很多散乱者。i、 我非常希望工作负载的切分最小或没有切分。在我的示例中没有切分——每个工作者都有无限的工作负载,独立运行,并在每个步骤后独立于其他工作者更新全局状态。在您的示例中,worker由包含所有worker的结果的sess.run(host_final_值)触发。这意味着系统将等待所有工作进程完成后再完成并启动另一个运行调用,因此最快的工作进程将是IdleEthere的no sharding(在我的示例中)——每个工作进程都有由FLAGS.iters控制的工作负载(可以为每个工作进程设置不同),独立运行,并在每个步骤后独立于其他工作进程更新全局状态。在您的示例中,worker由包含所有worker的结果的sess.run(host_final_值)触发。这意味着系统将等待所有工作进程完成后再完成并启动另一个运行调用,因此最快的工作进程将是IDLEEYES,主要区别在于我使用N个客户端/进程启动N个独立的排队调用,而您使用1个客户端/进程和一个(大型)排队调用。这是一种常见的模式,大多数分布式培训都像分布式培训一样使用它,在Supervisor中实现(被MonitoredTrainingSession取代)。不过,在MonitoredTrainingSession中有很多特定于培训的内容,从零开始更容易。