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