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:

    .
  1. Non conosco un numero a priori I nomi AA, BB, CC dei nodi.
  2. Anche se li conoscessi, il processo sul nodo AA non ha necessariamente il giusto rango.
È stato utile?

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".

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