Slurm Array Job:可以在同一节点上输出文件吗?
Slurm Array Job: output file on same node possible?
我有一个包含四个节点 A、B、C 和 D 以及 Slurm 版本 17.11.7 的计算集群。我正在为 Slurm 阵列工作而苦苦挣扎。我有以下 bash 脚本:
#!/bin/bash -l
#SBATCH --job-name testjob
#SBATCH --output output_%A_%a.txt
#SBATCH --error error_%A_%a.txt
#SBATCH --nodes=1
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=50000
FOLDER=/home/user/slurm_array_jobs/
mkdir -p $FOLDER
cd ${FOLDER}
echo $SLURM_ARRAY_TASK_ID > ${SLURM_ARRAY_TASK_ID}
脚本生成以下文件:
- output_*txt,
- error_*txt,
- 根据 ${SLURM_ARRAY_TASK_ID}
命名的文件
我运行我的计算集群节点A上的bash脚本如下
sbatch --array=1-500 example_job.sh
这 500 个作业分布在节点 A-D 中。此外,输出文件存储在节点 A-D 上,其中对应的数组作业具有 运行。在这种情况下,例如,大约125个"output_"个文件分别存储在A、B、C和D上。
有没有办法将所有输出文件存储在我提交脚本的节点上,在本例中,是在节点 A 上?也就是我喜欢把所有500个"output_"个文件都存放在节点A上。
Slurm 不处理 input/output 文件传输并假定当前工作目录是网络文件系统,例如 NFS for the simplest case. But GlusterFS, BeeGFS, or Lustre 是 Slurm 的其他流行选择。
使用 epilog 脚本将输出复制回脚本提交的位置,然后删除它们。
添加到slurm.conf:
Epilog=/etc/slurm-llnl/slurm.epilog
slurm.epilog 脚本执行复制(通过 chmod +x 使其可执行):
#!/bin/bash
userId=`scontrol show job ${SLURM_JOB_ID} | grep -i UserId | cut -f2 -d '=' | grep -i -o ^[^\(]*`
stdOut=`scontrol show job ${SLURM_JOB_ID} | grep -i StdOut | cut -f2 -d '='`
stdErr=`scontrol show job ${SLURM_JOB_ID} | grep -i StdErr | cut -f2 -d '='`
host=`scontrol show job ${SLURM_JOB_ID} | grep -i AllocNode | cut -f3 -d '=' | cut -f1 -d ':'`
hostDir=`scontrol show job ${SLURM_JOB_ID} | grep -i Command | cut -f2 -d '=' | xargs dirname`
hostPath=$host:$hostDir/
runuser -l $userId -c "scp $stdOut $stdErr $hostPath"
rm -rf $stdOut
rm -rf $stdErr
(在没有 NFS 或类似共享目录的情况下从 PBS 切换到 Slurm 很痛苦。)
我有一个包含四个节点 A、B、C 和 D 以及 Slurm 版本 17.11.7 的计算集群。我正在为 Slurm 阵列工作而苦苦挣扎。我有以下 bash 脚本:
#!/bin/bash -l
#SBATCH --job-name testjob
#SBATCH --output output_%A_%a.txt
#SBATCH --error error_%A_%a.txt
#SBATCH --nodes=1
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=50000
FOLDER=/home/user/slurm_array_jobs/
mkdir -p $FOLDER
cd ${FOLDER}
echo $SLURM_ARRAY_TASK_ID > ${SLURM_ARRAY_TASK_ID}
脚本生成以下文件:
- output_*txt,
- error_*txt,
- 根据 ${SLURM_ARRAY_TASK_ID} 命名的文件
我运行我的计算集群节点A上的bash脚本如下
sbatch --array=1-500 example_job.sh
这 500 个作业分布在节点 A-D 中。此外,输出文件存储在节点 A-D 上,其中对应的数组作业具有 运行。在这种情况下,例如,大约125个"output_"个文件分别存储在A、B、C和D上。
有没有办法将所有输出文件存储在我提交脚本的节点上,在本例中,是在节点 A 上?也就是我喜欢把所有500个"output_"个文件都存放在节点A上。
Slurm 不处理 input/output 文件传输并假定当前工作目录是网络文件系统,例如 NFS for the simplest case. But GlusterFS, BeeGFS, or Lustre 是 Slurm 的其他流行选择。
使用 epilog 脚本将输出复制回脚本提交的位置,然后删除它们。
添加到slurm.conf:
Epilog=/etc/slurm-llnl/slurm.epilog
slurm.epilog 脚本执行复制(通过 chmod +x 使其可执行):
#!/bin/bash
userId=`scontrol show job ${SLURM_JOB_ID} | grep -i UserId | cut -f2 -d '=' | grep -i -o ^[^\(]*`
stdOut=`scontrol show job ${SLURM_JOB_ID} | grep -i StdOut | cut -f2 -d '='`
stdErr=`scontrol show job ${SLURM_JOB_ID} | grep -i StdErr | cut -f2 -d '='`
host=`scontrol show job ${SLURM_JOB_ID} | grep -i AllocNode | cut -f3 -d '=' | cut -f1 -d ':'`
hostDir=`scontrol show job ${SLURM_JOB_ID} | grep -i Command | cut -f2 -d '=' | xargs dirname`
hostPath=$host:$hostDir/
runuser -l $userId -c "scp $stdOut $stdErr $hostPath"
rm -rf $stdOut
rm -rf $stdErr
(在没有 NFS 或类似共享目录的情况下从 PBS 切换到 Slurm 很痛苦。)