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

How to run multiple tasks on multiple nodes with slurm (in parallel)?

我想运行一个文件两次,参数不同,每个任务在一个节点上,例如节点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 作业我得到这个

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

您现有脚本的问题是您需要使用波浪括号来引用 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。您可以通过修改阵列来扩大集群。

#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 个工作中完成所有工作。