基于IB网卡(Infiniband)OpenMPI集群搭建(下)

文章目录

  • 一、准备工作
  • 二、在每个节点安装OpenMPI
    • 2.1 下载OpenMPI
    • 2.2 解压并进行配置
    • 2.3 Build并安装
    • 2.4 添加环境变量
    • 2.5 测试是否安装成功
  • 三、实现各节点SSH免密登录
    • 3.1 网络环境配置
    • 3.2 SSH免密登录
  • 四、建立和挂载NFS共享目录
  • 五、集群环境执行MPI程序

上一篇文章中我们使用的Openmpi是在线安装的,但是很容易出现各个节点安装的Openmpi版本不一致,导致无法在集群中使用,所以小编基于上一篇文章做了另一个版本的配置过程,并对配置过程中的问题作出解答。

一、准备工作

实验设备:两台塔式服务器
操作系统:Ubuntu16.04 STL
IP配置
10.0.0.1 seismic-1
10.0.0.2 seismic-2
相关软件:IB网卡驱动(驱动安装方式详见这篇文章) OpenMPI-1.8.4.tar.gz

二、在每个节点安装OpenMPI

2.1 下载OpenMPI

在官网上下载安装包这里使用openmpi-1.8.4.tar.gz。

2.2 解压并进行配置

tar -zxvf openmpi-1.8.4.tar.gz
cd openmpi-1.8.4
./configure --prefix="/usr/local/openmpi"

注意:最后一行是将其安装到 /usr/local/openmpi目录下,可以指定为其他目录。

2.3 Build并安装

make -j #开启多核编译,j可以跟数字例如:make -j8。
sudo make install

2.4 添加环境变量

sudo vim ~/.bashrc

在文件中添加

#openmpi properties
export PATH=$PATH:/usr/local/openmpi/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib

保存后执行

source ~/.bashrc
sudo ldconfig

2.5 测试是否安装成功

mpirun

如下图所示表示成功
在这里插入图片描述

三、实现各节点SSH免密登录

3.1 网络环境配置

分别配置两台机器的hosts文件,在此之前先通过ifconfig命令查看两台机器的IP地址,我的IP地址为:
seismic-2:10.0.0.2
seismic-1:10.0.0.1
然后修改hosts文件:

sudo gedit /etc/hosts

将下面两行写入hosts文件中

10.0.0.1 seismic-1
10.0.0.2 seismic-2

此时,两个节点间应该可以互相ping通

3.2 SSH免密登录

第一步:在本地机器上使用ssh-keygen产生公钥私钥对

ssh-keygen

第二步:用ssh-copy-id将公钥复制到远程机器中

ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host

第三步:登录到远程机器不用输入密码

ssh remote-host

注意:
(1)每个节点都要操作这些步骤
(2)不仅要能免密登录其它节点,而且还要免密登录自己

四、建立和挂载NFS共享目录

1、在所有节点中建立相同路径下的相同目录:

sudo mkdir /home/mpi_share

2、在所有节点安装NFS

sudo apt-get install nfs-kernel-server

3、在所有节点配置NFS服务器

sudo gedit /etc/exports

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

/home/mpi_share 10.0.0.1 (rw,sync,no_root_squash,no_subtree_check)
/home/mpi_share 10.0.0.2 (rw,sync,no_root_squash,no_subtree_check)

其中/home/mpi_share是共享目录,ip地址是所有的客户端(其它节点)的地址,包括本机的,后面括号中的是权限,具体含义可上网查阅(rw即读写权限)。
4、在其中一个节点启动NFS服务器

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

5、在其余节点挂载NFS服务器

sudo mount -t nfs 10.0.0.2:/home/mpi_share /home/mpi_share
  • 如果想开机自动挂载:把上述指令sudo mount -t nfs 10.0.0.2:/home/mpi_share /home/mpi_share 写到 /etc/rc.local 文件中)。
  • 如果想要卸载共享文件夹:使用sudo umount -lf /home/mpi_share 卸载。
  • 注意是/home/mpi_share不是/home/mpi_share/ 没有最后的斜杠。

6、测试NFS
在NFS服务器端的共享目录建立一个文件sudo gedit test.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。

五、集群环境执行MPI程序

我们在共享文件夹里添加一个MPI代码(cpi.c)代码和配置文件hostfile如下:
1. 编写mpi代码(cpi.c)

sudo gedit /home/mpi_share/cpi.c

<>

#include "mpi.h"
#include 
#include 

double f(double);

double f(double a)
{
    return (4.0 / (1.0 + a * a));
}

int main(int argc, char *argv[])
{
    int n, myid, numprocs, i;
    double PI25DT = 3.141592653589793238462643;
    double mypi, pi, h, sum, x;
    double startwtime = 0.0, endwtime;
    int 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, &myid);
    MPI_Get_processor_name(processor_name, &namelen);

    fprintf(stdout, "Process %d of %d is on %s\n", myid, numprocs, processor_name);
    fflush(stdout);

    n = 1000000000;  /* default # of rectangles */
    if (myid == 0)
        startwtime = MPI_Wtime();

    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

    h = 1.0 / (double) n;
    sum = 0.0;
    /* A slightly better approach starts from large i and works back */
    for (i = myid + 1; i <= n; i += numprocs) {
        x = h * ((double) i - 0.5);
        sum += f(x);
    }
    mypi = h * sum;

    MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

    if (myid == 0) {
        endwtime = MPI_Wtime();
        printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
        printf("wall clock time = %f\n", endwtime - startwtime);
        fflush(stdout);
    }

    MPI_Finalize();
    return 0;
}

2. 编写hostfile配置文件

sudo gedit /home/mpi_share/hostfile 

<< hostfile >>

seismic-1 slots=4
seismic-2 slots=4

3. 编译并运行MPI程序

cd /home/mpi_share/        #进入共享目录
mpicc cpi.c -o cpi            #编译cpi.c代码为cpi
/usr/local/openmpi/bin/mpirun -n 8 -hostfile hostfile ./cpi          #执行cpi

运行结果如下,我们发现两个节点都各启动了四个进程
基于IB网卡(Infiniband)OpenMPI集群搭建(下)_第1张图片注意:有的读者说使用mpirun -n 8 -hostfile hostfile ./cpi会报如下错。

bash: orted: 未找到命令
--------------------------------------------------------------------------
ORTE was unable to reliably start one or more daemons.
This usually is caused by:

* not finding the required libraries and/or binaries on
  one or more nodes. Please check your PATH and LD_LIBRARY_PATH
  settings, or configure OMPI with --enable-orterun-prefix-by-default

* lack of authority to execute on one or more specified nodes.
  Please verify your allocation and authorities.

* the inability to write startup files into /tmp (--tmpdir/orte_tmpdir_base).
  Please check with your sys admin to determine the correct location to use.

*  compilation of the orted with dynamic libraries when static are required
  (e.g., on Cray). Please check your configure cmd line and consider using
  one of the contrib/platform definitions for your system type.

* an inability to create a connection back to mpirun due to a
  lack of common network interfaces and/or no route found between
  them. Please check network connectivity (including firewalls
  and network routing requirements).

解决方案:

  1. 每台节点上在终端上输入sudo ldconfig
  2. 检查~/.bashrc文件中PATH和 LD_LIBRARY_PATH路径是否正确。
   #openmpi properties
   export PATH=$PATH:/usr/local/openmpi/bin
   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib
  1. 使用mpirun的完整路径即
   /usr/local/openmpi/bin/mpirun -n 8 -hostfile hostfile ./cpi

你可能感兴趣的:(环境配置)