- slurm-wlm 17.11.2
- 从 Ubuntu Apt 存储库安装,Ubuntu:18.04
我们有一个由 20 个相同节点组成的集群。 运行下面的简单脚本给我带来了一个令人困惑的问题。 所有作业都认为它们在 node3 上运行,而运行 hostname 命令给出了准确的答案。这也是输出文件名的问题。我希望有许多不同的输出,但我只得到一个,文件名中带有“node3”。这似乎是 Bash Eval()/变量替换错误。 包装
SLURMD_NODENAME
在一个
bash -c "echo Bash3: \$SLURMD_NODENAME"
有效。但为什么我必须这样做?
中国.job:
#!/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_NODENAME: Name of the node upon which the current job step executes
(来自例如 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
其他命令都阻止变量扩展并在作业步骤中在计算节点上运行扩展(或主机名命令),因此它们按预期工作。
人们将 srun
视为 super 充电的 ssh
。您会注意到 srun hostname && srun $HOSTNAME
的行为就像 ssh node hostname && ssh node $HOSTNAME
(显然是对并行执行取模)。
SLURM 的细微差别:SBatch 文件在计算节点上执行。因此,您不会获得与在登录节点上运行 srun
时相同的输出。
对于单输出文件:不确定,但通常一个作业的所有输出都会被收集并放入一个接收器。这是交互式作业的标准输出或 sbatch 的单个输出文件。你从哪里得到占位符?我只知道作业 ID 和数组作业 ID 的 %j %A %a
。显然,只创建一个输出文件是有道理的。
关于linux - slurm SBATCH - 多个节点,相同的 SLURMD_NODENAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51328917/