小型化:卡片阵列

此部分原文

南安普敦大学的计算机工程师们用 64 个树莓派(Raspberry Pi)构建了一个小超算,1TB 的内存(每块树莓派主板上装备了一张 16GB SD 卡),总造价在 2500 英镑以下,命名为 Iridis-Pi,取自该校的另外一台超级计算机 Iridis(全欧洲最快的运行 Win Server 的超算)

树莓派阵列

说明:其总的运算速度和前一部分差不多,但内存上提升了不少。

树莓派组超算的步骤

作者:Simon Cox 教授

Computational Engineering and Design Research Group

Faculty of Engineering and the Environment

University of Southampton, SO17 1BJ, UK.

版本:V0.2: 2012-09-08

第一步 硬件构建过程

固定用的承载托盘

固定用托盘

承载托盘2

承载托盘

所有树莓派板卡: 树莓派板卡

近照

树莓派近照

电源:

密布电源

最后插入电源效果:

完工图

第二步 让机器运行起来

  1. 下载 底层驱动镜像。此处用的是: 2012-08-16-wheezy-raspbian.zip

  2. 烧录底层驱动到闪存盘:可用win32磁盘烧录工具“Write”把镜像写入到闪盘上或者你牛叉、苹果系统内置的dd程序。

安装第一台机器

  1. 启动第一块树莓派

  2. 配置并安装:Expand image to fill card using the option on screen when you first boot. If you don’t do this on first boot, then you need to use,参见

     $ sudo raspi-config
    
  3. 登录,修改密码

     $ passwd
    
  4. 注销

     $ exit
    
  5. 然后再登录,看看是否正确

  6. 更新可用的程序包

     $ sudo apt-get update
    
  7. 为了稳定性,注意不要和普通电脑一样,进行全局升级(sudo apt-get upgrade),此处只是为了获取可安装程序的列表。

  8. 安装Fortran等,因为科学运算大都需要这个,所以预先安装了。

     $ sudo apt-get install gfortran
    
  9. 为了可以在多节点运行程序,需要构建MPI,参看手册。要注意两件事:

    1. 把 Fortran加进来,可以方便后面做很多事。
    2. 手册中提到的软件包是为 armel 打的,而此处我们需要的是 armhf ,因此需要自己构建MPI。
  10. 在继续之前,可阅读此链接内容,了解更多信息,下面将安装此连接中的第2.2步开始。

  11. 新建一目录,用于存放源码

    $ mkdir /home/pi/mpich2
    $ cd ~/mpich2
    
  12. 获取MPI源码

    $ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.4.1p1/mpich2-1.4.1p1.tar.gz
    
  13. 解压

    $ tar xfz mpich2-1.4.1p1.tar.gz
    
  14. 新建一路径,存放编译好的文件。此处用 “rpimpi” 替换了原文中的 “you” ,并且用两步来新建路径

    $ sudo mkdir /home/rpimpi/        
    $ sudo mkdir /home/rpimpi/mpich2-install
    
  15. 新建一路径,用于编译(开编译专用路径的好处是保持源码目录的干净)

    mkdir /home/pi/mpich_build
    
  16. 切换到编译用的目录

    $ cd /home/pi/mpich_build
    
  17. 配置编译选项:

    $ sudo /home/pi/mpich2/mpich2-1.4.1p1/configure -prefix=/home/rpimpi/mpich2-install
    
  18. 开始编译文件:坐下来喝功夫茶吧,因为这步会花很长时间……

    $ sudo make

  19. 安装编译好的程序:这步时间也会有点长,不过相比编译,还是快多了,哈哈……

    $ sudo make install
    
  20. 把安装路径加入 可启动目录PATH

    $ export PATH=$PATH:/home/rpimpi/mpich2-install/bin
    

可以写入 ~/.profile 中,这样永久有效。

    $ nano ~/.profile

然后写入下面两行:

    # Add MPI to path
    PATH="$PATH:/home/rpimpi/mpich2-install/bin"
  1. 检查下看看是否安装正确

    $ which mpicc
    $ which mpiexec
    
  2. 回到家目录,新建一测试目录,并切换到该目录:

    $ cd ~
    $ mkdir mpi_testing
    $ cd mpi_testing
    
  3. 测试下在单一节点上,MPI的运行状况:

    mpiexec -f machinefile -n <number> hostname
    

