2017-06-17 12 views
3

我试图在使用SLURM的集群上运行粒子群优化问题,并使用由单核心matlab进程管理的优化算法。每个粒子评估都需要在两个Python程序之间交替进行多个MPI调用,直到结果收敛。每个MPI呼叫最多需要20分钟。与SLURM和有限资源并行地运行MPI调用队列

我最初很天真地将每个MPI调用作为一个单独的SLURM作业提交,但由此产生的排队时间使得它比本地串行运行每个作业要慢。我现在试图找出提交N节点作业的方法,该作业将持续运行MPI任务以利用可用资源。 matlab进程将使用文本文件标志来管理这项工作。

下面是一个伪代码bash的文件,该文件可能有助于解释什么,我想在一个较小的规模做到:

#!/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 

这种方法是行不通的(只是崩溃),但我不”不知道为什么(可能会过度使用资源?)。我的一些同行建议使用parallelsrun,但据我所知,这需要我分批调用MPI功能。这将是一个巨大的资源浪费,因为很大一部分运行很快完成或失败(这是预期的行为)。这个问题的一个具体例子是开始一批5个8核心工作,其中4个立即崩溃;现在32核心将无所事事,而第五项工作等待20分钟才能完成。

由于优化可能需要5000个以上的mpi调用,任何提高效率都会使绝对壁挂时间产生巨大差异。有人对我如何在大型SLURM作业上运行持续的MPI调用流有任何建议吗?我真的很感激任何帮助。

+0

除非给定的MPI运行不到几秒钟,一个选择是创建一个SLURM预订,然后只需提交预订里面你们的工作(一旦预留处于活动,你的工作不会花费任何时间在排队) –

+0

@GillesGouaillardet这是一个我没有意识到的选项,谢谢!看起来我可能没有权限在我们的群集上执行此操作,但我会尽力在明天将其整理出来。作为替代,我认为gnu sem也可能工作。对于hpc还是新的。 – user8176985

回答

0

一些事情:在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,含税),但一旦资源可用(--exclusive),他们才开始的代码,等待,而他们都被占用。每个作业将使用8个CPU。您将等待它们完成,并且我假设您将在该轮后更新KeepRunning.txt。