假设我有10个.R
脚本(或任务),希望使用HPC群集同时运行所有这些脚本。
HPC群集使用slurm
作为批处理/排队系统,并且我知道要运行多个任务,应使用命令srun
。
但是,我没有与HPC并行运行多个任务的任何经验,所以希望您能帮助我设置一个简单的job.sh
脚本,以通过slurm
提交给HPC。
这是我用来运行single .R
脚本的job.sh脚本的示例:
#!/bin/bash
#SBATCH --job-name=test
#SBATCH --partition=part_x
#SBATCH --nodelist=node888
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --time=01:00:00
#SBATCH --mem-per-cpu=45000
#SBATCH --output=node888.out
#SBATCH --error=node888.err
#SBATCH --mail-type=ALL
#SBATCH [email protected]
Rscript /my/dir/script_1.R
[我如何设置一个job.sh
脚本,使其并行运行我的10个.R
脚本,它们分别为:script_1.R,script_2.R,script_3.R,script_4.R,....,script_10.R?
感谢您的帮助
要在后台运行:
#!/bin/bash
name="script_"
for iter in {1..10}
do
mkdir $name$iter
cd $name$iter
cp ../$name$iter.R .
nohup sbatch ./$name$iter.R &
cd ../
done
假设您的脚本数量(script_1
,script_2
,script_3
)。
您可以做的是:
#!/bin/bash
#SBATCH --job-name=test
#SBATCH --partition=part_x
#SBATCH --nodelist=node888
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --time=01:00:00
#SBATCH --mem-per-cpu=45000
#SBATCH --output=node888.out
#SBATCH --error=node888.err
#SBATCH --mail-type=ALL
#SBATCH [email protected]
mpirun -np NUMBER_OF_PROCESSES wrapper.sh
然后,在wrapper.sh
中,您可以执行以下操作:
#!/bin/bash
# depending on your installation, you have to get env var that tells you what
# process number it is
PROC_ID=${HERE_GOES_YOUR_SYSTEM_SPECIFIC_VARIABLE_WITH_RANK}
Rscript /my_scripts/script_${PROC_ID}.R
当然,只要您通过指定--ntasks
,保留的节点数等正确分配资源,这是有道理的。但是,这可能会因目标安装而异。