Bash 使用SLURM和有限的资源并行运行MPI调用队列

Bash 使用SLURM和有限的资源并行运行MPI调用队列,bash,parallel-processing,mpi,cluster-computing,slurm,Bash,Parallel Processing,Mpi,Cluster Computing,Slurm,我尝试使用SLURM在集群上运行粒子群优化问题,优化算法由单核matlab进程管理。每个粒子求值都需要在两个Python程序之间交替进行多个MPI调用,直到结果收敛。每次MPI呼叫最多需要20分钟 最初,我天真地将每个MPI调用作为一个单独的SLURM作业提交,但由此产生的队列时间使其比串行本地运行每个作业慢。我现在正试图找到一种提交N节点作业的方法,该作业将持续运行MPI任务以利用可用资源。matlab进程将使用文本文件标志管理此作业 下面是一个伪代码bash文件,它可能有助于说明我试图在较小

我尝试使用SLURM在集群上运行粒子群优化问题,优化算法由单核matlab进程管理。每个粒子求值都需要在两个Python程序之间交替进行多个MPI调用,直到结果收敛。每次MPI呼叫最多需要20分钟

最初,我天真地将每个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
#/bin/bash
#斯拜奇-t 4:00:00#华尔街时间
#SBATCH-N 2#此作业中的节点数
#SBATCH-n 32#此作业中的处理器内核总数
#设置所需的模块
模块清洗
模块加载英特尔/16.0
模块加载gcc/6.3.0
#作业工作目录
echo工作目录是$SLURM\u SUBMIT\u DIR
cd$SLURM\u提交\u目录
主机主机名上运行的echo`
回音时间是`日期`
echo目录是`pwd`
#运行命令

而有两点:在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
#/bin/bash
#斯拜奇-t 4:00:00#华尔街时间
#SBATCH-N 2#此作业中的节点数
#SBATCH-n 4#此作业中的任务总数
#SBATCH-s 8#每个任务的处理器内核总数
#设置所需的模块
模块清洗
模块加载英特尔/16.0
模块加载gcc/6.3.0
#作业工作目录
echo工作目录是$SLURM\u SUBMIT\u DIR
cd$SLURM\u提交\u目录
主机主机名上运行的echo`
回音时间是`日期`
echo目录是`pwd`
#运行命令
虽然
完成
还要注意区分任务和核心-n表示将使用多少任务,-c表示每个任务将分配多少CPU


我编写的代码将在后台启动41个作业(从0到40,包括在内),但它们只会在资源可用时启动(--exclusive),在资源被占用时等待。每个作业将使用8个CPU。您将等待它们完成,我假设您将在该轮之后更新KeepRunning.txt。

除非给定的MPI运行少于几秒钟,否则一个选项是创建SLURM保留,然后简单地在该保留内提交作业(一旦保留激活,您的作业将不会在队列中花费任何时间)@GillesGouaillardet这是一个我不知道的选项,谢谢!看起来我可能没有权限在我们的集群上这样做,但我会设法在明天解决它。作为替代方案,我认为gnu sem可能也会起作用。对hpc来说还是新鲜事。