如何搭建自己的 MPI 集群

如果你有几台装了 Linux 的 PS3 / PS4 / Xbox One,你也可以按下面的方法自己搭一个 MPI 集群并等着拯救世界。

一、配置 NFS

无论是 Server 还是 Clients,先安装 NFS 套件:

1
sudo yum install nfs-utils

以太网下的设定

设置防火墙:

1
2
3
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd --reload

在 Server 上执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
cd /
sudo su # 切换到 root 用户,方便操作
# 下面这一行设置共享的文件夹为 /export,共享范围是 192.168.15.0/24 这个网段
echo "/export 192.168.15.0/24(rw,sync,no_root_squash,no_all_squash)" > /etc/exports
mkdir export
chown enigma:enigma /export # 将 enigma 换成你的用户名
chmod 755 /export
systemctl start rpcbind
systemctl start nfs
# 设置两个服务为自动启动
systemctl enable rpcbind.service
systemctl enable nfs.service

在 Client 上执行以下命令:

1
2
3
4
5
6
7
8
9
10
sudo su # 切换到 root 用户,方便操作
systemctl start rpcbind
systemctl enable rpcbind.service
systemctl start nfs
systemctl enable nfs.service
mkdir /export
# 下面这一行将 192.168.15.128 上的 NFS 挂载到本机的 /export 位置
mount -t nfs 192.168.15.128:/export/ /export
# 下面这一行指示系统每次启动就挂载 NFS
echo "192.168.15.128:/export/ /export/ nfs rw,sync,hard,intr 0 0" >> /etc/fstab

IB 网下的设定

(没机会玩 IB ……)

二、配置各节点的无密码访问

  1. 生成密钥对
    执行下列命令以生成密钥对:
    1
    ssh-keygen -t rsa

执行过程会提示你:选择密钥对存储的位置,如果不指定将存储在 ~/.ssh/ 下面;密码,如果非空,则在第一次登陆远程主机的时候需要输入。这里我们把两个选项都留空

  1. 复制公钥到其他主机以进行无密码访问
    准备好一个远程主机列表文件 hostlist ,每一行指定一个计划让这一台主机进行无密码访问的主机IP。一般这个列表可以包含所有的主机名(包含这一台),然后拷贝到集群的每一台主机上,在每一台主机上运行下列脚本:
    1
    2
    3
    for host in $(cat hostlist); do
    `ssh-copy-id -i [email protected]$host`
    done

脚本的作用是执行过程中会提示你是否接受远程主机的指纹,以及输入远程主机同名账户的密码。

三、编译安装和使用 MPI 环境

以 OpenMPI 为例。其他 MPI 环境需要对应修改一些路径和设置。
假设集群的 NFS 文件系统在 /export,各机器之间已配置无密码 ssh 访问。

  • 确保已安装 gcc, g++ 和 gfortran,或者其他的 C & C++ & Fortran 编译器

    1
    sudo yum install gcc gcc-c++ gcc-gfortram
  • 从 OpenMPI 官网下载页面 下载 OpenMPI 最新的包(本文用2.0.1):

    1
    wget https://www.open-mpi.org/software/ompi/v2.0/downloads/openmpi-2.0.1.tar.gz
  • 解压并配置安装参数,安装到 /export/soft/openmpi-2.0.1 目录下:

    1
    2
    3
    4
    5
    tar zxf openmpi-2.0.1.tar.gz
    cd openmpi-2.0.1
    ./configure --prefix=/export/soft/openmpi-2.0.1 | tee config.log
    # 如果系统中有其他编译器套件如 ICC 并且已经加载可用,可以指定使用哪个编译套件来编译 OpenMPI,如
    # ./configure --prefix=/export/soft/openmpi-2.0.1 CC=icc CXX=icpc FC=ifort | tee config.log
  • 编译并安装

    1
    sudo make all check install | tee make.log
  • 配置可执行路径
    如果集群中只有一个 MPI 环境,那么直接在 ~/.bashrc 中设置加入以下两句:

    1
    2
    export PATH=/export/soft/openmpi-2.0.1/bin:$PATH
    export LD_LIBRARY_PATH=/export/soft/openmpi-2.0.1/lib:$LD_LIBRARY_PATH

即可使得用户登录后自动将 OpenMPI 的可执行路径加入环境变量中并直接调用。
如果集群中有其他的 MPI 环境,建议用 Environment Modules 为 OpenMPI 创建一个 module file 来进行加载/取消加载。在 ~/.bashrc必须指定加载一种 MPI 环境使得 MPI 环境可以跨节点启动 MPI 环境框架,否则只有一台机器启动了 MPI 环境框架,跨节点运行的时候会报错。