Executando o GNU Parallel em 2 ou mais nós com o scheduler do Slurm

4

Estou tentando distribuir execuções independentes de um processo usando o GNU Parallel em um HPC que usa o gerenciador de carga de trabalho Slurm. Resumidamente, aqui está a configuração da análise de dados:

Script # 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

Script # 2: run.sh

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

cat myCommands | parallel -j 4

Isso funciona, no entanto, ele usa apenas um nó. Os dois núcleos nesses nós são divididos em 4 threads para criar espaço para 4 jobs, conforme solicitado pelo paralelo. Isso não é desejável.

Minha pesquisa indica que precisarei de nodefile e sshloginfile para fazer isso, mas não vejo exemplos on-line que funcionem com Slurm , apenas com PBS system.

Como posso fazer o script (1) usar os dois nós e (2) não separar núcleos em threads?

    
por cryptic0 30.01.2017 / 19:24

1 resposta

0

Você pode fazer isso com um round robin srun (algo como):

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

Presumo que --cpus-per-task=2 será dado a srun . Deixe-me saber se você tem algum problema. Eu estava brincando com o paralelo esta manhã, mas não vejo como corrigir esse problema diretamente. Além disso, descobri que, se você scancel de um trabalho que contém tarefas paralelas do GNU, os processos em execução não morrem, a menos que você use srun .

    
por 23.05.2017 / 18:26