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

2024-04-11

抱歉,这个问题需要大量的积累,但总而言之,它是关于许多并行实例的条件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.txtempty.

我的期望实现了:

 % 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将被评估after“指定工作”,即“指定工作”JOB_INDEX0(也是唯一一个将输出发送到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

Like 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 行,以及empty 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 is not空的。事实上,它包含一个日期:

% 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 最终得到正确的输出)只是一个巧合,与并发事件的相对时间有关。


现在,我的问题终于是:

Q:SLURM 是否保证prog-2-stdout.txt包含指定任务生成的输出的文件(即打印日期的文件)stdout)不会被破坏时>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.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于并行任务的 `srun ... >output_file` 的语义 的相关文章

  • error while loading shared libraries: libhwloc.so.5: cannot open shared object file: No such file or

    部署Slurm的过程中 计算节点执行 slurmd C 命令后 报错 root node2 slurmd C slurmd error while loading shared libraries libhwloc so 5 cannot
  • 运行多个工作守护进程 SLURM

    我想在一台机器上运行多个工作守护进程 按照达米安弗朗索瓦的回答关于slurm 集群的最少计算机数量是多少可以办到 问题是目前我只能在一台机器上执行 1 个工作守护进程 例如 当我跑步时 sudo slurmd N linux1 cDvv s
  • 如何在 R 中的 %dopar% 迭代中调用 system()

    我应该如何从并行 R 的子实例调用外部程序 该问题也可能发生在其他情况下 但我正在使用library foreach and library doFuture 基于 slurm 的 HPC 作为一个例子 我创建了一个hello txt其中包
  • 访问数组作业的任务 ID

    我通常使用类似以下内容来提交数组作业 bin bash sbatch lt
  • 多分区作业的批处理脚本?

    我正在开发一个项目 该项目在大型计算集群的两个不同分区上运行程序 我想使用批处理脚本来运行它 但搜索后 仍然不清楚是否 如何从单个批处理脚本中在两个不同的分区上分配和运行程序 这就是我想做的事情 bin bash SBATCH partit
  • SLURM:如何查看已完成的作业全名?

    sacct n例如返回所有作业名称被修剪的 QmefdYEri 问 如何查看作业的完整名称 而不是其精简版本 sacct n 1194 run sh debug root 1 COMPLETED 0 0 1194 batch batch r
  • Slurm:为什么在 sbatch 中使用 srun?

    在 sbatch 脚本中 您可以直接启动程序或脚本 例如可执行文件myapp 但在许多教程中人们使用srun myapp反而 尽管阅读了有关该主题的一些文档 我不明白其中的区别以及何时使用这些语法 我希望这个问题足够精确 SO的第一个问题
  • 使用多个节点运行 slurm 脚本,使用 1 个任务启动作业步骤

    我正在尝试使用批处理脚本启动大量作业步骤 不同的步骤可以是完全不同的程序 并且每个步骤都需要一个 CPU 首先我尝试使用 multi prog论证srun 不幸的是 当以这种方式使用分配给我的工作的所有 CPU 时 性能会大幅下降 运行时间
  • R 并行作业挂起

    我正在运行网站上写的 Snow test R 脚本 https hpcf umbc edu other packages how to run r programs on maya https hpcf umbc edu other pac
  • 在 SLURM 中运行没有顶级脚本的二进制文件

    在 SGE PBS 中 我可以像在本地一样向集群提交二进制可执行文件 例如 qsub b y cwd echo hello 将提交一个名为 echo 的作业 该作业将单词 hello 写入其输出文件 我如何向 SLURM 提交类似的工作 它
  • SLURM 集群中出现错误 - 检测到 1 个 oom-kill 事件:如何改进正在运行的作业

    我在 SLURM 集群中工作 同时运行多个进程 在多个输入文件上 并使用相同的 bash 脚本 在作业结束时 进程被终止 这是我得到的错误 slurmstepd error Detected 1 oom kill event s in st
  • 如何确保 slurm 中的 python 提交脚本位于发出 sbatch 命令的位置?

    我有一个运行的 python 提交脚本sbatch using slurm sbatch batch py 当我这样做时 事情无法正常工作 因为我认为 batch py进程没有继承正确的环境变量 因此 而不是运行batch py从哪里sba
  • 如何将 SLURM-jobID 作为输入参数传递给 python?

    我是使用 SLURM 训练一批卷积神经网络的新手 为了轻松跟踪所有经过训练的 CNN 我想将 SLURM jobID 作为输入参数传递给 python 将其他变量作为参数传递可以正常工作 但是 我无法访问 SLURM jobid 来通过 我
  • 如何检索 slurm 脚本的内容?

    我几天前提交了一份工作 现在仍在运行 但我忘记了内容script sh那天 还有script sh已被删除 您知道如何恢复该脚本的内容吗 在最新版本中 您可以使用以下命令检索您自己作业的作业脚本 scontrol write batch s
  • Slurm 多处理 Python 作业

    我有一个 4 节点 Slurm 集群 每个节点有 6 个核心 我想提交一个利用多重处理的测试 Python 脚本 它会生成打印正在运行的节点的主机名的进程 如下所示 def print something print gethostname
  • Ray on slurm - 初始化问题

    我写这篇文章是因为自从我使用 slurm 以来 我一直无法正确使用 ray 每当我使用命令时 ray init trainer A3CTrainer env my env 我已经在tune上注册了我的env 程序崩溃并显示以下消息 core
  • 单节点/多核作业的 sbatch 脚本中是否需要 srun?

    我正在运行一个非常常见的生物信息学工具 命令bowtie2 build 它可以在单个节点上使用多线程 不是 MPI 类型作业 我有以下 sbatch 脚本 基本上 bin bash SBATCH nodes 1 SBATCH ntasks
  • 如何更新Slurm中的作业节点号?

    我有一项待处理的工作 我想调整它的大小 我试过 scontrol update job
  • SLURM sacct 显示“batch”和“extern”作业名称

    我已将作业提交到 SLURM 队列 该作业已运行并完成 然后我使用以下命令检查已完成的作业sacct命令 但是查看 sacct 命令的结果 我注意到了我没有预料到的其他结果 JobID JobName State NCPUS Timelim
  • 关于并行任务的 `srun ... >output_file` 的语义

    抱歉 这个问题需要大量的积累 但总而言之 它是关于许多并行实例的条件srun gt output file会或不会导致某些进程 任务破坏其他进程 任务产生的输出 案例 0 仅 bash 无 SLURM 假设prog 0 sh是以下玩具脚本

随机推荐