我在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调用吗?