Ubuntu下MPI集群环境的搭建

我们要并行地跑MPI程序,需要将几台计算机连在一块,搭建成一个集群,使得相互之间的消息传递没有阻碍,下面以Ubuntu系统为例,谈MPI集群环境的搭建过程。

Ubuntu和MPICH的安装

Ubuntu的安装可以说是傻瓜式的,可以在windows下通过虚拟机安装,也可以直接安装到本机(可以使双系统),建议双系统。
mpich的安装在有网的情况下,可以使用sudo apt-get install mpich进行安装。为了后期不出现问题,以及有足够的例子可以测试,建议自己去官网下载个压缩包,解压安装,详见这篇文章

安装SSH,设置ssh免密登录

设置ssh免密登录的基本原理就是在我们系统的~/.ssh/文件夹下生成一个公钥文件id_rsa.pub ,以及利用公钥文件(自己的和别人的),做成一个私钥文件authorized_keys,散发给每个用户。所谓的公钥,相当于自家系统的一个身份标识,是公开的。所谓的私钥,相当于一个认证文件,本质上书写了允许哪些机器对你进行免密访问。简单一点理解,当别人访问你时,你得拿出你的私钥,看看别人的公钥是不是写在你的私钥中,如果是,那么它就可以免密登录。反之,当你访问别人时,你得拿出你的公钥,看看是不是获得了别人的认可。事实上,这个过程还比较曲折,如下图所示(以A登录B为例):
在这里插入图片描述

具体操作如下:

  • 给局域网中所有的节点ip配置别名:通过ifconfig查看本机ip,通过sudo vim /etc/hosts 修改hosts文件,所有机器的hosts文件均添加以下内容,其中的ip是各机器通过ifconfig查到的ip。
192.168.36.145 node1 
192.168.36.146 node2 
  • 通过ping node1的方式确认别的机器可以ping通。

  • 各节点安装ssh服务(远程登录服务):sudo apt-get install ssh

  • 各节点生成公钥和私钥:
    1、ssh-keygen -t rsa // 生成的钥匙文件在 ~/.ssh/下。
    2、cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys,认证,使计算机对自己可以免密登录。认证后,使用形如ssh 账户名@node1方式进行测试,这里的node1指的是自己的节点编号。

cat file1 >> file2,这个命令,是说,把 file1 的内容拿出来,放到 file2里面,如果file2存在,就加到其末尾;如果不存在,就创建。

  • 在一个节点上制作对局域网里所有节点都给予认证的私钥文件,并分发给每个节点。
    1、通过scp id_rsa.pub 账户名@node1:~/.ssh/id_rsa.pub.node2的方式,将每个节点上的公钥文件,传到一个节点上。这里的scp的用法,和cp用法是一样的,只不过目标路径前要加上账户名@node1,这里表示将node2的公钥传到node1上,并重命名为id_rsa.pub.node2,重命名是为了不覆盖原来的node1的公钥。
    2、在主节点(不妨是node1)上通过别人传过来的公钥,制作完整的私钥文件(认证)。这里以node2作为一个例子,将node2的公钥传到node1,加入到认证文件,再将认证文件传回node2。
cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//公钥加入到认证文件 
scp authorized_keys 节点2账户名@node2:~/.ssh/authorized_keys//将认证文件传回每个子节点

这步如果发现搞错了,比如别人传过来的公钥文件忘记重命名,把自己的覆盖了,而自己的还没来得及备份,可以删光了.ssh下的文件重新做这一步。不需要重新安装ssh,注意使用ssh-add命令。

设置SSH免密登录可以免去操作中密码的输入,避免在命令执行时,因密码问题造成的通讯障碍。上面是用rsa算法的公钥/私钥对,当然也可以用dsa(对应的文件是id_dsa,id_dsa.pub)。

设置NFS共享目录

在执行MPI程序的过程中,我们需要在每个节点上将.c文件进行编译链接成可执行.o文件,在这之后,才能在主节点上开启运行MPI并行程序。这个过程中,首先需要保证每个节点在相同目录中都生成可执行文件,我们可以在每个节点上单独编译,该操作方式比较繁琐,为解决该问题,我们可以采用建立共享目录的方案。所谓的共享目录,就是设置一个相同路径的目录,任意节点在该目录下添加文件、删除文件等,都会同步到其他节点上。具体操作如下:

  • 每台机子都登录相同名字的一个账户,不妨叫做user1。如果没有user1,可以新建一个user1,我的建议是直接将当前账户的名称修改成user1,这样可以省不少事。不少新手总是忘记了这一点,给后续的工作造成了不少麻烦。打三个感叹号,一定要修改成相同的用户名。具体可以参见看更改用户名部分,主机名先不改
  • 在所有的节点都建立相同的一个目录,譬如:mkdir /home/mpi_share。如果下面的过程中出现问题,有可能是用户对mpi_share文件夹权限不够,可以使用chmod命令加点权限。
  • 安装NFS以及相关的依赖:
