Mpi SLURM:如何在同一计算节点或不同节点上并行运行不同的可执行文件?

Mpi SLURM:如何在同一计算节点或不同节点上并行运行不同的可执行文件?,mpi,executable,job-scheduling,slurm,sbatch,Mpi,Executable,Job Scheduling,Slurm,Sbatch,目标: 了解如何使用sbatch作业提交运行或协同调度或执行可执行文件/应用程序 使用srun或mpirun 研究: 代码段: #!/bin/bash #SBATCH --job-name LEBT #SBATCH --partition=angel #SBATCH --nodelist=node38 #SBATCH --sockets-per-node=1 #SBATCH --cores-per-socket=1 #SBATCH --time 00:10:00 #SBATC

目标:

  • 了解如何使用sbatch作业提交运行或协同调度或执行可执行文件/应用程序
  • 使用srun或mpirun
  • 研究:

    代码段:

     #!/bin/bash
     #SBATCH --job-name LEBT 
     #SBATCH --partition=angel
     #SBATCH --nodelist=node38
     #SBATCH --sockets-per-node=1
     #SBATCH --cores-per-socket=1
     #SBATCH --time 00:10:00 
     #SBATCH --output LEBT.out
    
     # the slurm module provides the srun command
     module load openmpi
    
    
     srun  -n 1   ./LU.exe -i 100 -s 100  &
     srun  -n 1   ./BT.exe  &
    
     wait 
    
    手册页:

     [srun]-->[https://computing.llnl.gov/tutorials/linux_clusters/man/srun.txt]
    
     [mpirun]-->[https://www.open-mpi.org/doc/v1.8/man1/mpirun.1.php]
    

    经过广泛的研究,我得出结论,“srun”是您希望用于并行运行作业的命令。此外,您需要一个助手脚本来充分执行整个过程。我已经编写了以下脚本,以便在一个节点中毫无问题地执行应用程序

    #!/usr/bin/python
    #SBATCH --job-name TPython
    #SBATCH --output=ALL.out
    #SBATCH --partition=magneto
    #SBATCH --nodelist=node1
    
    
    import threading
    import os
    
    addlock = threading.Lock()
    
    class jobs_queue(threading.Thread):
        def __init__(self,job):
                threading.Thread.__init__(self,args=(addlock,))
                self.job = job
        def run(self):
                self.job_executor(self.job)
    
        def job_executor(self,cmd):
                os.system(cmd)
    
    if __name__ == __main__:
    
        joblist =  ["srun  ./executable2",
                    "srun  ./executable1 -i 20 -s 20"]
    
        #creating a thread of jobs 
        threads = [jobs_queue(job)  for job in joblist]
    
        #starting jobs in the thread 
        [t.start() for t in threads]
    
        #no interruptions 
        [t.join()  for t in threads]
    

    在我的特定案例中,两个激活了特定标志的可执行文件都会产生大约55秒的时间。然而,当它们并行运行时,它们都产生59秒的执行时间

    您的脚本只需稍加修改即可工作。如果您不关心进程是否在同一节点上运行,请添加
    #SBATCH--ntasks=2

    #!/bin/bash
    #SBATCH --job-name LEBT 
    #SBATCH --ntasks=2
    #SBATCH --partition=angel
    #SBATCH --nodelist=node38
    #SBATCH --sockets-per-node=1
    #SBATCH --cores-per-socket=1
    #SBATCH --time 00:10:00 
    #SBATCH --output LEBT.out
    
    # the slurm module provides the srun command
    module load openmpi
    
    srun  -n 1 --exclusive  ./LU.exe -i 100 -s 100  &
    srun  -n 1 --exclusive  ./BT.exe  &
    
    wait 
    
    srun
    --exclusive
    参数用于告诉
    srun
    使用整个分配的子集运行。请参见

    如果希望两个进程都在sam节点上运行,请使用
    --CPU per task=2

    #!/bin/bash
    #SBATCH --job-name LEBT 
    #SBATCH --cpus-per-task=2
    #SBATCH --partition=angel
    #SBATCH --nodelist=node38
    #SBATCH --sockets-per-node=1
    #SBATCH --cores-per-socket=1
    #SBATCH --time 00:10:00 
    #SBATCH --output LEBT.out
    
    # the slurm module provides the srun command
    module load openmpi
    
    srun  -c 1 --exclusive  ./LU.exe -i 100 -s 100  &
    srun  -c 1 --exclusive  ./BT.exe  &
    
    wait 
    

    请注意,然后,您必须使用
    -c1
    而不是
    -n1

    运行
    srun
    。如果您使用
    --ntasks=2
    @damienfrancois请求了至少两个任务,则脚本可以工作。我可以使用下面提供的答案存储两个应用程序的输出。它们似乎是并行执行的,这让我觉得线程工作正常,因为它们是同时执行的。显然,如果我执行应用程序A(20秒)和应用程序B(50秒),如果它们并行运行,那么作业应该在B(50秒)左右的位置完成。我说得对吗?现在,以这种方式执行应用程序可以吗?或者我正在做一些不寻常的事情?如果是这样,这意味着Slurm安装不会将作业限制在分配给它们的CPU上。在设置了cpusets或cgroups的集群上,您的脚本需要70秒(除非它们只是睡眠)@damienfrancois这是一个很好的信息。那么,有没有办法让它们在同一个节点上并行运行呢?使用
    --cpu per task=2
    第二个选项是我想要做的,但是我得到了以下错误。srun:error:--ntasks必须设置为--exclusive srun:error:--ntasks必须设置为--exclusive您只需要运行脚本吗?你应该使用sbatch提交作业是的,我正在使用sbatch提交作业。当我在没有sbatch的情况下尝试时,它失败了。相反,由于srun不允许并行执行,您可以使用“mpirun”将其设置为并行运行吗?