系统信息:

  • Debian 4.5.5

  • TF installed from binary (pip3 install tensorflow-gpu==1.0.1 --user)

  • TF version: v1.0.0-65-g4763edf-dirty 1.0.1

  • Bazel version: N.A.

  • CUDA 8.0 cuDNN v5.1

重现的步骤

  • 制作目录并将以下文件下载到其中:training.py run.sh

  • 运行命令./run.sh以简单地重现此问题 .

错误的详细说明

最近,我尝试在集群上部署同步分布式tensorflow培训 . 我按照教程和初始示例编写了自己的程序 . training.py来自其他用户的实现,它遵循与官方示例相同的API用法 . 我对其进行了修改,使其能够在具有多个GPU的单台机器上运行,方法是让它们通过localhost进行通信,并将每个worker映射到只能看到一个GPU .

run.sh启动了三个进程 . 其中一个是参数服务器,其他是由图之间复制实现的两个工作者 . 我通过tf.train.Supervisor()创建了培训主管,以管理分布式培训中的多个会话以进行初始化和同步 .

我希望这两个 Worker 能够同步每个批次并在同一时期工作 . 然而,在 Worker 1之前启动的 Worker 0完成了整个训练集而没有等待 Worker 1.之后, Worker 0的过程完成了训练过程并正常退出而 Worker 1表现得像是落入死锁并在几个小时内保持接近0%的CPU和GPU利用率 .

根据我的观察,我怀疑这两个 Worker 根本没有沟通和同步他们传递的数据 . 我将此问题报告为错误,因为我根据官方网站和初始示例的建议创建了优化程序tf.train.SyncReplicasOptimizer . 但是,似乎同步行为(如果有的话)非常奇怪,并且程序无法正常退出 .

源代码/日志

两个文件:training.py:此文件包含参数服务器的源代码和为使用同步分布式优化器而创建的工作程序(tf.train.SyncReplicasOptimizer) . run.sh:这个文件启动了参数服务器和worker . 日志:请按照步骤生成并查看worker_0_log和worker_1_log