Pergunta

Estou executando meu executável com OpenMPI em um cluster usando o SLURM software de gerenciamento de recursos.Gostaria de encontrar uma maneira de especificar quantos e quais processos devem ser atribuídos a cada um dos nós, onde o número de processos pode ser diferente para cada nó.

Um exemplo para esclarecer o que procuro:Suponha que eu queira executar 7 processos em 3 nós.Então quero poder dizer algo como:o nó 1 deve executar o processo com classificação n, os nós 2 e 3 devem executar cada um 3 dos processos restantes.

Não me importa qual nó físico é o nó 1, pois todos os nós são iguais no cluster que estou usando.Além disso, não sei a priori quais nós serão atribuídos pelo SLURM, portanto, não posso codificar os nomes dos nós em um arquivo host.Um exemplo na documentação do OpenMPI que encontrei definiria o arquivo host assim para o meu exemplo:

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

mas tenho dois problemas com essa abordagem:

  1. Não sei a priori os nomes aa, bb, cc dos nós.
  2. Mesmo que eu os conhecesse, o processo no nó aa não tem necessariamente a classificação correta.
Foi útil?

Solução

Graças ao comentário de Hristo Iliev, encontrei a solução para o exemplo indicado na pergunta:

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

É um pouco feio.E provavelmente "slot = 0-7" não deveria ter o "7" codificado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top