- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
抱歉,这个问题需要大量积累,但总而言之,是关于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
之前已评估重定向。 .
prog-1.sh
与
prog-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
prog-1-00-stderr.txt
...
prog-1-99-stderr.txt
,每行包含 1 行,还有一个空
prog-1-stdout.txt
.我认为前面的解释也解释了为什么
prog-1-stdout.txt
是空的。
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 以正确的输出结束)只是巧合,与并发事件的相对时间有关。
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
的节点。 .
因此,您可以确定在这种情况下不会破坏输出文件,因为它只评估一次。
关于slurm - 关于并行任务的 `srun ... >output_file` 的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574606/
我在 slurm 中使用 sbatch 运行了很多作业,如下所示: #!/usr/bin/env python #SBATCH --job-name=Python #SBATCH --array=1-
我想让安排作业的用户使用 -t, --time= 列出任何作业时间限制.但是,当用户没有设置时间限制时,我想强加一个默认时间限制,例如 1 小时。我在 slurm.conf 中找不到任何设置来执行此操
例如,您需要运行30个srun作业,但要确保每个作业都在特定节点列表中的一个节点上运行(具有相同的性能,以公平地比较时序)。 你会怎么做? 我试过的 srun --nodelist=machineN[
据我们所知,SLURM 可以在作业完成时发送电子邮件。 除此之外,类似于作业完成时的邮件机制: [问] SLURM 是否可以在任何作业完成时触发脚本(由前端 SLURM 用户实现)? 示例解决方案:这
有没有办法找出作业被 slurm 取消的原因?我想将达到资源限制的情况与所有其他原因(如手动取消)区分开来。如果达到资源限制,我也想知道是哪一个。 最佳答案 slurm 日志文件明确包含该信息。它还会
我观察到当我运行 SLURM 作业时,它可以在其他文件夹路径上创建文件,也可以删除它们。他们可以通过 SLURM 作业访问其他文件夹/文件并对其进行更改,这似乎很危险。 $ sbatch run.sh
我想为 slurm 中的批处理作业指定每个内核的最大内存量 我可以看到两个 sbatch 内存选项: --mem=MB maximum amount of real memory per n
我知道对于特定的工作 ID,我可以使用 scontrol hold $JOBID。 如何保留多个 ID 的作业或/和保留一系列作业 ID 的作业(例如 scontrol hold 294724-294
我对 cpu 如何与内存通信知之甚少,所以我不确定这是否是一个“正确”的问题。 在我提交给 slurm 集群的作业脚本中,该脚本需要从存储在工作字典中的数据库中读取数据。我想监视运行此脚本所使用的内存
我正在整理一个 snakemake slurm 工作流程,并且我的工作目录被 slurm 输出文件弄得杂乱无章。我希望我的工作流程至少将这些文件定向到我的工作目录中的“slurm”目录。我目前的工作流
我正在努力理解如何使用 SLURM 在同一节点中运行多个进程。 假设我想运行一个具有 100 个不同输入参数的程序。例如,这就是我在笔记本电脑上所做的: for i in `seq 100`; do
sinfo仅显示当前状态( alloc 、 idle 等)和 Slurm 节点的时间限制。 squeue似乎只显示用户自己提交的作业,而不显示其他用户提交的作业。 有没有办法知道其他用户分配的节点何时
我有一个需要处理的文本文件列表(约 200 个文件)。所以我试图为此任务提交一个 slurm 作业数组,但我找不到解决方案。我尝试过的是通过循环遍历文件来提交多个作业(约 200 个作业)来完成一个任
我知道如何使用 cgroups(分配内存、cpu 使用...)和 slurm(提交、暂停/停止工作)。我想知道 cgroups 如何与 slurm 一起工作。当我向 slurm 提交作业时,我可以在哪
我有一堆作业在 slurm 中作为数组作业运行: 123_[1-500] PD my_job 0:00 me 123_2 R my_job 9:99 me 123_3 R
作为管理员,我需要为给定的工作赋予最大的优先级。 我发现提交选项如:--priority=或 --nice[=adjustment]可能有用,但我不知道我应该为它们分配哪些值,以便为工作提供最高优先级
我想提交一个数组作业来处理 100 个任务,每个任务只使用一个 CPU。我可以访问具有 10 个节点和 24 个内核的集群,每个节点都激活了超线程。我用 --array=1-100%24 限制并发作业
我有一些脚本发送到我可以使用 sbatch 访问的集群。但是,我想暂停这些正在运行的脚本,而不必取消它们的工作,因为它们已经运行了一段时间。 有没有办法在不取消他们已经完成的工作的情况下暂停/暂停当前
我有一份运行由 slurm 管理的 Linux 机器的工作。现在作业已经运行了几个小时,我意识到我低估了它完成所需的时间,因此我指定的 --time 参数的值不够。有没有办法通过 slurm 为现有正
是否可以扩展 SLURM 中命令 sacct 的 JobName 列中使用的字符数? 例如,我目前有: JobID JobName Elapsed NCPUS
我是一名优秀的程序员,十分优秀!