使用sudo权限打开mpi / mpirun或mpiexec

OpenMPI / mpirun or mpiexec with sudo permission

本文关键字:mpirun mpiexec mpi sudo 权限 使用      更新时间:2023-10-16

我正在研究一个与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_...)传递给可执行文件(如果环境中没有这些变量,可执行文件就不能相互连接,而是作为单例运行)。

长话短说:运行mpirunsudo会导致前者在有效用户root下执行。mpirun创建MPI作业的方式是,首先启动请求数量的可执行文件,然后等待它们在MPI_Init调用期间相互了解。根据主机列表文件的内容,mpirun要么生成一个子进程(对于与mpirun执行的主机匹配的主机条目),要么使用rshssh或其他机制(例如,许多集群资源管理系统有自己的机制)远程启动一个进程。当使用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