我正在开发Distributed Tensorflow,特别是使用下面的文章https://github.com/Russell91/TensorBox中给出的分布式Tensorflow实现Reinspect模型。
我们正在使用分布式张量流设置的Between-graph-Asynchronous实现,但结果非常令人惊讶。在基准测试时,我们发现分布式培训所需的培训时间比单一机器培训多2倍。关于可能发生的事情以及可能尝试的其他任何线索都将非常感激。感谢
注意:帖子中有一个更正,我们使用的是图形间实现而不是图形内实现。抱歉错误
答案 0 :(得分:2)
总的来说,如果从模型的单进程实现转移到多机器实现会导致速度减慢,我不会感到惊讶。从你的问题来看,可能发生的事情并不明显,但这里有一些一般性的指示:
如果模型具有相对于计算量的大量参数(例如,如果它主要执行大型矩阵乘法而不是卷积),那么您可能会发现网络是瓶颈。您的网络连接带宽是多少?
流程之间是否有大量副本,可能是由于不幸的设备放置?尝试收集并可视化时间轴,以查看运行模型时发生的情况。
您提到您正在使用“图中复制”,not currently recommended用于可伸缩性。图形内复制可能会在单个主服务器上造成瓶颈,尤其是当您拥有包含许多副本的大型模型图时。
您是在跨副本或多个输入管道使用单个输入管道吗?使用单个输入管道会在运行输入管道的进程中产生瓶颈。 (但是,使用图形内复制,运行多个输入管道也可能会产生瓶颈,因为有一个Python进程会驱动具有大量线程的I / O.)
或者您使用的是饲料机制?当必须跨越进程边界时,提供数据要慢得多,就像在复制设置中那样。使用图之间的复制至少可以消除单个客户端进程的瓶颈,但为了获得更好的性能,您应该使用输入管道。 (作为Yaroslav observed,在分布式版本中提供和获取大张量值的速度较慢,因为数据是通过RPC传输的。在单个过程中,这些将使用简单的memcpy()
代替。)
您使用了多少个进程?缩放曲线是什么样的?当您切换到使用参数服务器和单个工作副本时(与单个组合过程相比),是否会立即减速?添加更多副本时,性能会变好还是变差?
答案 1 :(得分:1)
我最近看到类似的事情,我注意到将数据从grpc移动到Python运行时比预期慢。特别考虑以下模式
add_op = params.assign_add(update)
...
sess.run(add_op)
如果add_op
位于不同的进程上,则sess.run
会添加以50-100 MB /秒的速率发生的解码步骤。