MPICH/SLURM присваивают ранг хоста

Я использую MPICH со SLURM и пытаюсь присвоить ранг определенному узлу (из-за аппаратных различий я хочу, чтобы определенный узел всегда имел ранг 0). MPICH использует Hydra Process Manager. Проверив документацию, я должен иметь ранговый файл (или машинный файл, не знаю разницы) со списком хостов, которые назначаются в циклическом режиме.

Вот пример программы, которую я использую для тестирования:

#include <stdio.h>
#include <mpi.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char hostname[256];
    int rank;
    int size;

    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    gethostname(hostname,255);

    printf("I am rank: %d on host %s\n", rank, hostname);

    if (rank == 0) {
        for (int x = 1; x < size; x++) {
            int recv;
            MPI_Recv(&recv, 1, MPI_INT, x, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("host %s : rank %d received %d\n", hostname, rank, recv);
        }
    } else {
        printf("host %s : rank %d is sending a message\n", hostname, rank);
        MPI_Send(&rank, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }
    MPI_Barrier(MPI_COMM_WORLD);
    MPI_Finalize();
    return 0;
}

Содержимое моего рейтингового файла выглядит следующим образом:

node02
node01

Потому что я хочу, чтобы node02 был присвоен нулевой ранг. Затем я запускаю следующее:

salloc -N2 -c 24 -p debug mpiexec -machinefile ./rankfile.txt ./mpi_test

Это не удается с выводом и ошибкой:

I am rank: 0 on host node01
I am rank: 1 on host node02
host node02 : rank 1 is sending a message
Fatal error in MPI_Send: Unknown error class, error stack:
MPI_Send(174)..............: MPI_Send(buf=0x7fff9503155c, count=1, MPI_INT, dest=0, tag=0, MPI_COMM_WORLD) failed
MPID_nem_tcp_connpoll(1835): Communication error with rank 0: Connection refused

Поиск по этой ошибке не помог, а настройка HYDRA_DEBUG не предоставляет дополнительной информации об ошибке. Я могу использовать SSH между двумя узлами в порядке, работая без флага -f (или -machinefile), и rankfile работает нормально, а изменение порядка хостов в rankfile (фактически эквивалентно работе без Rank файла) работает нормально. Как ни странно, распечатка информации о ранге и имени хоста, работающей с файлом рангов, по-прежнему показывает, что node01 имеет нулевой ранг... Другое странное поведение заключается в том, что изменение рангового файла на:

node03
node01

Полностью завершается с ошибкой SLURM с сообщением «Запрошенная конфигурация узла недоступна», однако запуск с параметром -N3 и использование всех трех узлов работает без проблем (узел 03 является допустимым узлом в пуле отладки).

Это проблема конфигурации? Я использую флаги неправильно или неправильные флаги? Кажется, OpenMPI лучше поддерживает присвоение рангов, чем MPICH, но настройка SLURM и MPICH не была тривиальной из-за настройки кластера, поэтому я не решаюсь начать с OpenMPI.


person vassago    schedule 01.03.2017    source источник
comment
Прочитайте здесь. Итак, предлагаю попробовать. Вы можете найти документацию по установке Open MPI из источника здесь . Вы также можете установить его из репозитория в зависимости от вашей ОС. Установка проста (ну, в большинстве случаев :-)). Дайте мне знать, если вам нужна помощь с этим.   -  person Arash    schedule 02.03.2017
comment
Обычно это происходит (в том числе и с Open MPI), когда узлы пытаются взаимодействовать через TCP/IP, но конфигурация сети не позволяет этого. Типичной причиной может быть настройка сети каждого узла. Например, могут быть сетевые интерфейсы на разных узлах, которые используют одну и ту же IP-подсеть, но физически не связаны. В некоторых дистрибутивах Linux (в основном производных от RHEL) есть интерфейс виртуального моста, который автоматически открывается при загрузке с помощью libvirt (для использования с гостями KVM). Сетевой IP-адрес задается в файле конфигурации по умолчанию и будет одинаковым на всех узлах.   -  person Hristo Iliev    schedule 02.03.2017