我使用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,这是假设的。