tensorflow 20参数服务器之一非常慢

时间:2017-01-26 06:33:41

标签: tensorflow

我正在尝试使用tensorflow训练DNN模型,我的脚本有两个变量,一个是密集特征,一个是稀疏特征,每个小批量将使用embedding_lookup_sparse拉出全密集特征并拉出指定的稀疏特征,前馈只能在稀疏后开始功能准备就绪。我使用20个参数服务器运行我的脚本,增加的工作人员数量没有扩展。所以我用张量流时间轴描述了我的工作,发现20个参数服务器中的一个与其他参数服务器相比非常慢。所有可训练变量的不同部分之间没有依赖关系。我不确定是否有任何错误或任何限制问题,如tensorflow只能排队40扇出请求,任何想法调试它?提前致谢。 tensorflow timeline profiling

3 个答案:

答案 0 :(得分:1)

听起来你可能只有2个变量,一个存储在PS0,另一个存储在PS1。其他18个参数服务器没有做任何事情。请查看变量分区(https://www.tensorflow.org/versions/master/api_docs/python/state_ops/variable_partitioners_for_sharding),即将大变量分区为小块并将它们存储在不同的参数服务器中。

答案 1 :(得分:1)

这是从每个迭代的Send/Recv对象中记录Timeline时序的一种黑客方式,但它在分析JSON转储数据方面效果很好(相比于在{{1上可视化它) }})。

您必须执行的步骤是:

  • 下载TensorFlow源并签出正确的分支(例如r0.12)
  • 修改在chrome://trace内调用SetTimelineLabel方法的唯一地方
    • 而不是仅记录不可转移的节点,您还希望记录executor.cc个节点。
    • 小心在Send/Recv内部调用SetTimelineLabel,因为它会设置节点的文本字符串,稍后将从python脚本中解析
  • 从修改后的源
  • 构建TensorFlow
  • 使用NodeDone和图元数据的正确方法修改模型代码(例如inception_distributed_train.py

然后,您可以为每次迭代运行训练并检索一次JSON文件! :)

答案 2 :(得分:0)

一些评论太大的建议:

您无法在时间轴中看到数据传输,因为发送/接收的跟踪目前已关闭,此处有一些讨论 - https://github.com/tensorflow/tensorflow/issues/4809

在最新版本(每晚5天或更新)中,您可以通过执行export TF_CPP_MIN_VLOG_LEVEL=1打开详细日志记录,并显示第二级时间戳(有关更高粒度,请参阅here)。

因此,使用vlog,您可以使用此line生成的消息来查看生成Send操作的时间。