如何使用Slurm(并行)在多个节点上运行多个任务?

时间:2019-10-02 15:18:30

标签: bash hpc slurm

我想用不同的参数运行一个文件两次,每个任务在一个节点上,例如节点1上的任务1和节点2上的任务2,用我的代码仅执行第一个任务。我不知道这是什么问题,这是我的新手,这是我的代码:

 #!/bin/bash

 node_names=(compute-0-4 compute-0-6)
 parameter=(parte__00 parte__01)

 #SBATCH -N 2
 #SBATCH -n 2
 #SBATCH -c 1

 srun -n1 -N1 -w $node_names[0] file.sh $parameter[0] &
 srun -n1 -N1 -w $node_names[1] file.sh $parameter[1] &
 wait

当我运行代码时,只有最后一个作业排队,如果执行scontrol show作业,我会得到这个 command

这只是第二个作业排队,第一个作业没有排队

2 个答案:

答案 0 :(得分:0)

现有脚本的问题在于,您需要使用弯曲的方括号来引用bash中的数组项。如果您有$node_names[0],则需要${node_names[0]}

也就是说...第二个数组中的参数是否直接映射到第一个数组中的节点?如果是这种情况,那么类似的方法可能对您更好:

#!/bin/bash

node_names=(compute-0-3 compute-0-4)
parameter=(parte__00 parte__01)

for i in "${!node_names[@]}"; do
  srun -n1 -N1 -w "${node_names[$i]}" file.sh "${parameter[$i]}" &
done

wait

这将在$i中为每个索引设置$node_names的情况下运行循环。对于每次迭代,脚本都会以srun为背景。您可以通过修改阵列来扩展群集。

答案 1 :(得分:0)

#SBATCH行必须在任何非注释行之前。试试这样的东西:

 #!/bin/bash
 #SBATCH -N 2
 #SBATCH -n 2
 #SBATCH -c 1

 node_names=(compute-0-4 compute-0-6)
 parameter=(parte__00 parte__01)


 srun -n1 -N1 -w $node_names[0] file.sh $parameter[0] &
 srun -n1 -N1 -w $node_names[1] file.sh $parameter[1] &
 wait

此外,如果您的应用程序是完全独立的,那么您仅可以提交2个作业,而不是尝试仅在1个作业中运行所有作业。