Slurm을 사용하여 여러 노드에서 스크립트를 실행하는 방법은 무엇입니까?

Slurm을 사용하여 여러 노드에서 스크립트를 실행하는 방법은 무엇입니까?

Slurm을 사용하여 여러 노드에서 실행하려는 R 코드가 있고 매개 변수의 각 반복이 하나의 노드에서 실행됩니다. 이것은 내 Slurm 코드입니다.

#!/bin/bash
#SBATCH -o job-%A_task.out
#SBATCH --job-name=paral_cor
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --mem=124G                #I want to use 124Go / node
#SBATCH --cpus-per-task=32        #and 32CPUs / node 
#SBATCH --exclude=hpcsmp01


module load gcc/8.1.0 openblas/0.3.3 R

OUTPUT="$HOME"/PROJET_M2/data/$parallel_nodes_test
mkdir -p "$OUTPUT"


echo "Start job :"`date`


Rscript my_scrit.R --subset $i --file $1 > "$OUTPUT"


echo "Stop job :"`date`

매개변수에는 --subset $i1부터 X까지의 값이 있습니다(X는 내 R 코드의 입력 파일에 따라 다름). 그런 다음 의 각 반복마다 i노드에서 스크립트를 실행하고 싶습니다. 예를 들어 --subset 1-> 한 노드, --subset 2--> 다른 노드... --subset X-> 마지막 노드 까지

내 클러스터에서 제대로 작동하지 않기 때문에 일련의 작업을 사용하고 싶지 않습니다. 그래서 다음과 같은 bash 루프를 만들고 싶습니다.

for i in ?
 sbatch slurm_code.sh $i 
done

매개변수 간의 링크를 만드는 방법과 루프에서 매개변수를 1에서 X로 늘리는 --subset $i방법을 모르겠습니다 .for

답변1

srun스크립트에서 노드를 요청하기 위해 for 루프 내에 for 루프를 포함 하려고 합니다 . 5개의 하위 집합이 있다고 가정하면 다음을 사용할 수 있습니다.

for i in `seq 1 5`; do
  srun \
    -N1 \
    --mem=124G \
    --cpus-per-task=32 \
    Rscript my_script.R --subset $i --file $1 > "$OUTPUT-$i" &
done

wait

순서도 참고 &해주세요 wait. 이렇게 하면 이러한 프로세스가 병렬로 실행될 수 있으며 SLURM은 for 루프의 모든 것이 완료될 때까지 기다립니다.

이 경로를 선택하는 경우 출력 파일 사양을 병렬로 작성할 수 있는지도 확인해야 합니다. 위에서는 $OUTPUT각 하위 집합에 대해 서로 다른 파일을 제공하는 표시기를 변수에 추가했습니다 . wait출력을 큰 파일로 재조립하려면 명령 뒤에 일부 코드를 추가 해야 합니다 .

작업에 사용할 총 노드 수를 나타내는 --nodes값을 파일에 지정 하고 싶을 수도 있습니다 .sbatch

srun또 다른 옵션은 명령줄 인수를 사용하고 파일 에서 for 루프를 사용하여 이를 호출하는 셸 스크립트에 모든 작업 코드를 포함하는 것입니다 sbatch. 전임자.

for i in `seq 1 5`; do
  srun -N1 --mem=124G --cpus-per-task=32 bash runAnalysis.sh --subset $i &
done

wait

관련 정보