泥浆wlm 17.11.2
从Ubuntu Apt repos安装,Ubuntu:18.04
我们有一个由20个相同节点组成的集群。
运行下面的简单脚本给了我一个令人困惑的问题。
所有的作业都认为它们是在node3上运行的,而运行hostname命令给出了正确的答案。这也是输出文件名的问题。我希望有许多不同的输出,但我只得到一个,文件名中有“node3”。这似乎是Bash Eval()/变量替换错误。
包装

SLURMD_NODENAME

在一个
bash -c "echo Bash3: \$SLURMD_NODENAME"

作品。但我为什么要这么做?
中国工作:
#!/bin/bash
#SBATCH --output=/share/output.txt.%j.%J.%a.%A.%n.%N.%s.%t.%x

#SBATCH --time=00:00:30
#SBATCH --tasks-per-node=2
#SBATCH --nodes=4

srun hostname
srun bash -c "echo Bash2: \$(hostname)"
srun echo SLURMD_NODENAME:$SLURMD_NODENAME SLURM_ARRAY_TASK_ID:$SLURM_ARRAY_TASK_ID SLURM_ARRAY_JOB_ID:$SLURM_ARRAY_JOB_ID SLURM_JOB_ID:$SLURM_JOB_ID SLURM_TASK_PID:$SLURM_TASK_PID
srun bash -c "echo Bash3: \$SLURMD_NODENAME"

srun sleep 20

跑得像:
sbatch cn.job

生成此输出:
/share/output.txt.2056.2056.4294967294.2056.0.node3.4294967294.0.cn.job
node3
node3
node6
node4
node5
node6
node4
node5
Bash2: node3
Bash2: node6
Bash2: node4
Bash2: node5
Bash2: node3
Bash2: node4
Bash2: node6
Bash2: node5
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
Bash3: node3
Bash3: node5
Bash3: node3
Bash3: node4
Bash3: node6
Bash3: node4
Bash3: node6
Bash3: node5

最佳答案

SLURMD_node Name:当前作业步骤在其上执行的节点的名称
(例如https://www.nccs.nasa.gov/user_info/slurm/environment_variables/sbatch
因此,发生的情况是,cn.job文件在分配的上下文中执行,但在任何作业步骤之前(即srun)。在那里,它像一个常规bash文件一样执行,因此变量替换开始用运行批处理脚本的机器上看到的值替换$SLURMD_NODENAME。然后通过srun执行结果,结果如下:
srun echo $SLURMD_NODENAME>srun echo node3
其他命令都阻止变量的扩展,并在作业步骤中对计算节点运行扩展(或hostname命令),因此它们按预期工作。
有人认为srun是一个超级充电的ssh。您会注意到srun hostname && srun $HOSTNAME的行为就像ssh node hostname && ssh node $HOSTNAME(显然是并行执行的模块)。
SLURM略有不同:SBatch文件在计算节点上执行。因此,您将无法获得与在登录节点上运行srun时相同的输出。
对于单个输出文件:不确定,但通常一个作业的所有输出都会被收集并放到一个接收器中。这是交互式作业的标准输出或sbatch的单个输出文件。你从哪里得到占位符的?我只知道作业和数组作业id的%j %A %a。在这里,显然只创建一个输出文件是有意义的。

关于linux - slurm SBATCH-多个节点,相同的SLURMD_NODENAME,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51328917/

10-13 03:33