MPI集群环境搭建

目录

1. MPI简介

2. 工具、原料

3. 安装MPICH

3.1. 在VMware中安装Ubuntu20.04

3.2. 安装MPI

4. SSH免密登录

4.1. .网络环境配置

4.2. SSH免密登录

5. 建立和挂载NFS共享目录

6. 集群环境执行MPI程序


1. MPI简介

        MPI(Massage Passing Interface)是消息传递函数库的标准规范,由MPI论坛开发。它是一种新的库描述,不是一种语言。共有上百个函数调用接口,提供与C和Fortran语言的绑定,MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现,MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。MPI有以下的特点:

  • 消息传递式并行程序设计。
  • 用户必须通过显式地发送和接收消息来实现处理机间的数据交换。
  • 在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。
  • 这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。
  • 并行计算粒度大,特别适合于大规模可扩展并行算法。
  • 用户决定问题分解策略、进程间的数据交换策略,在挖掘潜在并行性方面更主动,并行计算粒度大,特别适合于大规模可扩展并行算法。

2. 工具、原料

  • 选择Linux版本:这里我选择的是Ubuntu20.04,其他Linux版本如CentOS、Fedora等操作类似,一些命令和配置文件路径会有一些差别。
  • 物理服务器集群和虚拟节点选择:因为没那么多真实物理机器,所以我是用VMware创建多个虚拟机来进行集群模拟。
  • VMware Workstation 17 Pro:在VMware中安装Ubuntu20.04,实验模拟安装两个节点即可。建议初始设置时登录Ubuntu的用户名取一样的,因为后面每个虚拟机节点之间免密登录时需要保证用户名一致,这样可以避免出现未知的问题。

3. 安装MPICH

        到MPICH官网下载中心,截至2023年8月13日,最新版本为mpich-4.1.2,如下:

3.1. 在VMware中安装Ubuntu20.04

        从Ubuntu官网下载中心下载Ubuntu 20.04,从VMware官网下载VMware 17或其它版本也行,之后安装虚拟机和Ubuntu 20.04系统。注意:因为是测试分布式,所以至少要安装两套Ubuntu 20.04系统的虚拟机,为了方便后文讲解,我将其中一台Ubuntu 20.04的主机名取名为Master,作为服务器;另一台Ubuntu 20.04的主机名取名为Slave,作为客户端,且在安装虚拟机机时,建议设置时登录Ubuntu 20.04系统时的用户名取一样的,因为后面每个虚拟机节点之间免密登录时需要保证用户名一致,这样可以避免出现未知的问题。,如下:

 

3.2. 安装MPI

        在Master端虚拟机的任意位置创建一个目录,以后用该目录作为共享目录,如我建的目录命令是 :

# 用于存放mpi解压出来的源码,等下在该目录编译,其中dan为登录ubutun的用户名
mkdir /home/dan/share  

# mpi安装目录
mkdir /home/dan/share/mpi_install

将mpich-4.1.2拷贝到/home/dan/share ,执行如下命令解压:

tar -zxvf ./mpich-4.1.2.tar.gz

解压后的文件夹中有个README文件,打开后有详细的安装步骤,这里我简要说明:

为避免错误,在安装MPICH之前,分别执行以下命令:

sudo apt-get update    #保证安装的源最新
sudo apt-get install gcc #安装gcc编译器,用于编译C语言
sudo apt-get install g++ #安装g++编译器,用于编译C++
sudo apt-get install gfortran #安装gfortran编译器,用于编译fortran语言
sudo apt-get install make #安装make,编译源码要用

说明:因为fortran现在用的很少,如果你不想安装gfortran,则上述关于gfortran的命令可以不执行,但后文的配置需要禁用fortran的编译,否则编译时,因为找不到fortran组件会报错。
进入源码包解压后的路径,执行如下命令:cat /etc/shells。
(1)如果显示为:/bin/sh 和 /bin/bash,则配置、编译和安装命令分别为:
配置:

./configure --prefix=/home/dan/share/mpi_install 2>&1 | tee c.txt

如果不想安装fortran,则可以改为如下:

./configure --disable-fortran --prefix=/home/dan/share/mpi_install 2>&1 | tee c.txt

