【问题标题】:Tensorflow scalibility张量流可扩展性
【发布时间】:2017-02-11 00:33:04
【问题描述】:

我使用tensorflow训练DNN,我的网络结构很简单,只有一个参数服务器和一个worker时,每个minibatch大约需要50ms。为了处理大量样本,我使用分布式 ASGD 训练,但是我发现增加 worker 数量并不能提高吞吐量,例如,在参数 server machine count 和 worker machine count 加倍后,40 台机器可以达到每秒 150 万个样本,集群仍然只能每秒处理 150 万个样本,甚至更糟。原因是当集群很大时,每一步都需要更长的时间。 tensorflow 是否具有良好的可扩展性,有什么加快训练速度的建议吗?

【问题讨论】:

  • 我的猜测是 I/O 或更普遍的输入管道是瓶颈。你是如何读取数据的?你的队列满了吗?
  • @AllenLavoie 除了文件名队列,我没有使用任何队列。我的图表使用来自 SSD 的 tfrecord 读取器读取原始数据,然后使用我的自定义运算符解析原始数据。文件 IO 和自定义运算符不是瓶颈。有人使用非常大的集群进行训练吗?
  • 输入管道的无训练吞吐量是多少?同样,您每秒可以获得多少个合成数据样本?每个工作人员的 CPU/GPU 利用率如何?
  • @AllenLavoie 正如我所说,我的神经网络很简单,CPU 不是瓶颈,利用率只有 20%。问题是如果集群很大,worker和参数服务器之间的通信成本太大(我需要将参数分片到所有参数服务器)。如果您可以在 google 内部分享一些数字,或者您正在使用不同的 rpc 实现,我不会。
  • 有趣。实际型号是什么?

标签: machine-learning tensorflow


【解决方案1】:

解决这些问题的一般方法是找出瓶颈所在。您可能会遇到软件或硬件的瓶颈。

进行数学运算的一般示例——假设您有 250M 参数,并且每次向后传递需要 1 秒。这意味着每个工作人员将发送 1GB/秒的数据并接收 1GB/秒的数据。如果你有 40 台机器,那么工人和参数服务器之间的传输速度将是 80GB/秒。假设参数服务器机器只有 1GB/秒的全双工 NIC 卡。这意味着如果您的参数服务器分片少于 40 个,那么您的网卡速度将成为瓶颈。

排除后,您应该考虑互连速度。您的集群中可能有 N 个网卡,但集群很可能无法处理所有向所有其他网卡发送数据的网卡。您的集群能否处理 80 台机器之间 80GB/秒的数据流? Google 设计自己的网络硬件来处理他们的互连需求,因此这是一个重要的问题约束。

一旦您检查了您的网络硬件可以处理负载,我会检查软件。 IE,假设你有一个工人,“发送时间”如何随着参数服务器分片的数量而变化?如果缩放是强次线性的,则表明存在瓶颈,可能是线程调度效率低下或类似情况。

作为查找和修复软件瓶颈的示例,请参阅grpc RecvTensor is slow 问题。如果您尝试发送超过 100MB 的消息,则涉及 gRPC 层的问题会变得低效。此问题已在上游 gRPC 版本中修复,但尚未集成到 TensorFlow 版本中,因此当前的解决方法是将消息分成 100MB 或更小的片段。

找到这些的一般方法是编写大量基准来验证您对速度的假设。

这里有一些例子:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-23
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2021-06-05
    • 2022-07-08
    • 1970-01-01
    相关资源
    最近更新 更多