SLURM s运行 运行 一个 python 脚本不是并行的,但可以访问并行资源

SLURM srun run a python script not in parallel, but have access to the parallel resources

我正在尝试 运行 一个 python 脚本,其中部分代码将根据某些 SLURM 环境变量并行化。我认为确切的代码并不重要,但作为参考,我想 use this 训练我的网络。

现在,问题是我需要通过 srun 运行 我的脚本,但是这会生成我不想要的多个并行脚本实例。

最基本的例子是这样的:

#!/bin/sh
#SBATCH -N 2
#SBATCH --ntasks=2

srun python myscript.py

现在我将有 2 个节点和 2 个任务,这意味着当我 运行 python myscript.py 时,将有 2 个并行的 myscript.py 运行ning 实例。

然而,这不是我想要的。我希望只有一个 myscript.py 运行ning 实例,但是它应该可以访问 srun 设置的环境变量,并将其留给 python 脚本合理分配资源。 设置 srun --ntasks=1 不起作用,此后脚本将仅 'see' 节点之一。

是否可以使用 srun 到 运行 脚本的单个实例,同时它仍然具有 'access' 到 SLURM 环境变量?我查看了 --exclusive--preserve-env 等选项,但在这种情况下它们似乎对我没有帮助。

事实证明,Hristo Iliev 在评论中是正确的,要正确使用 SlurmClusterResolver,多个作业需要 运行 并行。 这可能有点令人困惑,因为所有内容都会被打印多次,因为所有内容都是 运行 并行的,但这是正常的。

然而,我最初的困惑和我认为必须按照原始问题中所述完成的假设来自每当我尝试使用 MultiWorkerMirrored 策略时 TensorFlow 报告内存不足错误,而我知道没有这个模型拟合完全在可用内存范围内。

我在代码中的某处调用了 tf.config.get_visible_devices("GPU")。现在,为了让 TensorFlow 获得 GPU,它会分配它们,默认情况下会填满整个 GPU 内存。但是,由于所有脚本都是 运行 并行的,每个脚本都会尝试自己执行此操作(因为这是在策略范围之外完成的),从而导致内存不足 (OOM) 错误。

删除这段代码后,一切正常运行。

对将来可能偶然发现此 post 的人的建议: - 脚本应该是 运行 并行的,你会看到多次相同的输出 - 确保一切都在 strategy.scope() 下完成,即模型编译、数据生成设置(使用 tf.data) - 特别注意保存模型;只有 'main' 工作人员应该将模型保存到真正的保存文件中,其他人应该写入临时文件 see here

如果出现内存不足的错误;确保没有一段代码将所有 GPU 分配到范围之外。这可能是 TensorFlow 某处发起的,但如果它出现在所有脚本中,它将导致 OOM 错误。一个方便的测试方法是使用 tf.config.experimental.set_memory_growth,允许内存增长而不是完全内存分配。

在我的代码中,我使用了tf.distribute.cluster_resolver.SlurmClusterResolverget_task_info()函数,并且只有运行个函数在任务号为0时分配内存,主worker。

(以上函数和注释基于Te​​nsorFlow 2.2.0和Python 3.7.7)