Distribuzione non omogenea dei processi tra i nodi che utilizzano OpenMPI
-
21-12-2019 - |
Domanda
Sto eseguendo il mio eseguibile con OpenMPI su un cluster usando il slurm risorse Gestione del software. Vorrei trovare un modo per specificare quanti e quali processi dovrebbero essere assegnati a ciascuno dei nodi, in cui il numero di processi potrebbe essere diverso per ciascun nodo.
Un esempio per chiarire ciò che sto cercando: supponiamo che voglio eseguire 7 processi su 3 nodi. Allora voglio essere in grado di dire qualcosa come: Il nodo 1 dovrebbe eseguire il processo con Rank N, il nodo 2 e 3 dovrebbe essere eseguito 3 dei processi rimanenti.
Non mi interessa quale nodo fisico sia il nodo 1, poiché tutti i nodi sono uguali sul cluster che sto usando. Inoltre non conosco un priori quali nodi saranno assegnati da Slurm, quindi non posso effettuare il codice fisso dei nomi dei nodi in un fleile host. Un esempio nella documentazione OpenMPI che ho trovato definirebbe il fleile del host come questo per il mio esempio:
aa slots=1
bb slots=3
cc slots=3
.
Ma ho due problemi con questo approccio:
- .
- Non conosco un numero a priori I nomi AA, BB, CC dei nodi.
- Anche se li conoscessi, il processo sul nodo AA non ha necessariamente il giusto rango.
Soluzione
Grazie al commento di Hristo Iliev, ho trovato la soluzione per l'esempio indicato nella domanda:
#!/bin/bash
HOSTFILE=./myHostfile
RANKFILE=./myRankfile
# Write the names of the nodes allocated by SLURM to a file
scontrol show hostname ${SLURM_NODELIST} > $HOSTFILE
# Number of processes
numProcs=7
# Number of nodes
numNodes=${SLURM_JOB_NUM_NODES}
# Counts the number of processes already assigned
count=0
while read p; do
# Write the node names to a rank file
if [ $count == 0 ]
then
echo "rank $count=$p slot=0-7" > $RANKFILE
let count=$count+1
let numNodes=$numNodes-1 # Number of nodes that are still available
else
# Compute the number of processes that should be assigned to this node
# by dividing the number of processes that still need to be assigned by
# the number of nodes that are still available. (This automatically "floor"s the result.)
let numProcsNode=($numProcs-$count)/$numNodes
for i in `seq 1 $numProcsNode`
do
echo "rank $count=$p slot=0-7" >> $RANKFILE
let count=$count+1
done
let numNodes=$numNodes-1 # Number of nodes that are still available
fi
done < $HOSTFILE
mpirun --display-map -np $numProcs -rf $RANKFILE hostname
.
È un po 'brutto però.E probabilmente "slot= 0-7" non dovrebbe avere il codice duro "7".