输出会包含一个IP地址的列表,因为只有一台机器,此处只输出一行。

1. 获知你的ip地址

        $ ifconfig

2. 把结果放入 文件 *machinefile* 中
  1. 修改 machinefile

    $ nano machinefile
    

加入此行:

    192.168.1.161

[或者其他你设定的ip地址]

  1. 运行一下:

    $ mpiexec -f machinefile –n 1 hostname
    

输出下面的信息:

    raspberrypi
  1. 测试点C程序。在编译的MPI文件夹下,就有一个CPI例子。使用MPI来计算圆周率:

    $ cd /home/pi/mpi_testing
    $ mpiexec -f machinefile -n 2 ~/mpich_build/examples/cpi
    

下面是输出的信息:

    Process 0 of 2 is on raspberrypi
    Process 1 of 2 is on raspberrypi
    pi is approximately 3.1415926544231318, Error is 0.0000000008333387

完成此步,说明第一节已经成功了!

二、给子节点刷机

  1. 主节点搞定后,因为里面安装有所有需要的程序,可以把这闪存卡当父卡,接下来就是克隆此卡。

  2. 关闭Pi:

     $ sudo poweroff
    

拔出闪存卡,插回电脑(或者其他用来写卡的机器)上的写卡器,然后,把这闪存卡上的镜像克隆回电脑上,参见此文。用的工具和第2步一样。此处用的是 Read 选项。

这镜像存为 2012-08-16-wheezy-raspbian_backup_mpi_master.img ,姑且叫 父镜像

  1. 拔出这张父卡,插回第一台树莓派。然后,电脑上插入想写入的新卡,安装第2步,把父镜像刷入这新卡中。注意:因为父镜像里面的软件都是安装好的,所以此处可以不用重复第4步。

  2. 测试下这新刷的卡:把这新刷的卡插入第二台树莓派中,启动之,看看效果。已经搞定了两台树莓派,接下来进入下面的测试。

使用 SSH 登录替换密码方式

这么做的目的是简化登录,否则那么多树莓派要登录,搞死人。

说明: 下面所有的命令行,如果没有特别说明,就都是在主节点输入的。

  1. 参看文档。生成RSA密钥:

     $ cd ~
     $ ssh-keygen -t rsa –C “raspberrypi@raspberrypi”
    

密钥存储在 /home/pi/.ssh/id_rsa 。创建过程会要求输入一些信息,比如 “myfirstpicluster”(不输入也可以,不过不建议这样)。然后放入第二台树莓派中。

    $ cat ~/.ssh/id_rsa.pub | ssh pi@192.168.1.162 "cat >> .ssh/authorized_keys"
  1. 登录第二台树莓派,看看刚刚操作结果:

    $ ls –al ~/.ssh

应该可以看到一个文件叫: “authorized_keys”

  1. 在第二台树莓派中,获取下IP地址,然后回到主节点,把获取到的IP加入到主节点的 machinefile。

     $ nano machinefile
    

添加一行:(或者你获取到的其他地址)

    192.168.1.161
    192.168.1.162
  1. 测试下两台树莓派运行C代码。

     $ cd /home/pi/mpi_testing
     $ mpiexec -f machinefile -n 2 ~/mpich_build/examples/cpi
    

下面是输出的信息:

    Process 0 of 2 is on raspberrypi
    Process 1 of 2 is on raspberrypi
    pi is approximately 3.1415926544231318, Error is 0.0000000008333387

注意:此处还没改主机名,因此会看到此处的主机名是一样的。

  1. 到第二台树莓派上,改下主机名 (看附录1 “Hostname Script”) ,测试下效果:

     $ mpiexec -f machinefile -n 2 ~/mpich_build/examples/cpi
    

下面是输出的信息:

    Process 0 of 2 is on raspberrypi
    Process 1 of 2 is on iridispi002

恭喜,到已经完成了构建2节点超算

构建64节点(甚至更多)的超算

  1. 关闭所有树莓派

     $ sudo poweroff
    
  2. 拔出第二台树莓派的闪存卡,插到电脑上,把其镜像提取出来,存为 2012-08-16-wheezy-raspbian_backup_mpi_worker.img,然后把这镜像作为其他子节点的母卡:这张母卡上比父卡多了一个 密钥。然后,按照上面的第2步,插入新的闪存卡,刷入镜像。