其中 /home/dan/share/mpi_install为mpi安装目录。

编译:

make 2>&1 | tee m.txt

安装:

make install |& tee mi.txt

配置和编译时间较长。
(2)如果显示为:/bin/csh 和 /bin/tcsh,则配置、编译和安装命令分别为:
配置:

./configure --prefix=/home/dan/share/mpi_install|& tee c.txt

如果不想安装fortran,则可以改为如下:

./configure --disable-fortran --prefix=/home/dan/share/mpi_install|& tee c.txt

其中 /home/dan/share/mpi_install为mpi安装目录。

编译:

make |& tee m.txt

安装:

make install |& tee mi.txt

安装完成后,如果shell是/bin/sh 和 /bin/bash,则执行如下命令设置环境变量:

PATH=/home/dan/share/mpich_install/bin:$PATH ; export PATH

如果shell是/bin/csh 和 /bin/tcsh,则执行如下命令设置环境变量:

 setenv PATH /home/dan/share/mpich_install/bin:$PATH

用which mpicc和which mpiexec检查安装是否成功,如果有这两个可执行程序的路径显示,则表示安装成功,如下:

 按本节对Slave虚拟机进行同样的操作,注意:目录也要和master的目录完全一样。

4. SSH免密登录

4.1. .网络环境配置

       分别配置两台机器的hosts文件,在此之前先通过ip addr show或ifconfig命令查看两台机器的IP地址,我的IP地址为:
Master:172.16.205.130
Slave:172.16.205.129
然后修改hosts文件:
sudo gedit /etc/hosts
根据以上查得的IP地址,在两台机器的hosts文件中均输入以下内容并保存:
172.16.205.130 Master
172.16.205.129 Slave
此时,两个节点间应该可以互相ping通。
注意:虚拟机中每个机器的ip会自动分配发生变化,我们可以手动设置为固定ip。

4.2. SSH免密登录

(1)在Master、Slave机器都安装SSH服务(远程登录服务):

#安装ssh程序
apt-get install openssh-server

#k开启ssh服务
service sshd start

(2)各节点生成私钥和公钥
ssh-keygen -t rsa // 生成的钥匙文件在 ~/.ssh/下,其他linux版本如CentOS路径会有所不同
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys //认证(执行该步后可以保证本机免密登录,使用ssh Master进行测试)
(3)把各子节点的 id_rsa.pub 传到主节点
scp id_rsa.pub dan@master:~/.ssh/id_rsa.pub.slave(这里我们把Master看作主节点,将Slave节点的钥匙文件传到Master上)
(4)在主节点上操作
cat ~/.ssh/id_rsa.pub.slave>> ~/.ssh/authorized_keys//认证
scp authorized_keys dan@slave:~/.ssh/authorized_keys//将认证文件传回每个子节点
(5)验证无密码登录
在Master节点上执行:ssh Slave
关于SSH免密登录谈谈我的个人理解:因为MPI是分布式内存编程,在后面的开发中涉及节点间信息的传递,往往数据和程序是在一个节点上,所以需要保证执行命令时各节点之间信息的交换。设置SSH免密登录可以免去操作中密码的输入。各节点生成私钥和公钥后需要认证,此时可以保证本机免密登录。将各个子节点的公钥文件发送给主节点,然后分别加入到主节点的认证文件中,此时可以保证主节点对各个子节点的免密登录。最后将认证文件传回到每个子节点,从而保证各个子节点对其他节点之间的免密登录。

5. 建立和挂载NFS共享目录

       前面几步我们安装了MPICH和实现了SSH免密登录,如果要执行程序的话,需要保证每个节点的相同目录中都生成可执行文件,该操作方式比较繁琐,为解决该问题,我们可以采用建立共享目录的方案。
(1)在Master机器安装NFS,不同的Linux安装和启动NFS的命令可能不同,在ubuntu20.04中,命令为:

sudo apt-get install nfs-kernel-server

(2)设置NFS服务器,选取Master作为服务器,即编写程序的虚拟机,当在此台虚拟机的共享目录编写程序并编译后会将共享目录中的所有文件同步到其它虚拟机中(NFS客户端):

