使用sudo权限打开mpi / mpirun或mpiexec
OpenMPI / mpirun or mpiexec with sudo permission
我正在研究一个与Epiphany处理器(http://www.parallella.org/)一起工作的代码,并且要运行Epiphany代码,我需要在主机端程序上的sudo特权。没有人能逃避sudo!
现在我需要在几个节点上运行这段代码,为了做到这一点,我使用mpi,但mpi不能正常工作与sudo
#sudo mpirun -n 12 --hostfile hosts -x LD_LIBRARY_PATH=${ELIBS} -x EPIPHANY_HDF=${EHDF} ./hello-mpi.elf
即使是一个简单的代码进行节点通信也不起作用。如果我使用sudo,排名是0。线程之间的通信可以工作,但不能跨节点通信。这很重要,因为我想把工作负载适当地分配到各个卡上。
下面是简单的代码
#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 %sn", 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
这不是。
编辑:
我想@Hristo Iliev得到了正确的答案但是我不能测试这个
简短的回答:命令应该是:
而不是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的标准输入才会被重定向。它还允许你用-E
选项来执行sudo
,以便允许它将特殊的Open MPI变量(OMPI_...
)传递给可执行文件(如果环境中没有这些变量,可执行文件就不能相互连接,而是作为单例运行)。
长话短说:运行mpirun
和sudo
会导致前者在有效用户root
下执行。mpirun
创建MPI作业的方式是,首先启动请求数量的可执行文件,然后等待它们在MPI_Init
调用期间相互了解。根据主机列表文件的内容,mpirun
要么生成一个子进程(对于与mpirun
执行的主机匹配的主机条目),要么使用rsh
、ssh
或其他机制(例如,许多集群资源管理系统有自己的机制)远程启动一个进程。当使用rsh
/ssh
机制时,由于程序以root身份运行,mpirun
尝试以root身份登录到其他主机。这通常会因为以下一个或两个原因而失败:
- 根用户不能在没有提供密码的情况下登录到指定的主机,例如使用尚未设置的公钥认证;
- 根用户不允许远程登录,这是许多Unix系统多年来的默认SSH配置。
这就是为什么你看到排名0出现(这是一个基于fork()
的本地刷出)而其他排名缺失的原因。由于许多人认为启用远程根登录存在安全风险,因此我宁愿采用简短回答中描述的方式。
另一种选择是使hello-mpi.elf
为root所有,并通过chmod u+s hello-mpi.elf
设置set UID位。那么你根本不需要sudo
。如果文件系统是用nosuid
选项挂载的,或者其他一些安全机制是活动的,那么这将不起作用。此外,root拥有的suid二进制文件也存在安全风险,因为它们总是以root权限执行,无论哪个用户运行它们。
我想知道,为什么你需要root权限才能与顿悟委员会交谈。SDK是否做了一些奇特的特权操作,或者它只是访问/dev
中仅由根可写的设备文件?如果是后者,也许可以用不同的权限创建设备节点。
我为同样的问题挣扎了一段时间,不得不阅读整个文档来找到解决方案(我也在使用并行集群)。这很简单:在安装OpenMPI期间,您必须在配置安装时添加-enable-orterun-prefix-by-default选项…
$./configure -prefix=/usr/local --enable-orterun-prefix-by-default