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:

  1. Je ne connais pas de priori les noms AA, BB, CC des nœuds.
  2. Même si je les connaissais, le processus sur le nœud AA n'a pas nécessairement le bon rang.
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top