2016-11-03 14 views
0

목표 : SLURM : 동일한 계산 노드 또는 다른 노드에서 다른 실행 파일을 병렬로 실행하려면 어떻게해야합니까?

  1. 실행하거나 공동 일정 또는 실행 파일을 실행하는 방법/SRUN 또는 mpirun이

연구 중 하나를 사용하여 sbatch 작업 제출

  • 애플리케이션 :

    코드를 :

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

    맨 페이지 es :

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

    '--ntasks = 2'로 최소한 두 가지 작업을 요청한 경우 스크립트가 작동합니다. – damienfrancois

    +0

    @damienfrancois 아래 제공된 답변으로 두 응용 프로그램의 출력을 저장할 수있었습니다. 그들은 병렬로 실행되는 것처럼 보였습니다.이 때문에 스레드가 동시에 실행되고 있기 때문에 스레드가 올바르게 작동하고 있다고 생각하게되었습니다. 분명히, 어플리케이션 A (20s)와 어플리케이션 B (50s)를 실행하면, 병렬로 실행되는 경우 B가 (50s) 정도에서 끝나야합니다. 나 맞아? 그런 식으로 애플리케이션을 실행해도 괜찮습니까? 아니면 내가 평범한 걸하고있어? – abeltre1

    +0

    이 경우 Slurm 설치가 할당 된 CPU에 작업을 한정하지 않습니다. cpusets 또는 cgroups가 설정된 클러스터에서 스크립트에 70 초가 걸릴 것입니다 (단지 잠자기하는 경우 제외) – damienfrancois

    답변

    1

    광범위한 연구 끝에 "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 초입니다.

    2

    스크립트가 약간 수정 될 수 있습니다. 당신의 프로세스가 동일한 노드 여부를 실행하면 당신은 상관하지 않는 경우, #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 manpage를 참조하여 실행 srun에게 있습니다 추가 할 수 있습니다.

    당신은 두 프로세스가, 샘 노드에서 실행 한 후, 당신은 -c 1으로보다는 -n 1으로 srun를 실행해야합니다 --cpus-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 
    

    주를 사용합니다.

    +0

    두 번째 옵션은 내가하고 싶은 것이지만 다음과 같은 오류가 발생합니다.srun : 오류 : --ntasks를 --exclusive로 설정해야합니다. srun : 오류 : --ntasks를 --exclusive로 설정해야합니다. – abeltre1

    +0

    스크립트를 실행하고 있습니까? 당신은 sbatch와 함께 제출해야합니다 – damienfrancois

    +0

    예, 나는 sbatch를 사용하여 작업을 제출하고 있습니다. 나는 그것을 sbatch없이 시도 할 때 실패합니다. 대신 srun이 병렬 실행을 허용하지 않았으므로 "mpirun"을 사용하여 병렬로 실행되도록 설정할 수 있습니까? – abeltre1