SLURM和python,节点已分配,但代码仅在一个节点上运行

时间:2016-11-30 10:23:48

标签: python python-3.x slurm

我有一个4 * 64 CPU群集。我安装了SLURM,它似乎正在工作,好像我调用sbatch我得到了正确的分配和队列。但是,如果我使用超过64个核心(因此基本上超过1个节点),它可以完美地分配正确数量的节点,但如果i ssh进入分配的节点,我只看到其中一个节点的实际工作。其余的只是坐在那里什么都不做。

我的代码很复杂,它使用multiprocessing。我打电话给有300名工人的游泳池,所以我想这应该不是问题。

我想要实现的是在200个内核上调用sbatch myscript.py,SLURM应该在这200个内核上分配我的运行,而不仅仅是分配正确数量的节点,但实际上只使用一个。

我的python脚本的标题如下所示:

#!/usr/bin/python3

#SBATCH --output=SLURM_%j.log
#SBATCH --partition=part
#SBATCH -n 200

我用sbatch myscript.py调用脚本。

3 个答案:

答案 0 :(得分:5)

不幸的是,multiprocessing不允许在多个节点上工作。来自documentation

  

多处理模块允许程序员充分利用   给定计算机上的多个处理器

通常与Slurm一起使用的一个选项是使用MPI(使用MPI4PY包)但MPI被认为是'并行编程的汇编语言',您需要修改你的代码可扩展。

另一个选择是查看Parallel Processing packages以查找适合您需求的内容,并且只需对代码进行最少的更改。有关更多见解,另请参阅this other question

最后一点:将#SBATCH指令放在Python脚本中并使用Python shebang是完全可以的。但是当Slurm执行脚本的副本而不是脚本本身时,您必须添加一行,例如

sys.path.append(os.getcwd()) 

在脚本的开头(但在#SBATCH行之后),以确保Python找到位于目录中的任何模块。

答案 1 :(得分:1)

我认为你的sbatch脚本不应该在python脚本中。相反,它应该是一个普通的bash脚本,包括Name选项,后跟实际脚本与#SBATCH个作业一起运行。如下:

srun

我建议用这样一个简单的python脚本来测试它:

#!/usr/bin/bash

#SBATCH --output=SLURM_%j.log
#SBATCH --partition=part
#SBATCH -n 200

srun python3 myscript.py

答案 2 :(得分:1)

我尝试通过在以下bash脚本上使用srun来使用不同的python库。 srun应该在分配给您的每个节点上运行。基本思想是确定运行在哪个节点上,并分配一个节点ID 0、1,...,nnodes-1。然后它将信息与线程ID一起传递给python程序。在程序中,我将这两个数字结合起来,为每个节点上的每个cpu制作一个不同的ID。该代码假定每个节点上有16个核心,并且将使用10个节点。

#!/bin/bash

nnames=(`scontrol show hostnames`)
nnodes=${#nnames[@]}
nIDs=`seq 0 $(($nnodes-1))`
nID=0
for i in $nIDs
do
    hname=`hostname`
    if [ "${nnames[$i]}" == "$hname" ]
        then nID=$i
    fi
done
tIDs=`seq 0 15`

for tID in $tIDs
do
    python testDataFitting2.py $nID $tID 160 &
done
wait