Esecuzione dello script Slurm con più nodi, avvia i passaggi del lavoro con 1 attività

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

  •  26-12-2019
  •  | 
  •  

Domanda

Sto cercando di avviare un gran numero di passaggi lavorativi utilizzando uno script batch. I diversi passaggi possono essere programmi completamente diversi e hanno bisogno di esattamente una CPU ciascuna. Per prima cosa ho provato a farlo usando l'argomento --multi-prog a srun. Sfortunatamente, quando si utilizzano tutte le CPU assegnate al mio lavoro in questo modo, le prestazioni si riducono in modo massiccio. Il tempo di esecuzione aumenta quasi il suo valore serializzato. Con la sottoscrizione, potrei migliorarlo un po '. Non sono riuscito a trovare nulla online per quanto riguarda questo problema, quindi ho pensato che sia un problema di configurazione del cluster che sto usando.

Così ho provato ad andare in un percorso diverso. Ho implementato il seguente script (lanciato tramite 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
.

Sono consapevole, che l'argomento --exclusive non è realmente necessario nel mio caso. Gli script della shell chiamati contengono i diversi binari e i loro argomenti. La parte rimanente del mio script fa affidamento sul fatto che tutti i processi hanno finito quindi il wait. Ho cambiato la linea telefonica per renderlo un esempio di funzionamento minimo.

All'inizio sembrava essere la soluzione. Sfortunatamente quando si aumenta il numero di nodi utilizzati nella mia allocazione del lavoro (ad esempio aumentando --ntasks a un numero maggiore del numero di CPU per nodo nel mio cluster), lo script non funziona più come previsto, restituire

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

e continuando a utilizzare solo un nodo (cpus I.e. 48 CPU nel mio caso, che passano attraverso i passaggi del lavoro veloce come prima, tutti i processi sugli altri nodi vengono uccisi).

Questo sembra essere il comportamento previsto, ma non riesco a capirlo davvero. Perché ogni lavoro in una determinata assegnazione deve includere un numero minimo di compiti pari al numero di nodi inclusi nell'assegnazione. Di solito non mi interessa davvero il numero di nodi usati nella mia assegnazione.

Come posso implementare il mio script batch, quindi può essere utilizzato su più nodi in modo affidabile?

È stato utile?

Soluzione

Trovato!La nomenclatura e le molte opzioni della riga di comando per Slurm mi ha confuso.La soluzione è data da

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

Questo specifica per eseguire il lavoro su esattamente un nodo che incorpora solo una singola attività.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top