之后不断重复这步,直到所有的树莓派都刷完。

  1. 刷完机后,需要登录到主节点,修改 machinefile 添加IP地址

  2. 重命名下各个树莓派的主机名,比如可在主节点输入:

     ssh pi@192.168.1.162 'sudo echo "iridispi002" | sudo tee /etc/hostname'
     ssh pi@192.168.1.163 'sudo echo "iridispi003" | sudo tee /etc/hostname'
     ssh pi@192.168.1.164 'sudo echo "iridispi004" | sudo tee /etc/hostname'
     ……
    

依次类推。当然,64个节点,逐个写会累死人的,还是写个脚本自动命名吧。

改进下工作

自动命名

使用脚本来自动命名,此处用的是python的mpi4py

  1. 安装软件

     $ sudo apt-get install python-mpi4py
    
  2. 放入软件

     $ cd ~
     $ mkdir mpi4py
     $ cd mpi4py
     $ wget http://mpi4py.googlecode.com/files/mpi4py-1.3.tar.gz
     $ tar xfz mpi4py-1.3.tar.gz
     $ cd mpi4py-1.3/demo
    
  3. 不断在每个节点上重复第一二步(之前因为没考虑到这步,所以没有把这个也烧录进母镜像中,所以需要逐个写入,下次制作母镜像的时候,最好这个也加进去)

  4. 在主节点运行一个示例:使用2节点

     $ mpirun.openmpi -np 2 -machinefile /home/pi/mpi_testing/machinefile python helloworld.py
    

下面是输出的信息:

    Hello, World! I am process 0 of 2 on raspberrypi.
    Hello, World! I am process 1 of 2 on iridispi002.
  1. 使用4节点看看

     $ mpiexec.openmpi -n 4 -machinefile /home/pi/mpi_testing/machinefile python helloworld.py
    

下面是输出的信息:

    Hello, World! I am process 2 of 4 on raspberrypi.
    Hello, World! I am process 3 of 4 on iridispi002.
    Hello, World! I am process 1 of 4 on iridispi002.
    Hello, World! I am process 0 of 4 on raspberrypi.
  1. These are handy to remove things if your attempts to get mpi4py don’t quite pan out

     $ sudo apt-get install python-mpi4py
     $ sudo apt-get autoremove
    

密钥也需要自动化脚本

cat ~/.ssh/id_rsa.pub | ssh pi@192.168.1.161 "cat >> .ssh/authorized_keys"
cat ~/.ssh/id_rsa.pub | ssh pi@192.168.1.162 "cat >> .ssh/authorized_keys"
cat ~/.ssh/id_rsa.pub | ssh pi@192.168.1.163 "cat >> .ssh/authorized_keys"
...

如果修改了密钥,这么多操作可就惨了,因此,也需要自动化脚本来帮忙。

改进下python安装方式:Pip

  1. PIP是python包管理工具,新建安装目录:

     $ cd ~
     $ mkdir pip_testing
     $ cd pip_testing
    
  2. 下载并安装之

     $ curl http://python-distribute.org/distribute_setup.py | sudo python
     $ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
    

编译适用于 树莓派 的 MPI 共享库

MPI可以共享库方式被动态加载:共享库扩展名为 “.so” 而非 “.a”。 步骤和上面一样,只是参数改为: “_shared” ,如下:

$ mkdir /home/pi/mpich2_shared
$ cd ~/mpich2_shared
$ wget http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.4.1p1/mpich2-1.4.1p1.tar.gz
$ tar xfz mpich2-1.4.1p1.tar.gz
$ sudo mkdir /home/rpimpi_shared/
$ sudo mkdir /home/rpimpi_shared/mpich2-install_shared
$ mkdir /home/pi/mpich_build_shared
$ cd /home/pi/mpich_build_shared
$ sudo /home/pi/mpich2_shared/mpich2-1.4.1p1/configure -prefix=/home/rpimpi_shared/mpich2-install_shared --enable-shared
$ sudo make
$ sudo make install
$ export PATH=$PATH:/home/rpimpi_shared/mpich2-install_shared/bin

若想永久性添加此路径,需要编辑 .profile文件

$ nano ~/.profile

在最后添加下面两行:

# Add MPI Shared to path
PATH="$PATH:/home/rpimpi_shared/mpich2-install_shared/bin"