tensorflow 在使用`MultiWorkerMirroredStrategy`时出现内存不足,

n3ipq98p  于 22天前  发布在  其他
关注(0)|答案(9)|浏览(23)

系统信息

  • 是否编写了自定义代码(与在TensorFlow中使用的库存示例脚本相反):是
  • OS平台和发行版(例如,Linux Ubuntu 16.04):REHEL 7.9
  • 从哪里安装的TensorFlow(源代码或二进制文件):源代码
  • TensorFlow版本(使用下面的命令):2.4.1
  • Python版本:3.7.4
  • Bazel版本(如果从源代码编译):3.7.1
  • GCC/编译器版本(如果从源代码编译):8.3.0
  • CUDA/cuDNN版本:10.2
  • GPU型号和内存:GTX 1080Ti
    描述当前行为

当运行一个简单的示例时,TensorFlow会连续分配数GB的内存,直到内存耗尽。
这只发生在运行超过2个节点的情况下,而不是在运行1个或2个节点的情况下,并且它发生在MultiWorkerMirroredStrategy的创建过程中。
我还可以在一个节点上启动6个任务(每个任务3个),而没有问题,但是在3个节点上启动3个任务(每个任务1个)就不行了。
我还观察到,只有一个排名被使用,其他工作节点都很好,等待那个完成初始化(我猜想)。

描述预期行为

它可以正常工作或产生合理的错误。

独立代码以重现问题

import tensorflow as tf
from mpi_cluster_resolver import MPIClusterResolver

resolver = MPIClusterResolver()
strategy = tf.distribute.MultiWorkerMirroredStrategy(cluster_resolver=resolver)

带有
mpi_cluster_resolver.py.txt
这样就可以通过HPC集群上的SLURM/MPI来分布式运行TensorFlow

gk7wooem

gk7wooem1#

2.5.0版本也出现了同样的问题。

drnojrws

drnojrws2#

感谢报告@Flamefire -这是否只发生在使用MPIClusterResolver时,还是在一般情况下,无论使用的是哪种集群解析器,都会出现这种情况?

wkyowqbh

wkyowqbh3#

你能帮我用另一个集群解析器测试这个吗?不确定如何做到这一点,因为创建那个类是为了让其在我们的HPC系统上运行。猜猜关于环境变量的事情?
这也可能与CUDA版本有关:

  • OOM:GeForce GTX 1080 TI,CUDA 11.0,450.36.06
  • 没有OOM:A100,CUDA 11.2,460.32.03

软件栈的其余部分几乎相同。不过,在关闭TF时(由于Python线程和TF清理方面的问题而强制终止)A100上还有其他问题。

qxsslcnc

qxsslcnc4#

有趣的是,使用某些CUDA版本完全防止了代码出现OOM?

alen0pnh

alen0pnh5#

这可能至少是相关的,是的。然而,由于这是一个不同的集群(不同的硬件),它也可能有其他原因。尽可能使软件栈保持一致。
使用仅2个节点不会导致问题,但使用3个节点会。工作集群拥有更多的主内存,所以也许在那里也会出现这个问题。但这是猜测

af7jpaap

af7jpaap6#

好的,通过Python os.environ设置TF_CONFIG变量如下(4个等级):

Set TF_CONFIG={"cluster": {"worker": ["taurusa10:8888", "taurusa11:8888", "taurusa8:8888", "taurusa9:8888"]}, "task": {"type": "worker", "index": 0}, "rpc_layer": "grpc"}
Set TF_CONFIG={"cluster": {"worker": ["taurusa10:8888", "taurusa11:8888", "taurusa8:8888", "taurusa9:8888"]}, "task": {"type": "worker", "index": 1}, "rpc_layer": "grpc"}
Set TF_CONFIG={"cluster": {"worker": ["taurusa10:8888", "taurusa11:8888", "taurusa8:8888", "taurusa9:8888"]}, "task": {"type": "worker", "index": 3}, "rpc_layer": "grpc"}
Set TF_CONFIG={"cluster": {"worker": ["taurusa10:8888", "taurusa11:8888", "taurusa8:8888", "taurusa9:8888"]}, "task": {"type": "worker", "index": 2}, "rpc_layer": "grpc"}

相同:OOM。这看起来有问题吗?

7d7tgy0s

7d7tgy0s7#

据我所知,这里没有任何问题。

fcy6dtqo

fcy6dtqo9#

我认为我们在集群上看到了类似的行为:当TF<2.12 MultiWorkerMirrorStrategy卡在Slurm解析器时,我确实看到某些节点出现OOM错误,但我不确定这是否是完全相同的原因。

我的观察是,这种症状只发生在主机名中带有前导零的主机上,而对解析器的猴子补丁似乎有效:

class AlvisResolver(tf.distribute.cluster_resolver.SlurmClusterResolver):
    def _resolve_hostlist(self):
        hosts = super()._resolve_hostlist()
        def rename(host):
            group, num = host.split('-')
            return f'{group}-{int(num):02d}'
        return [rename(host) for host in hosts]

我猜这也是为什么在这里nodelist很重要的原因,正如之前评论中提到的。假设这应该通过:66e587c780c5来解决。

相关问题