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 $i
1부터 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