gpt4 book ai didi

slurm - 关于并行任务的 `srun ... >output_file` 的语义

转载 作者:行者123 更新时间:2023-12-01 23:28:24 26 4
gpt4 key购买 nike

抱歉,这个问题需要大量积累,但总而言之,是关于srun ... >output_file的许多并行实例的条件。将或不会导致某些流程/任务对其他流程/任务产生的输出的破坏。

案例 0:仅 bash(无 SLURM)

假设 prog-0.sh是以下玩具脚本:

#!/bin/bash

hostname >&2

if [[ $JOB_INDEX = 0 ]]
then
date
fi

此脚本将一些输出打印到 stderr ,并可能将当前日期打印到 stdout .

“驱动程序”脚本 case-0.sh如下所示生成 $NJOBS进程,全部写入 prog-0-stdout.txt :
#!/bin/bash

for i in $( seq 0 $(( NJOBS - 1 )) )
do
JOB_INDEX=$i ./prog-0.sh >prog-0-stdout.txt &
done

运行后
% NJOBS=100 ./case-0.sh 2>prog-0-stderr.txt

...我的期望是 prog-0-stderr.txt将包含 100 行,而 prog-0-stdout.txt .

我的期望实现了:
 % wc prog-0-std*.txt
100 100 3000 prog-0-stderr.txt
0 0 0 prog-0-stdout.txt
100 100 3000 total

这些结果的解释是,当 NJOBS足够大,很可能,对于 $i 的某个足够高的值,重定向 >prog-0-stdout.txt将在“指定工作”后进行评估,一个 JOB_INDEX 0(也是唯一一个将输出发送到 stdout )已将日期写入 stdout ,因此这将破坏先前由“指定作业”重定向到 prog-0-stdout.txt 的任何输出。 .

顺便说一句, NJOBS 的值需要足够高才能使结果如我刚刚描述的那样。例如,如果我使用 NJOBS=2 :
% NJOBS=2 ./case-0.sh 2>prog-0-stderr.txt

...那么不仅 prog-0-stderr.txt仅包含 2 行(不足为奇),但是 prog-0-stdout.txt将包含一个日期:
% cat prog-0-stdout.txt
Wed Oct 4 15:02:49 EDT 2017

在这种情况下,所有 >prog-0-stdout.txt在指定作业将日期打印到 prog-0-stdout.txt 之前已评估重定向。 .

案例 1:SLURM 作业数组

现在,考虑一个非常相似的场景,但使用 SLURM。脚本 prog-1.shprog-0.sh 相同,除了它检查不同的变量来决定是否将日期打印到 stdout :
#!/bin/bash

hostname >&2

if [[ $SLURM_ARRAY_TASK_ID = 0 ]]
then
date
fi

这是相应的“驱动程序”脚本, case-1.sh :
#!/bin/bash
#SBATCH -t 1
#SBATCH -p test

#SBATCH -e prog-1-%02a-stderr.txt
#SBATCH -n 1
#SBATCH -a 0-99

srun ./prog-1.sh >prog-1-stdout.txt

case-0.sh ,此脚本将其主要步骤的输出重定向到单个文件 ./prog-1-stdout.txt .

重要的是,运行 ./prog-1.sh 的所有节点都会看到这个相同的文件。对于这份工作。

如果我现在跑
sbatch case-1.sh

...我得到 100 个文件 prog-1-00-stderr.txt ... prog-1-99-stderr.txt ,每行包含 1 行,还有一个空 prog-1-stdout.txt .我认为前面的解释也解释了为什么 prog-1-stdout.txt是空的。

到现在为止还挺好。

案例 2:SLURM 任务

最后,再考虑一个基于 SLURM 的案例,这次使用核心脚本 prog-2.sh和驱动程序脚本 case-2.sh .同样,唯一的变化是 prog-2.sh是它检查以决定是否将日期打印到 stdout 的变量:
#!/bin/bash

hostname >&2

if [[ $SLURM_PROCID = 1 ]]
then
date
fi

这里是 case-2.sh :
#!/bin/bash
#SBATCH -t 1
#SBATCH -p test

#SBATCH -e prog-2-stderr.txt
#SBATCH -N 10
#SBATCH --tasks-per-node=10

srun -l ./prog-2.sh >prog-2-stdout.txt

和以前一样, prog-2-stdout.txt对处理作业的所有节点可见。

现在,如果我运行 sbatch case-2.sh并等待批处理作业完成,然后 prog-2-stderr.txt包含 100 行(如预期),但令我惊讶的是, prog-2-stdout.txt不是空的。事实上,它包含一个日期:
% cat prog-2-stdout.txt
01: Wed Oct 4 15:21:17 EDT 2017

我能想出的唯一解释类似于我之前对运行时得到的结果给出的解释
% NJOBS=2 ./case-0.sh 2>prog-0-stderr.txt

如果这个解释是正确的,我担心的是事实 case-2.sh工作得比预期的好(即 prog-2-stdout.txt 以正确的输出结束)只是巧合,与并发事件的相对时间有关。

现在,终于,我的问题是:

问: SLURM 是否保证 prog-2-stdout.txtstdout 时,包含指定任务生成的输出的文件(即打印日期到 >prog-2-stdout.txt 的文件)不会被破坏。重定向被非指定任务之一评估?

最佳答案

您对 srun 的工作方式有误解。在案例 1 中,srun 的使用无关紧要,因为它在批处理脚本中用于启动并行作业。在情况 1 中,您只有一项任务,因此
srun ./prog-1.sh >prog-1-stdout.txt相当于:
./prog-1.sh >prog-1-stdout.txt
情况 2 不同,因为您有 1 个以上的任务。在这种情况下,srun -l ./prog-2.sh >prog-2-stdout.txt只评估一次,srun 将负责生成 10*10 个任务。 srun 会将所有任务的输出重定向到作业的主节点,并且是写入 prog-2-stdout.txt 的节点。 .

因此,您可以确定在这种情况下不会破坏输出文件,因为它只评估一次。

关于slurm - 关于并行任务的 `srun ... >output_file` 的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com