OpenMPI / mpirun или mpiexec с разрешением sudo

Я работаю над кодом, который работает с процессором Epiphany (http://www.parallella.org/) и для запуска кодов Epiphany мне нужны привилегии sudo для программы на стороне хоста. От Судо нет спасения!

Теперь мне нужно запустить этот код на нескольких узлах, для этого я использую mpi, но mpi не будет правильно работать с sudo

#sudo mpirun -n 12 --hostfile hosts -x LD_LIBRARY_PATH=${ELIBS} -x EPIPHANY_HDF=${EHDF} ./hello-mpi.elf

Даже простой код, который осуществляет связь между узлами, не работает. Ряды приходят 0, если я использую sudo.
Связь между потоками работает, но не между узлами. Это важно, потому что я хотел правильно распределить рабочую нагрузку по картам.

вот простой код

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

int main(int argc, char *argv[]) {
int numprocs, rank, namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Get_processor_name(processor_name, &namelen);

printf("Hello World from MPI Process %d on machine %s\n", rank, processor_name);

MPI_Finalize();
}

Этот код должен по-разному распределять номер ранга по узлам, но он не работает с sudo

Любая помощь в этом

Вот результат выполнения вышеуказанного кода без sudo.

mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest

выход:

Hello world from processor work1, rank 1 out of 3 processors
Hello world from processor command, rank 0 out of 3 processors
Hello world from processor work2, rank 2 out of 3 processors

Это как и ожидалось.

Вот результат выполнения вышеуказанного кода с помощью sudo.

sudo mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest

выход:

Hello world from processor command, rank 0 out of 1 processors
Hello world from processor work1, rank 0 out of 1 processors
Hello world from processor work2, rank 0 out of 1 processors

Это не.

Редактировать:-

Я думаю @Христо Илиев получил правильный ответ, но я не смогу проверить это

1

Решение

Краткий ответ: вместо sudo mpirun -n 12 ... ./hello-mpi.elfКоманда должна быть:

mpirun -n 12 ... sudo -E ./hello-mpi.elf

Для того, чтобы это работало правильно, вы должны изменить sudo конфигурация (через visudo) на всех хостах и ​​включите работу без пароля для вашего пользователя:

username ALL = NOPASSWD:SETENV: /path/to/mpirun

Эта запись позволит вашему пользователю запускать sudo mpirun без предварительной аутентификации, что важно, поскольку перенаправляется только стандартный ввод ранга 0. Это также позволит вам выполнить sudo с -E опция, чтобы позволить ему передавать специальные переменные Open MPI (OMPI_...) к исполняемому файлу (без этих переменных в среде исполняемые файлы не могут соединяться друг с другом и вместо этого запускаются как синглтоны).

Длинный ответ: Бег mpirun с sudo приводит к выполнению первого с эффективным пользователем root, Путь mpirun создает задание MPI, сначала запуская запрошенное количество исполняемых файлов, а затем ожидая, когда они узнают друг друга во время MPI_Init вызов. В зависимости от содержимого файла списка хостов, mpirun либо порождает дочерний процесс (для записей хоста, которые соответствуют хосту mpirun выполняется) или запускает процесс удаленно, используя rsh, ssh или какой-то другой механизм (например, многие системы управления ресурсами кластера имеют свои собственные механизмы для этого). Когда rsh/ssh механизм используется, так как программа запускается от имени пользователя root, mpirun пытается войти на другой хост (ы) как root. Это обычно терпит неудачу по одной или обеим из двух причин:

  • пользователь root не может войти в указанные хосты без указания пароля, например, использование аутентификации с открытым ключом не было настроено;
  • пользователю root не разрешается входить удаленно, что является конфигурацией SSH по умолчанию во многих системах Unix на протяжении многих лет.

Вот почему вы видите ранг 0 (это местный fork()спавн) и другие ряды отсутствуют. Поскольку включение удаленного входа в систему root рассматривается многими как угроза безопасности, я бы предпочел пойти по пути, описанному в кратком ответе.

Другим вариантом было бы сделать hello-mpi.elf принадлежит root и установите бит Set UID через chmod u+s hello-mpi.elf, Тогда вам не понадобится sudo совсем. Это не будет работать, если файловая система смонтирована с nosuid опция или если какой-то другой механизм безопасности активен. Также suid-файлы, принадлежащие пользователю root, представляют угрозу безопасности, поскольку они всегда выполняются с правами root, независимо от того, какой пользователь их запускает.

Интересно, зачем вам нужны права суперпользователя для общения с Богоявленским собранием. SDK выполняет какие-то необычные привилегированные операции или просто обращается к файлу устройства в /dev что доступно для записи только пользователю root? Если это последнее, возможно, узел устройства может быть создан с другими разрешениями.

4

Другие решения

Некоторое время я боролся с этой же проблемой, и мне пришлось читать всю документацию, чтобы найти решение (я также работаю с кластером Parallela). Это довольно просто: во время установки OpenMPI вы должны добавить опцию -enable-orterun-prefix-по-умолчанию по умолчанию при настройке установки …

$./configure -prefix=/usr/local --enable-orterun-prefix-by-default
1

По вопросам рекламы [email protected]