sudo vi /etc/exports

sudo gedit /etc/exports

打开文件后,在文件的最后附件上所有同步的客户端的虚拟机的ip和权限,如下:

/home/dan/share 172.16.205.130 (rw,sync,no_root_squash,no_subtree_check)
/home/dan/share 172.16.205.129 (rw,sync,no_root_squash,no_subtree_check)

其中/home/dan/share共享目录,ip地址是所有的客户端(其它节点)的地址,包括主端的,后面括号中的是权限。rw 代表读写权限,sync代表动态同步,no_root_squash代表客户机对此有root的操作权限。
(3)重启NFS,执行:

sudo /etc/init.d/nfs-kernel-server restart

,此时,NFS服务器虚拟机配置完毕。
(4)接下来需要配置其它NFS客户端虚拟机,使其能共享NFS服务器的共享目录:在其他节点中运行:

sudo apt install nfs-common   nfs-utils

以使Slave机器安装相关nfs客户端工具 ,执行如下命令,以使Slave能挂在Master共享目录到自己的 /home/dan/share目录:

sudo mount -t nfs 172.16.205.130:/home/dan/share /home/dan/share

,其中ip为NFS服务器的地址,:后面跟的是服务器的共享目录,在后面跟的是本机(客户端)的共享同步目录。此时,所有的共享目录便配置完毕了,每次节点启动时都需重新执行挂载命令,如果想开机自动挂载:把上述指令sudo mount -t nfs 172.16.205.130:/home/dan/share /home/dan/share   /home/mpi_share 写到 /etc/rc.local 文件中。
(5)测试:在NFS服务器端的共享目录建立一个文件gedit test.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。
建立和挂载NFS共享目录的目的是保证主节点生成的可执行文件和需要的数据其他节点可以访问,这样就可以保证多个节点之间的并行(如果不执行这一步的话,需要将执行文件和需要的数据复制到每个节点的相同位置)。

6. 集群环境执行MPI程序

(1)新建配置文件:
在服务器Master端的home目录(也可以是其他目录)下新建一个文件:mpi_config_file。mpi_config_file是在运行MPI程序时参考的配置文件,它显式注明每台机器各有几个CPU核。
编辑mpi_config_file(这个文件在后面执行程序时会作为参数包括在命令中):

sudo gedit mpi_config_file

因为我主机是8核且每台虚拟机分配了2核,所以在mpi_config_file中输入以下内容并保存:

Master:2
Slave:2

(2)编写MPI程序hello.c,如下:       

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv){
    //初始化MPI环境
    MPI_Init(NULL, NULL);

    //获取进程数
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    //获取进程的等级
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    //获取进程的名字
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    //打印helloworld
    printf("Hello world from processor %s, rank %d out of %d processors\n",processor_name, world_rank, world_size);
    
    getchar();
    //关闭MPI环境
    MPI_Finalize();
}

执行如下命令,编译:

mpicc -o hello hello.c

执行如下指令为hello赋予可执行权限:

chmod +x hello

 (3)运行可执行程序:
      将可执行文件hello复制到共享目录/home/dan/share/中,保证每个节点都可以访问该可执行文件(如果不安装NFS服务的话,需要将可执行文件放到每台机器的相同目录下)。
切换到共享目录:

cd  /home/dan/share/

执行指令:

mpiexec -n 4 -f /home/dan/share/mpi_config_file ./hello

mpiexec 表示执行该mpi程序,-n 4表示开4个进程,参数-f /home/mpi_config_file 表示运行过程参考配置文件mpi_config_file。执行成功后结果如下:

可以看到:左侧主服务器启动了hello进程并打印出信息,右侧客户端也启动了hello进程,证明MPI分布式运行成功。注意如果出现如下错误: 

 HYDU_create_process (lib/utils/launch.c:73): execvp error on file ./hello (No such file or directory)

一般是客户端没有挂接上主服务器的共享目录,从而在客户端机器找不到hello程序,请检测下述是否正确:

  • 前文说的主服务器NFS服务是否其启动。
  • 客户端机器的
    sudo mount -t nfs 172.16.205.130:/home/dan/share /home/dan/share

    执行是否正确执行。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值