在srun脚本期间将SBATCH的输出写入多个文件(避免消息重叠)



我使用srun提交一个bash脚本,并为每次执行提供不同的输入变量。基本上,我的提交脚本如下所示:

#!/bin/sh
#SBATCH --time=48:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=24
#SBATCH --job-name=name
#SBATCH --output=name
#SBATCH -p name

for system in `cat ${system_file}`; do
srun --exclusive -N1 -n1  bash script.sh ${system} &
done
wait

通常,它将终端输出写入#SBATCH-output下指定的文件中的输出=问题是,由于同时运行多个任务,输出与不同的任务重叠。这个脚本中调用的程序输出了一个错误,我需要追踪哪个输入变量实际上与这个错误相关。

我需要的是为for循环的每次迭代编写一个单独的输出文件,这样就不会有重叠。

我尝试在输出文件名中包括%s和%t,因为我认为for循环的每个迭代可能都有不同的步骤或任务id,但这仍然只提供给一个输出文件。

为了简化识别哪个实例丢弃了错误的过程,可以将-l选项添加到srun中,以将任务ID预先添加到行中。来自srun手册页:

-l,--将Prepend任务编号标记为stdout/err的行。--label选项将在输出行前面加上远程任务id选项适用于步骤分配。

如果您想为每个任务创建一个文件,则需要通过在提交脚本中显式重定向输出来实现。例如:

#!/bin/sh
#SBATCH --time=48:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=24
#SBATCH --job-name=name
#SBATCH --output=name
#SBATCH -p name
for system in `cat ${system_file}`; do
srun --exclusive -N1 -n1  bash script.sh ${system} &> name.${system}.out  &
done
wait

slurm使用#SBATCH --output=name语句为整个作业编写消息,包括在没有为它们提供特定输出的情况下从每个srun编写消息。

要从每个srun获得唯一的输出,必须在srun中包含选项--output,而不是sbatch,例如:

#SBATCH --ntasks=24
for system in `cat ${system_file}`; do
srun --exclusive --output ${system}-%j-%t-%s.out bash script.sh &
done

每个任务都将在不同的CPU上,在一个任务中,每个步骤(在循环中执行srun(都将在同一个CPU上(我认为(。通过指定%t和%s,可以强制创建单独的输出文件。总数将为#任务×#步骤,此处为24×长度(`cat${system_file}`($在这种情况下,系统和%s实际上总是相关的,所以只需要其中一个。

顺便说一句,我认为你不需要在每个srun中包含选项-N1和-N1,这是假设的。

最新更新