Executando o slurm script com vários nós, o lançamento de etapas de trabalho com a tarefa 1

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

  •  26-12-2019
  •  | 
  •  

Pergunta

Eu estou tentando lançar um grande número de etapas de trabalho usando um script em lotes.As diferentes etapas podem ser completamente diferentes programas e não precisa, exatamente, um CPU de cada um.Primeiro eu tentei fazer isso usando o --multi-prog argumento srun.Infelizmente, quando utilizar todas as CPUs atribuído para o meu trabalho dessa maneira, diminui o desempenho maciçamente.O tempo de execução aumenta para quase sua serializado valor.Por undersubscribing eu poderia melhorar um pouco.Eu não poderia encontrar qualquer coisa online sobre este problema, então eu supus que ele seja um problema de configuração do cluster que estou usando.

Então eu tentei ir por um caminho diferente.Implementei o seguinte script (lançado através de 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

Estou ciente, de que o --exclusive o argumento não é realmente necessário no meu caso.Os scripts do shell chamado contém os binários diferentes e seus argumentos.A restante parte do meu roteiro se baseia no fato de que todos os processos tenham terminado, portanto, o wait.Eu mudei a linha de chamada para torná-lo um mínimo exemplo de trabalho.

No começo isso parecia ser a solução.Infelizmente, quando se aumenta o número de nós utilizados no meu trabalho de atribuição (por exemplo, aumentando --ntasks para um número maior do que o número de processadores por nó em minha cluster), o script não funciona como esperado mais, retornando

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

e continua usando apenas um nó (por exemplo,48 CPUs no meu caso, que percorrer as etapas de trabalho tão rápido como antes, todos os processos sobre o outro nó(s) são, subsequentemente mortos).

Este parece ser o comportamento esperado, mas eu realmente não consigo entender.Por que é que a cada etapa de trabalho em uma determinada distribuição deve incluir um número mínimo de tarefas igual ao número de nós incluídos na alocação.Eu normalmente realmente não me importo sobre o número de nós utilizados na minha atribuição.

Como posso implementar o meu script em lotes, de modo que ele pode ser usado em vários nós de forma confiável?

Foi útil?

Solução

Encontrou!A nomenclatura e as muitas opções de linha de comando para slurm me confundiu.A solução é dada por

#!/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

Isto especifica que a tarefa seja executada exatamente um nó a incorporação de uma única tarefa só.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top