我在TF中有一个简单的分布式设置(每一步大致对应一个 tf.Session.run 调用)

  • Parent通过与唯一父任务的目标的会话对设备 '/job:parent' 上的变量进行更改 .

  • 几个子进程 tf.assign 将局部变量的父变量放在 '/job:child/task:<child index>' 上 .

  • 然后,每个子进程在其自己的TF设备上使用自己的局部变量进行一系列计算 .

孩子们都有自己的主人会话,与他们的个人儿童任务目标相关联 .

我的设置是单个GPU或多个(2)GPU,它们在父级和子级之间进行分片 . 儿童比总GPU多得多(内存和计算密度足够小,以至于单个子任务无法完全利用GPU) .

即使有很多孩子,我仍然发现单GPU和多GPU的GPU利用率都很低 . 我怀疑它是 assign 操作 . 这些是本地GPU,因此应该可以通过DMA,一个vanilla GPU副本(如果在同一GPU上)或nccl执行 assign op,但我担心默认情况下TF将通过本地gRPC套接字传输数据 .

我有几个问题:

  • 我的数据传输理解是否正确?

  • TF profiler似乎是针对单进程工作流程,在单个会话中测量何时执行操作等 . 如何组合来自多个远程会话的日志? tf.RunMetadata 会捕获gRPC延迟吗?

  • 如果我要在父会话上运行所有 tf.assign 操作,在每个子索引上执行每个副本,这会避免gRPC调用吗?