我有一个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
调用脚本。
答案 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