具有 sudo 权限的 OpenMPI / mpirun 或 mpiexec

Han*_*ans 2 c++ sudo openmpi nodes epiphany

我正在开发一个与 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
Run Code Online (Sandbox Code Playgroud)

即使是进行节点通信的简单代码也不起作用。如果我使用 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 %s\n", rank, processor_name);

   MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)

此代码应该在节点之间以不同的方式输出排名号,但它不适用于 sudo

对此的任何帮助都会很棒

这是在不使用 sudo 的情况下运行上述代码的输出。

mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

这正如预期的那样。

这是使用 sudo 运行上述代码的输出。

sudo mpirun -n 3 --hostfile $MPI_HOSTS ./mpitest
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

这不是。

编辑:-

我认为 @Hristo Iliev得到了正确的答案,但我无法对此进行测试

Hri*_*iev 5

简短回答:sudo mpirun -n 12 ... ./hello-mpi.elf命令应该是:

mpirun -n 12 ... sudo -E ./hello-mpi.elf
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,您必须修改所有主机上的sudo配置(通过visudo)并为您的用户启用无密码操作:

username ALL = NOPASSWD:SETENV: /path/to/mpirun
Run Code Online (Sandbox Code Playgroud)

此条目将允许您的用户在不首先验证自己的情况下运行sudo mpirun,这一点很重要,因为只有等级 0 的标准输入会被重定向。它还允许您sudo使用该-E选项执行,以便允许它将特殊的 Open MPI 变量 ( OMPI_...) 传递给可执行文件(环境中没有这些变量,可执行文件无法相互连接,而是作为单例运行)。

长答案:运行mpirun结果sudo是前者被有效用户执行root。创建 MPI 作业的方法mpirun是首先启动请求数量的可执行文件,然后等待它们在调用期间相互了解MPI_Init。根据主机列表文件的内容,mpirun要么生成一个子进程(对于与执行主机相匹配的主机条目mpirun),要么使用远程启动进程rshssh或其他一些机制(例如,许多集群资源管理系统都有自己的机制)那)。当使用rsh/ssh机制时,由于程序以 root 身份运行,因此mpirun会尝试以 root 身份登录其他主机。这通常会因以下两个原因之一或同时失败:

  • root 用户在不提供密码的情况下无法登录指定的主机,例如尚未设置使用公钥身份验证;
  • root 用户不允许远程登录,这是多年来许多 Unix 系统中默认的 SSH 配置。

这就是为什么你会看到等级 0 出现(它是基于本地fork()的生成)而其他等级缺失。由于许多人认为启用远程 root 登录存在安全风险,因此我宁愿采用简短答案中描述的方式。

另一种选择是让hello-mpi.elfroot 拥有并通过设置 Set UID 位chmod u+s hello-mpi.elfsudo那么你就根本不需要了。nosuid如果使用该选项安装文件系统或者某些其他安全机制处于活动状态,则这将不起作用。此外,root 拥有的 suid 二进制文件也会带来安全风险,因为无论哪个用户运行它们,它们总是以 root 权限执行。

我想知道为什么你需要 root 权限才能与 Epiphany 委员会交谈。SDK 是否在执行一些奇特的特权操作,或者只是访问/dev只能由 root 写入的设备文件?如果是后者,也许可以使用不同的权限创建设备节点。