Reinpect人体检测模型的分布式Tensorflow训练

Distributed Tensorflow Training of Reinpect Human detection model

我正在研究分布式 Tensorflow,特别是使用分布式 Tensorflow 的 Reinspect 模型的实现在下面的论文中给出https://github.com/Russell91/TensorBox

我们正在使用分布式张量流设置的 Between-graph-Asynchronous 实现,但结果非常令人惊讶。在 bench marking 的时候,我们发现分布式训练比单机训练花费的训练时间几乎多 2 倍以上。任何关于可能发生的事情以及可以尝试的其他事情的线索都将非常感激。谢谢

注意:post 中有一个更正,我们使用的是图间实现而不是图内实现。对不起错误

我最近在看类似的东西,我注意到将数据从 grpc 移动到 Python 运行时比预期的要慢。特别考虑以下模式

add_op = params.assign_add(update)
...
sess.run(add_op)

如果 add_op 位于不同的进程上,则 sess.run 添加一个以 50-100 MB/second 的速率发生的解码步骤。

这是一个benchmark and relevant discussion

一般来说,如果从模型的单进程实现转移到多机实现会导致速度变慢,我不会感到惊讶。从你的问题来看,可能发生的事情并不明显,但这里有一些一般性的指示:

  • 如果模型的参数数量相对于计算量而言很大(例如,如果它主要执行大型矩阵乘法而不是卷积),那么您可能会发现网络是瓶颈。您的网络连接带宽是多少?

  • 进程之间是否存在大量副本,可能是由于不幸的设备放置?尝试收集和可视化时间线,看​​看当您 运行 您的模型时发生了什么。

  • 您提到您正在使用 "in-graph replication",这是 的可伸缩性。图内复制可能会在单个主节点上造成瓶颈,尤其是当您有一个包含许多副本的大型模型图时。

  • 您是跨副本使用单个输入管道还是多个输入管道?使用单个输入管道会在处理 运行 输入管道时造成瓶颈。 (但是,对于图内复制,运行 多个输入管道也可能造成瓶颈,因为会有一个 Python 进程驱动具有大量线程的 I/O。)

  • 或者您正在使用进纸机制?当数据必须跨越进程边界时,提供数据的速度要慢得多,就像在复制设置中一样。使用图间复制至少可以消除单个客户端进程的瓶颈,但要获得更好的性能,您应该使用输入管道。 (由于 ,在分布式版本中馈送和获取大张量值较慢,因为数据是通过 RPC 传输的。在单个进程中,这些将使用简单的 memcpy()。)

  • 您使用了多少进程?缩放曲线是什么样的?当您切换到使用参数服务器和单个工作副本(与单个组合进程相比)时,速度会立即变慢吗?添加更多副本后性能会变好还是变差?