6

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

例如可执行文件 -a -b -c -file fileA --file fileB ... --file fileZ --cores X

我正在尝试创建一个 sbatch 文件,该文件将使我能够使用不同的输入多次调用此可执行文件。每个调用都应该使用 X 核分配到不同的节点(与其余节点并行)。核心级别的并行化由可执行文件处理,而在节点级别由 SLURM 处理。

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

另一种方法是重命名文件并在扩展名之前使用 SLURM 进程或节点号作为文件名,但这并不实用。

对此有何见解?

4

4 回答 4

2

我总是在 sbatch 命令运行的 bash 脚本的帮助下完成这类工作。最简单的方法是在 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;
于 2015-08-20T15:34:13.193 回答
1

I managed to find one possible solution, so I'm posting it for reference:

I declared as many tasks as calls to the executable, as well as nodes and the desired number of cpus per call.

And then a separate srun for each call, declaring the number of nodes and tasks at each call. All the sruns are bound with ampersands (&):

srun -n 1 -N 1 --exclusive executable -a1 -b1 -c1 -file fileA1 --file fileB1 ... --file fileZ1 --cores X1 &

srun -n 1 -N 1 --exclusive executable -a2 -b2 -c2 -file fileA2 --file fileB2 ... --file fileZ2 --cores X2 &

....

srun -n 1 -N 1 --exclusive executable -aN -bN -cN -file fileAN --file fileBN ... --file fileZN --cores XN

--Edit: After some tests (as I mentioned in a comment below), if the process of the last srun ends before the rest, it seems to end the whole job, leaving the rest unfinished.

--edited based on the comment by Carles Fenoy

于 2015-08-18T15:42:00.137 回答
0

编写一个 bash 脚本来填充多个 xyz.slurm 文件并使用 sbatch 提交每个文件。以下脚本执行嵌套 for 循环以创建 8 个文件。然后遍历它们以替换这些文件中的字符串,然后对它们进行批处理。您可能需要修改脚本以满足您的需要。

#!/usr/bin/env bash
#Path Where you want to create slurm files
slurmpath=~/Desktop/slurms
rm -rf $slurmpath
mkdir -p $slurmpath/sbatchop
mkdir -p /exports/home/schatterjee/reports
echo "Folder /slurms and /reports created"

declare -a threads=("1" "2" "4" "8")
declare -a chunks=("1000" "32000")
declare -a modes=("server" "client")

## now loop through the above array
for i in "${threads[@]}"
{
    for j in "${chunks[@]}"
    {
#following are the content of each slurm file
cat <<EOF >$slurmpath/net-$i-$j.slurm
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --output=$slurmpath/sbatchop/net-$i-$j.out
#SBATCH --wait-all-nodes=1
echo \$SLURM_JOB_NODELIST

cd /exports/home/schatterjee/cs553-pa1

srun ./MyNETBench-TCP placeholder1 $i $j
EOF
    #Now schedule them
      for m in "${modes[@]}"
      {
        for value in {1..5}
        do
        #Following command replaces placeholder1 with the value of m
        sed -i -e 's/placeholder1/'"$m"'/g' $slurmpath/net-$i-$j.slurm
        sbatch $slurmpath/net-$i-$j.slurm
        done
      }
   }
}
于 2018-03-16T17:19:57.270 回答
0

你也可以试试这个 python 包装器,它可以在你提供的文件上执行你的命令

于 2021-04-16T01:58:23.960 回答