Distribution non homogène des processus entre les nœuds utilisant OpenMPI
-
21-12-2019 - |
Question
Je suis exécutable mon exécutable avec OpenMpi sur un cluster à l'aide du logiciel de gestion des ressources de Slurm . J'aimerais trouver un moyen de spécifier le nombre et quels processus doivent être attribués à chacun des nœuds, où le nombre de processus peut être différent pour chaque nœud.
Un exemple pour clarifier ce que je cherche: Supposons que je souhaite exécuter 7 processus sur 3 nœuds. Ensuite, je veux pouvoir dire quelque chose comme: Le nœud 1 doit exécuter le processus avec le rang N, le nœud 2 et 3 doit être exécuté 3 des processus restants.
Je ne me soucie pas de savoir quel nœud physique est nœud 1, car tous les nœuds sont égaux sur le cluster que j'utilise. De plus, je ne connais pas un priori quels nœuds je serai assigné par Slurm, donc je ne peux donc pas coder les noms des nœuds dans un hôte. Un exemple dans la documentation OpenMPI que j'ai trouvée définirait le fichier hostile comme celui-ci pour mon exemple:
aa slots=1
bb slots=3
cc slots=3
Mais j'ai deux problèmes avec cette approche:
- Je ne connais pas de priori les noms AA, BB, CC des nœuds.
- Même si je les connaissais, le processus sur le nœud AA n'a pas nécessairement le bon rang.
La solution
Grâce au commentaire de Hristo Iliev, j'ai trouvé la solution pour l'exemple indiqué dans la question suivante:
#!/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
C'est un peu moche cependant.Et probablement "Slot= 0-7" ne doit pas avoir le "7" codé dur.