2015-08-18 121 views
2

我有一个可执行文件,它需要多个选项和多个文件输入才能运行。可执行文件可以通过可变数量的内核来运行。SLURM sbatch多个并行调用可执行文件

E.g.可执行文件-a -b -c文件fileA文件fileB ...文件fileZ -cores X

我正在尝试创建一个sbatch文件,该文件使我可以对此可执行文件进行多次调用不同的投入。每个呼叫都应该使用X核心在不同的节点(与其他节点并行)中分配。核心层的并行处理由可执行文件来完成,而在SLURM的节点层进行。

我试过用ntasks和多个sruns,但第一个srun被多次调用。

另一个需要重新命名文件并在扩展名之前使用SLURM进程或节点号作为文件名,但它并不实际。

对此有何见解?

+0

它必须是单个脚本还是可以是多个sbatch脚本? –

+0

我认为单个脚本将是最有用的 – IVy

回答

0

我设法找到一个可行的解决方案,所以我张贴供参考:

我宣布为多任务调用可执行文件,以及节点和每个呼叫的CPU所需的号码。

然后为每个调用分别创建一个srun,声明每个调用的节点和任务的数量。所有sruns都与&符号绑定(&):

srun -n 1 -N 1 - 独占可执行文件-a1 -b1 -c1 -file fileA1 - 文件fileB1 ... - 文件fileZ1 - 核心X1 &

SRUN -N 1 -N 1 --exclusive可执行-A2-B2-C2 -file fileA2 --file fileB2 ... --file fileZ2 --cores X2 &

....

srun -n 1 -N 1 - 独占可执行文件-aN -bN -cN-文件文件AN-文件文件BN ... - 文件fileZN - 核心XN

- 编辑:经过一些测试(正如我在下面的评论中提到的那样),如果最后一个srun的过程在其他过程之前结束,它似乎结束了整个工作,其余的未完成。

--edited由普约尔Fenoy

+1

您应该将--exclusive标志添加到srun命令 –

+0

您可以使用[GNU并行](https://www.gnu.org/software/parallel/)和srun以减轻命令参数的产生。 – damienfrancois

+0

我对最后一个srun有问题。如果它是第一个结束,它会杀死所有剩余的进程。即使我将nokill和-k添加到每个srun调用中。有任何想法吗? – IVy

1

我做这些样的工作总是与bash脚本的帮助下,我由sbatch命令来运行基于注释。最简单的方法是在sbatch脚本中创建一个循环,在其中使用srun指定可执行文件下的不同作业和作业步骤,即使用-w指定部分中的相应节点名称。你也可以阅读slurm数组作业的文档(如果这更适合你)。或者,您也可以将所有参数组合存储在文件中,并使用查看“数组作业”手册页的脚本对它们进行循环。或许下面的脚本(我只是把它包裹起来)可以帮助你感受我心中的想法(我希望它能满足你的需求)。它没有测试,所以不只是复制和粘贴它!

#!/bin/bash 

parameter=(10 5 2) 
node_names=(node1 node2 node3) 


# lets run one job per node each time taking one parameter 

for parameter in ${parameter[*]} 
    # asign parameter to node 
    #script some if else condition here to specify parameters 
    # -w specifies the name of the node to use 
    # -N specifies the amount of nodes 
    JOBNAME="jmyjob$node-$parameter" 
    # asign the first job to the node 
    $node=${node_names[0]} 
    #delete first node from list 
    unset node_names[0]; 
    #reinstantiate list 
    node_names=("${Unix[@]}") 
    srun -N1 -w$node -psomepartition -JJOBNAME executable.sh model_parameter & 

done; 

您将遇到需要强制您的sbatch脚本等待上一个作业步骤的问题。在这种情况下,附加while循环可能会对您有所帮助。

# Wait for the last job step to complete 
while true; 
do 
    # wait for last job to finish use the state of sacct for that 
    echo "waiting for last job to finish" 
    sleep 10 
    # sacct shows your jobs, -R only running steps 
    sacct -s R,gPD|grep "myjob*" #your job name indicator 
    # check the status code of grep (1 if nothing found) 
    if [ "$?" == "1" ]; 
    then 
    echo "found no running jobs anymore" 
    sacct -s R |grep "myjob*" 
    echo "stopping loop" 
    break; 
    fi 
done; 
+0

acct -s R,gPD未被识别。这是一个错字还是其他版本?我已经删除了“,gPD”,但脚本没有结束并保持所有节点被占用。 – IVy

+0

是的,你需要找到一个grep表达式来查找正在运行的作业的待处理作业步骤。 – PlagTag

+0

srun命令不能满足一个简单的等待?如此处所示http://geco.mines.edu/scripts/notes.pdf - 第62页? – IVy