Неоднородное распределение процессов между узлами с использованием OpenMPI

StackOverflow https://stackoverflow.com//questions/22041271

Вопрос

Я бегу свой исполняемый файл с OpenMPI в кластере с помощью кластера, используя Slurm Управляющий программным обеспечением. Я хотел бы найти способ указать, сколько и какие процессы должны быть назначены каждому из узлов, где количество процессов может отличаться для каждого узла.

Пример, чтобы уточнить, что я ищу: предположим, что я хочу запустить 7 процессов на 3 узлах. Тогда я хочу сказать что-то вроде: Узел 1 должен запускать процесс с рангом N, узел 2 и 3 должен запускать 3 из оставшихся процессов.

Мне все равно, каким физическим узлом узел 1, так как все узлы равны на кластере, который я использую. Также я не знаю априори, какие узлы у меня будут назначаться Slurm, поэтому я не могу сложно кодировать имена узлов в HostFile. Пример документации OpenMPI, которую я обнаружил, определяет, как это для моего примера:

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

Но у меня есть две проблемы с этим подходом:

  1. Я не знаю априори имен AA, BB, CC узлов.
  2. Даже если я знал их, процесс на узле AA не обязательно имеет правильный ранг.
Это было полезно?

Решение

Благодаря комментарию Hristo ILiev, я нашел решение для примера, указанного в вопросе:

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

Это немного ужасно.И, вероятно, «слот= 0-7» не должен иметь жесткокодируемый «7».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top