sudo apt-get install nfs-kernel-server
sudo apt-get install portmap或者rpcbind
  • 选取一个节点作为服务器,不妨为node1,其他节点为NFS客户端。其他节点为NFS客户端。修改主节点exports文件,sudo gedit /etc/exports,打开文件后,在文件的最后附上所有同步的客户端的虚拟机的ip和权限,如下:
/home/mpi_share 192.168.36.145(rw,sync,no_root_squash,no_subtree_check) 
/home/mpi_share 192.168.36.146(rw,sync,no_root_squash,no_subtree_check) 

注意,这里的ip地址后是没有空格的。其中/home/mpi_share是共享目录,ip地址是所有的客户端(其它节点)的地址,包括本机的,后面括号中的是权限,具体含义可上网查阅(rw即读写权限)

  • 重启NFS使用如下命令:sudo /etc/init.d/nfs-kernel-server restart

  • 配置其它NFS客户端,使其能共享NFS服务器的共享目录:sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share,ip为主节点地址,冒号后跟的是主节点共享目录,最后的路径是该节点的共享目录。这里的mount就是用来挂载目录的命令。如果挂载不成功,可以检查一下网络。

每次节点启动时都需重新执行挂载命令,如果想开机自动挂载:把上述指令sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share 写到 /etc/rc.local 文件中。

  • 测试:在主节点(服务器端)共享目录下新建文件,看看子节点会不会产生该文件。

设置NFS共享目录是为了能在一台机器上作业,如果不执行这一步的话,需要将执行文件和需要的数据复制到每个节点的相同位置,或者想办法在每个节点上产生相同的文件。

MPI程序的执行
  • 在共享目录下新建文件mpi_config,键入如下内容(假设现在有两个节点),后面的4表示节点的核数。
node1:4 
node2:4 
  • 找个mpi程序,建议找到安装包里的例子的cpi程序,将其复制到共享目录下。在主节点上,使用mpicc编译后,执行mpiexec -n 8 -f ./mpi_config ./cpi来运行mpi程序,结果可以看到在哪个节点上跑了哪个进程。这里的配置文件如果写在了别的地方,那么对应的路径也要做相应的更改。

如果mpiexec使用本机跑mpi代码可以执行,而使用上其他节点不行,那么大概是其他节点出问题了,比如说mpi出问题了,比如说版本问题。可以上其他节点check一下,例如,可以使用mpirun -Version查看mpi版本,尽量保持差距不是太大。言而总之,就是联机跑程序出问题了,先用mpiexec在单击上跑,看看行不行,不行说明单台机器上mpi出问题啦,得修。

配置过程中出错,很有可能是前面的步骤做错了,多一个空格少一个空格,甚至逗号写成英文句点等等,都会引发不可知的错误。这时候,应该静下心,回到前面去,细细的检查一番。

出现问题了,不要一股脑忙着百度,认真看报错信息,看不懂也硬着头皮一行一行看,有时候出问题了,它往往提供了一些解决的方法;另外,听话照做,如果它让你输yes就输yes不要输个y或者就一路猛回车;学会重启机器来解决一些问题,比如说挂载不上,可以重启一下试试。
再有就是,如果发现程序在各自的机子上能跑,但是连起来就不能跑了,提示缺什么文件之类,可以使用mpichversion命令看看两个mpich的版本是否差距太大,以及自己使用解压包方式安装的mpich有没有被正确识别。如果发现自己的用解压缩方式安装的mpich版本和mpichversion查到的版本不同,有可能是你的机子上安装了其他版本的mpi,比如说,你是否使用了apt直接安装了mpich。如果是这种情况,应该把其他版本的mpich卸载干净,以避免不必要的麻烦。
清除apt版本mpi的相关东西,可以使用apt remove xxx命令,它可以给你自动补全你有哪些相关的东西可以卸载。比如说lib和mpi打头的文件,有没有和mpi相关的,统统卸掉。通过用which命令,查看是否有其他的mpiexec、mpirun、mpicc等干扰你想用的mpi当前版本的使用,干扰文件可以找个文件夹兜起来。另外,得看看你的环境变量是否正确配置,比如说把安装文件下的bin文件夹加到路径中。如何添加环境变量,可以参见我的另一篇文章

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