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

Это не.

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

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

2 ответа

Решение

Краткий ответ: вместо 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? Если это последнее, возможно, узел устройства может быть создан с другими разрешениями.

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

$./configure -prefix=/usr/local --enable-orterun-prefix-by-default
Другие вопросы по тегам