여러 노드로 slurm 스크립트 실행, 1개의 작업으로 작업 단계 시작

StackOverflow https://stackoverflow.com//questions/24056961

  •  26-12-2019
  •  | 
  •  

문제

배치 스크립트를 사용하여 다수의 작업 단계를 시작하려고 합니다.서로 다른 단계는 완전히 다른 프로그램일 수 있으며 각각 정확히 하나의 CPU가 필요합니다.먼저 나는 --multi-prog 주장 srun.불행하게도 내 작업에 할당된 모든 CPU를 이런 방식으로 사용하면 성능이 크게 저하됩니다.런타임은 거의 직렬화된 값으로 증가합니다.구독을 적게 함으로써 이 문제를 조금 개선할 수 있었습니다.이 문제와 관련된 내용을 온라인에서 찾을 수 없었기 때문에 사용 중인 클러스터의 구성 문제인 것으로 가정했습니다.

그래서 다른 길로 가려고 했어요.다음 스크립트를 구현했습니다(다음을 통해 시작됨). sbatch my_script.slurm):

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

나는 알고 있다. --exclusive 내 경우에는 논쟁이 실제로 필요하지 않습니다.호출된 쉘 스크립트에는 다양한 바이너리와 해당 인수가 포함되어 있습니다.내 스크립트의 나머지 부분은 모든 프로세스가 완료되었다는 사실에 의존합니다. wait.최소한의 작업 예제로 만들기 위해 호출 회선을 변경했습니다.

처음에는 이것이 해결책인 것처럼 보였습니다.안타깝게도 작업 할당에 사용되는 노드 수를 늘릴 때(예: --ntasks 내 클러스터의 노드당 CPU 수보다 큰 숫자로 설정하면 스크립트가 더 이상 예상대로 작동하지 않고 반환됩니다.

srun: Warning: can't run 1 processes on 2 nodes, setting nnodes to 1

계속해서 하나의 노드만 사용합니다(예:내 경우에는 48개의 CPU가 이전처럼 빠르게 작업 단계를 진행하고 이후에 다른 노드의 모든 프로세스가 종료됩니다.

이는 예상된 동작인 것 같지만 실제로는 이해할 수 없습니다.지정된 할당의 모든 작업 단계에 할당에 포함된 노드 수와 동일한 최소 작업 수를 포함해야 하는 이유는 무엇입니까?나는 일반적으로 할당에 사용되는 노드 수에 대해 전혀 신경 쓰지 않습니다.

여러 노드에서 안정적으로 사용할 수 있도록 배치 스크립트를 어떻게 구현합니까?

도움이 되었습니까?

해결책

그것을 발견!슬러밍을 위한 명명법과 많은 명령줄 옵션이 나를 혼란스럽게 했습니다.해결책은 다음과 같습니다.

#!/bin/bash
#SBATCH -o $HOME/slurm/slurm_out/%j.%N.out
#SBATCH --error=$HOME/slurm/slurm_out/%j.%N.err_out
#SBATCH --get-user-env
#SBATCH -J test
#SBATCH -D $HOME/slurm
#SBATCH --export=NONE
#SBATCH --ntasks=48

NR_PROCS=$(($SLURM_NTASKS))
for PROC in $(seq 0 $(($NR_PROCS-1)));
do
    #My call looks like this:
    #srun --exclusive -N1 -n1 bash $PROJECT/call_shells/call_"$PROC".sh &
    srun --exclusive -N1 -n1 hostname &
    pids[${PROC}]=$!    #Save PID of this background process
done
for pid in ${pids[*]};
do
    wait ${pid} #Wait on all PIDs, this returns 0 if ANY process fails
done

이는 단일 작업만 통합하는 정확히 하나의 노드에서 작업을 실행하도록 지정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top