Pregunta

Estoy ejecutando mi ejecutable con OpenMPI en un clúster usando la Slurm Software de gestión de recursos. Me gustaría encontrar una manera de especificar cuántos y qué procesos deben asignarse a cada uno de los nodos, donde el número de procesos puede ser diferente para cada nodo.

Un ejemplo para aclarar lo que estoy buscando: supongamos que quiero ejecutar 7 procesos en 3 nodos. Entonces quiero poder decir algo como: El nodo 1 debe ejecutar el proceso con rango n, el nodo 2 y 3 debe ejecutar 3 de los procesos restantes.

No me importa qué nodo físico es el nodo 1, ya que todos los nodos son iguales en el clúster que estoy usando. Además, no sé a priori qué nodos me asignaré por Slurm, por lo que no puedo codificar los nombres de los nodos en unfile de host. Un ejemplo en la documentación de OpenMPI que encontré definiría el archivo Hostfile como este para mi ejemplo:

aa slots=1
bb slots=3
cc slots=3

Pero tengo dos problemas con este enfoque:

  1. No sé a priori los nombres AA, BB, CC de los nodos.
  2. Incluso si los conocí, el proceso en el nodo AA no necesariamente tiene el rango adecuado.
¿Fue útil?

Solución

Gracias al comentario de HRISTO ILIEV, encontré la solución para el ejemplo establecido en la pregunta:

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

es un poco feo aunque.Y probablemente "Slot= 0-7" no debe tener la "7" codificada dura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top