我正在尝试使用SLURM在群集上运行粒子群优化问题,优化算法由单核matlab进程管理。每个粒子评估需要多个MPI调用,这些调用在两个Python程序之间交替,直到结果收敛。每次MPI通话最多需要20分钟。
我最初天真地将每个MPI调用作为单独的SLURM作业提交,但是生成的队列时间比在本地串行运行每个作业要慢。我现在正在尝试找出一种方法来提交N节点作业,该作业将持续运行MPI任务以利用可用资源。 matlab进程将使用文本文件标志管理此作业。
这是一个伪代码bash文件,可能有助于说明我在较小规模上尝试做的事情:
project.com/run_migrations
这种方法不起作用(只是崩溃),但我不知道为什么(可能是资源的过度使用?)。我的一些同行建议将#!/bin/bash
#SBATCH -t 4:00:00 # walltime
#SBATCH -N 2 # number of nodes in this job
#SBATCH -n 32 # total number of processor cores in this job
# Set required modules
module purge
module load intel/16.0
module load gcc/6.3.0
# Job working directory
echo Working directory is $SLURM_SUBMIT_DIR
cd $SLURM_SUBMIT_DIR
echo Running on host `hostname`
echo Time is `date`
echo Directory is `pwd`
# Run Command
while <"KeepRunning.txt” == 1>
do
for i in {0..40}
do
if <“RunJob_i.txt” == 1>
then
mpirun -np 8 -rr -f ${PBS_NODEFILE} <job_i> &
fi
done
done
wait
与parallel
一起使用,但据我所知,这需要我批量调用MPI函数。这将是对资源的巨大浪费,因为运行的很大一部分快速完成或失败(这是预期的行为)。问题的一个具体例子是开始一批5个8核工作,其中4个工作立即崩溃;现在32个核心在第5个工作完成等待20分钟时什么都不做。
由于优化可能需要超过5000 mpi的呼叫,因此效率的任何提高都会对绝对壁挂时间产生巨大影响。有没有人对如何在大型SLURM作业上运行持续的MPI调用流有任何建议?我真的很感激任何帮助。
答案 0 :(得分:1)
有几件事:在SLURM下你应该使用srun,而不是mpirun。 第二件事是你提供的伪代码启动无限数量的作业而不等待任何完成信号。您应该尝试将等待放入内部循环,因此您只需启动一组作业,等待它们完成,评估条件,然后启动下一组作业:
#!/bin/bash
#SBATCH -t 4:00:00 # walltime
#SBATCH -N 2 # number of nodes in this job
#SBATCH -n 4 # total number of tasks in this job
#SBATCH -s 8 # total number of processor cores for each task
# Set required modules
module purge
module load intel/16.0
module load gcc/6.3.0
# Job working directory
echo Working directory is $SLURM_SUBMIT_DIR
cd $SLURM_SUBMIT_DIR
echo Running on host `hostname`
echo Time is `date`
echo Directory is `pwd`
# Run Command
while <"KeepRunning.txt” == 1>
do
for i in {0..40}
do
if <“RunJob_i.txt” == 1>
then
srun -np 8 --exclusive <job_i> &
fi
done
wait
<Update "KeepRunning.txt”>
done
注意区分任务和核心。 -n表示将使用多少任务,-c表示将分配每个任务多少cpus。
我编写的代码将在后台启动41个作业(从0到40,包括在内),但它们只会在资源可用( - 独占)时启动,等待它们被占用。每个作业将使用8个CPU。您将等待他们完成,我假设您将在该轮之后更新KeepRunning.txt。