Slurm 스케줄러를 사용하여 2개 이상의 노드에서 GNU Parallel 실행

Slurm 스케줄러를 사용하여 2개 이상의 노드에서 GNU Parallel 실행

Slurm 워크로드 관리자를 사용하여 HPC에서 GNU Parallel을 사용하여 독립형 프로세스를 배포하려고 합니다. 간단히 말해서, 이는 데이터 분석을 위한 설정입니다.

스크립트 #1: myCommands

./myscript --input infile.txt --setting 1 --output out1
./myscript --input infile.txt --setting 2 --output out2
./myscript --input infile.txt --setting 3 --output out3
./myscript --input infile.txt --setting 4 --output out4

스크립트 #2: run.sh

#SBATCH --time=00:02:00
#SBATCH --nodes=2
#SBATCH --cpus-per-task=2

cat myCommands | parallel -j 4

이는 작동하지만 하나의 노드만 사용합니다. 이 노드의 2개 코어는 4개의 스레드로 분할되어 병렬 요청에 따라 4개의 작업을 위한 공간을 확보합니다. 이는 바람직하지 않습니다.

nodefile내 검색에 따르면 이 작업을 수행하려면 a 및 a가 필요 하지만 온라인에서 시스템 을 sshloginfile사용하는 예는 없습니다 .SlurmPBS

스크립트에서 (1) 두 개의 노드를 사용하고 (2) 코어를 스레드로 분할하지 않도록 하려면 어떻게 해야 합니까?

답변1

srun다음과 같은 라운드 로빈 방식을 통해 이 작업을 수행할 수 있습니다 .

jobs=({1..4})
nodes=($(scontrol show hostname $SLURM_NODELIST))
for ((n = 0; n < ${#jobs[@]}; n++)); do
  index=$(expr $n % ${#nodes[@]})
  srun --nodes=1 --ntasks=1 --nodelist=${nodes[$index]} \
       --exclusive ./myscript --input infile.txt \
       --setting $n --output out$n &
done
wait

--cpus-per-task=2주어질 것 같아요 srun. 질문이 있으시면 알려주시기 바랍니다. 오늘 아침에 병렬 처리 작업을 하고 있었는데 이 문제를 직접 해결하는 방법을 모르겠습니다. 또한 scancel작업에 GNU 병렬 작업이 포함된 경우 srun.

답변2

저는 현재 GNU Parallel을 사용하여 기본적으로 작업을 원격 클러스터에 "일괄 처리"하고 있습니다.

다음은 스크립트 이름을 제거한 시도입니다.

parallel --colsep '\t' \
         --shuf \
         --jobs=25% \
         --delay=1s \
         ssh -q ${remote} \
         sbatch --chdir="${remote_dir}" \
         --job-name="my-job-name-{1}-{2}-{4}-{5}_{6}" \
         --output="${OUTPUT_PREFIX}/joblogs/%x.out" \
         --error="${OUTPUT_PREFIX}/joblogs/%x.err" \
         my-job.sh \
         "${OUTPUT_PREFIX}/" "{1}" "{2}" "{4}" "{3}" "{5}" "{6}" \
         :::: "${COMPARISONS}" \
         :::: "${REPORTS}" \
         :::: "${METHODS}"

${COMPARISONS}및 변수 ${REPORTS}${METHODS}탭으로 구분된 파일로 에 전달됩니다 sbatch. 기본적으로 이는 인수의 병렬 교차곱을 사용하여 다양한 변형을 제출한 다음 작업 제어가 병렬이 아닌 SLURM에 맡겨집니다.

my-job.sh다음과 같습니다:

#!/usr/bin/env bash

#SBATCH -N 1
#SBATCH -n 1
#SBATCH -c 4
#SBATCH -t 0-01:00:00

exec ~/bin/job.bin $@

대기열이 이를 지원하는 경우 노드를 수동으로 지정할 필요가 없습니다(다른 이유가 없는 한).

이게 도움이 되길 바란다. 나는 실제로 스케줄러를 압도하지 않도록 작업 속도를 늦추는 방법을 찾고 있습니다. (작업이 완료되기 시작할 때까지 큐에 있는 QOS에 충분한 작업을 직접 제출했으며 대부분의 작업은 완료하는 데 몇 초가 걸립니다.) 10 분). Parallel에는 --delay수백 개의 작업을 제출할 때 도움이 될 수 있는 옵션이 있습니다.

sbatch처음 시작한 스크립트에서 병렬 처리를 사용하고 SLURM에서 작업을 시작하게 하려면 @barrymoo의 답변을 더 잘 적용 하고 노드 목록을 제거하는 것이 더 나을 수 있습니다 (다시 말하지만, 하위 집합만 사용하라는 특별한 요구 사항이 없는 한). 노드 목록) 귀하가 사용할 수 있는 노드, 대부분의 HPC는 해당 대기열의 노드 간에 공평하게 설계되었습니다. )

관련 정보