高性能计算

在Ubuntu 8.10上安装MPICH2并行计算环境(zz)

2010年4月2日 阅读(304)

在Ubuntu 8.10上安装MPICH2并行计算环境

-Zengming Zhang, ZCNI, ZJU
-2010-1-31
(nicegiving@gmail.com)

目录:
———————
1. 什么是MPICH2
2. 安装前的系统准备
3. 安装步骤
4. 设置环境变量
5. 添加mpd配置文件
6. 开始单机测试
7. 安装后配置(多机测试)
    (1) 修改/etc/hosts
    (2) 创建mpd.hosts
    (3) 配置SSH
    (4) 配置samba共享
    (5) 配置测试机器的环境变量
    (6) 开始测试
8. 并行程序运行测试
9. 成功运行的关键点
10. Troubleshooting
———————

1. 什么是MPICH2

    Note: 这段摘自MPICH2官方网站:http://www.mcs.anl.gov/research/projects/MPICH2

    MPICH2 is a high-performance and widely portable implementation of the Message Passing Interface(MPI) standard( both MPI-1 and MPI-2).

    The goals of MPICH2 are:
    (1) to provide an MPI implementation that efficiently supports defferent computation and communication platforms including commodity clusters(desktop system, shared-memory systems, multicore architectures), high-speed networks(10 Gigabit Ethernet, InfiniBand, Myrinet, Quadrics) and proprietary high-end computing systems(Blue Gene, Cray).
    (2) to enable cutting-edge research in MPI through an easy-to-extend modular framework for other derived implementations.   

    MPICH2 的源代码下载地址:http://www.mcs.anl.gov/research/projects/mpich2/downloads/tarballs/1.2.1/mpich2-1.2.1.tar.gz

2. 安装前的系统准备

    确保你的系统中已经安装了gcc和g++编译器, 以及g77或者gfortran编译器。你的系统中还需要安装Python 2.2 以上版本。

zzm@zzm-desktop:~$ gcc –version
gcc (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

zzm@zzm-desktop:~$ g++ –version
g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

zzm@zzm-desktop:~$ python -V
Python 2.5.2
zzm@zzm-desktop:~$ gfortran –version
GNU Fortran (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.

GNU Fortran comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Fortran
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING

    另一个需要确认的就是,您当前的用户不是root用户。MPICH2的官方文档上面不推荐使用root用户进行安装。   

3. 安装步骤

标准的 configure, make, make install 步骤,非常简单!

zzm@zzm-desktop:/home/zzm/Downloads/mpich2$ tar xzf mpich2-1.2.1.tar.gz
zzm@zzm-desktop:/home/zzm/Downloads/mpich2$ cd mpich2-1.2.1/
zzm@zzm-desktop:/home/zzm/Downloads/mpich2/mpich2-1.2.1$ ./configure –prefix=/home/zzm/bin/mpich2
(… 我保证你绝对不想看的非常多的输出)
zzm@zzm-desktop:/home/zzm/Downloads/mpich2/mpich2-1.2.1$ make
(… 我保证你绝对不想看的非常多的输出)
zzm@zzm-desktop:/home/zzm/Downloads/mpich2/mpich2-1.2.1$ make install
(… 我保证你绝对不想看的非常多的输出)

最后,复制examples文件夹到安装目录(mpich2安装的时候不会复制此目录,此目录中的内容供测试用)
zzm@zzm-desktop:/home/zzm/Downloads/mpich2/mpich2-1.2.1$ cp -r examples/ /home/zzm/bin/mpich2/

安装结束!

4. 设置环境变量

    添加下面这行到/etc/profile文件的最后,然后重新起动系统使环境变量永久生效。
    export PATH=/home/zzm/bin/mpich2/bin:$PATH

    可以测试下看看环境变量是否已经设置好:
zzm@zzm-desktop:~$ which mpd
/home/zzm/bin/mpich2/bin/mpd
zzm@zzm-desktop:~$ which mpiexec
/home/zzm/bin/mpich2/bin/mpiexec
zzm@zzm-desktop:~$ which mpirun
/home/zzm/bin/mpich2/bin/mpirun

5. 添加mpd配置文件

    在当前用户的home目录下面新建立一个名为".mpd.conf"的配置文件,文件的内容如下应该包括下面这行:
    secretword=<secretword>
    比如:
zzm@zzm-desktop:~$ more .mpd.conf
secretword=nicegiving

    <secretword>是你的密钥,是每台机器进行连接并用建立并行环境互相信任的基础。
    接下来,需要设置该文件的存取权限,这步是必须的,否则在后面的运行中会报错。
zzm@zzm-desktop:~$ chmod 600 .mpd.conf
zzm@zzm-desktop:~$ ls -ll .mpd.conf
-rw——- 1 zzm 1003 22 2010-01-07 13:54 .mpd.conf

    Note: 现在只需要在本机上面添加这个文件,但是到了多机并行测试的时候,需要在每台参加计算的机器上面都添加此文件,不要忘记了!   
   
6. 开始单机测试

    如果你能得到下面的结果而且没有出现任何错误的话,说明你的MPICH2已经安装成功。
zzm@zzm-desktop:~$ mpd &
[1] 22679
zzm@zzm-desktop:~$ mpdtrace
zzm-desktop
zzm@zzm-desktop:~$ mpdallexit
[1]+  Done                    mpd
zzm@zzm-desktop:~$

7. 安装后配置(多机测试)

    由于需要将多台机器进行联网,组成强大的并行计算环境,我们必须对已经安装好的MPICH2进行多台机器的联机测试,看看到底可用否。
    MPICH2在多台机器上面组成并行计算环境的通信协议是SSH,因此我们首先必须保证,在参与计算的机器中,在每台机器上面都可以不用输入密码地SSH 到其他的机器上面(包括本机),这个我们通过配置SSH的公钥和私钥来解决。
    另一个重要的基础是每台机器上面的配置环境必须一模一样,有着同样的用户名,同样的用户目录,同样的环境变量,同样的MPICH2的bin目录及位置,同 样的需要并行计算的程序,这个我们采用samba文件共享来解决,让所有的客户机都共享同样的主机目录,这样只需要在主机上面做配置就可以了,其他的机器 上面直接享有主机的配置,省去了一台一台配置的麻烦,特别是当参与计算的机器很多的时候。其实采用samba文件共享仍然不是十分完美的解决方案,真正好 的方案是采用GFS(Global File System)等网络文件系统建立一个文件服务器,文件服务器当作主机,所有的客户机的用户的home目录都挂载主机的home目录。这不属于本文范畴, 我们就此打住。
    下面,让我们一步一步来做。
    需要说明的是,步骤(1)、(2)和(5)需要在每台客户机上面都执行。步骤(3)中的.ssh文件夹需要拷贝到每台客户机上面。

(1) 修改/etc/hosts
    在hosts文件中添加所有参与计算的机器的IP和主机名的配置,这样,我们就可以通过主机名来访问每台机器,省去了输入IP地址的麻烦。比如,我的 hosts文件配置如下:
zzm@zzm-desktop:~$ more /etc/hosts
127.0.0.1    localhost
#127.0.1.1    zzm-desktop

192.168.1.190    zzm-desktop
192.168.1.248    zcni-desktop

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
zzm@zzm-desktop:~$

    不要忘记了将"127.0.1.1    zzm-desktop"注释掉。下面两行是对参与计算的机器的配置:
    192.168.1.190    zzm-desktop
    192.168.1.248    zcni-desktop

(2) 创建mpd.hosts
    这个文件的作用是告诉MPICH2,都有哪些机器参与了运算,每行一个机器名或者IP,该文件可以放在任何位置。比如我的mpd.hosts文件内容如 下:
zzm@zzm-desktop:~$ more /home/zzm/mpd.hosts
192.168.1.190
192.168.1.248
zzm@zzm-desktop:~$

(3) 配置SSH
安装SSH服务器和客户端:
    首先必须在每台参与运算的机器上面安装openssh服务器和客户端工具:
zzm@zzm-desktop:~$ sudo apt-get install openssh-server openssh-client

然后配置密钥:
    首先在本机(主机)上面生成SSH公钥和私钥:
zzm@zzm-desktop:/home/zzm$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zzm//.ssh/id_rsa): [使用默认值,我什么都没输入]
Enter passphrase (empty for no passphrase): [使用默认值,我什么都没输入]
Enter same passphrase again: [使用默认值,我什么都没输入]
Your identification has been saved in /home/zzm//.ssh/id_rsa.
Your public key has been saved in /home/zzm//.ssh/id_rsa.pub.
The key fingerprint is:
67:ae:bd:ef:7b:3f:58:0e:a6:dc:35:68:56:1c:c5:37 zzm@zzm-desktop
The key’s randomart image is:
+–[ RSA 2048]—-+
|               .o|
|               Eo|
|              . +|
|               o |
|        S o   o  |
|         +   * + |
|          o * * .|
|         o o o.o |
|        . o++o .o|
+—————–+
zzm@zzm-desktop:/home/zzm$ cd .ssh/
zzm@zzm-desktop:/home/zzm/.ssh$ ls
id_rsa  id_rsa.pub

其中,id_rsa就是本机上面的私钥,id_rsa_pub是与本机上面的私钥可以对上号的公钥。
由于每台机器既要当作SSH服务器又要当作SSH客户端,因此我们需要做的就是将这对公钥和私钥分发给每台机器,但是首先必须将公钥的文件名改 成"authorized_keys":

zzm@zzm-desktop:/home/zzm/.ssh$ mv id_rsa.pub authorized_keys
zzm@zzm-desktop:/home/zzm/.ssh$ ls
authorized_keys  id_rsa

然后使用scp命令将主机上面的.ssh目录整个拷贝给每台机器:

zzm@zzm-desktop:/home/zzm/.ssh$ scp /home/zzm/.ssh/* zzm@192.168.1.248:/home/zzm/.ssh/
zzm@192.168.1.248’s password:
authorized_keys                               100%  397     0.4KB/s   00:00   
id_rsa                                        100% 1675     1.6KB/s   00:00   
known_hosts                                   100%  442     0.4KB/s   00:00

执行完上面的操作之后,我们来进行测试:
zzm@zzm-desktop:/home/zzm/.ssh$ ssh zcni-desktop
The authenticity of host ‘zcni-desktop (192.168.1.248)’ can’t be established.
RSA key fingerprint is f2:99:c8:ac:e8:81:bd:4f:16:8f:c3:45:c5:56:65:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘zcni-desktop’ (RSA) to the list of known hosts.
Linux zcni-desktop 2.6.27-7-generic #1 SMP Fri Oct 24 06:42:44 UTC 2008 i686

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
Last login: Sat Jan 30 16:47:11 2010 from 192.168.1.190
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

zzm@zcni-desktop:~$

发现可以不用输入密码而很快的登录到另一台机器上面。
但是,我们要达到的效果是在每台机器上面都可以SSH到mpd.hosts文件中列出每台机器上面,因此针对本文中使用的mpd.hosts文件,我们必 须可以达到下面的效果:
在zzm-desktop上面,输入"ssh zzm-desktop"和"ssh zcni-desktop"都可以不用输入密码而登录到目标机器上面。
在zcni-desktop上面,输入"ssh zzm-desktop"和"ssh zcni-desktop"都可以不用输入密码而登录到目标机器上面。
如果,您发现您不能做到上述这样,请一定耐心查找原因,务必做到,这是使用MPICH2做并行计算的基础。

(4) 配置samba共享

首先在本机上面安装samba服务器和客户端:
zzm@zzm-desktop:~$ sudo apt-get install samba smbfs
在所有的客户机上面安装samba的客户端工具:
zzm@zcni-desktop:~$ sudo apt-get install smbfs

在本机上面配置samba共享:
将当前用户名加入samba的用户列表当中:
zzm@zzm-desktop:/home/zzm$ sudo smbpasswd -a zzm
[sudo] password for zzm:
New SMB password:
Retype new SMB password:

然后打开/etc/samba/smb.conf,在文件的最后添加如下的语句:
[bin]
comment = mpich2 shared folder
path = /home/zzm/bin/mpich2
public = yes
writable = yes
valid users = zzm
create mask = 0664
directory mask = 0775
force user = zzm
force group = bioinf
available = yes
browseable = yes

关于上面的配置语句,其他的自不必说,关键是下面两句:
force user = zzm
force group = bioinf
这两句的意思是说,用户在客户机中上传的文件属于的默认用户和默认用户组,可以根据你的实际情况进行修改。

然后关闭文件,重新启动samba服务:
zzm@zzm-desktop:/home/zzm$ sudo /etc/init.d/samba restart
 * Stopping Samba daemons                                                [ OK ]
 * Starting Samba daemons                                                [ OK ]
zzm@zzm-desktop:/home/zzm$

在客户机中挂在samba共享的目录:
    我们上面说过,需要将客户机中MPICH2的目录位置也和主机配置成一样的,因此我们必须建立一些目录:
zzm@zcni-desktop:/home/zzm$ mkdir bin
zzm@zcni-desktop:/home/zzm$ cd bin/
zzm@zcni-desktop:/home/zzm/bin$ mkdir mpich2
zzm@zcni-desktop:/home/zzm/bin$ mkdir mpich2/bin/
    有人会说,建立/home/zzm/bin/mpich2/bin目录是多余的,因此挂载了之后,bin目录会出现的。但是其实并不多余,因为我们要在客 户机上面建立MPICH2的环境变量,如上所述,环境变量对应的目录是:/home/zzm/bin/mpich2/bin,因此如果不在这里建立bin 目录,当没挂载的时候,此环境变量就是无效的,因为找不到bin目录。此错误可能导致您的机器无法启动。
    然后运行挂在的命令:
zzm@zcni-desktop:sudo mount -t smbfs -o unicode,codepage=unicode,iocharset=utf8,username=zzm%nicegiving //192.168.1.190/bin /home/zzm/bin/mpich2
Warning: ignoring deprecated smbfs option ‘codepage=unicode’
    现在来看看到底挂载上了没:
zzm@zcni-desktop:/home/zzm/bin$ cd mpich2/
zzm@zcni-desktop:/home/zzm/bin/mpich2$ ls
bin  etc  examples  include  lib  sbin    share

(5) 配置测试机器的环境变量

在每个测试机器上面也需要配置各自的环境变量,该部分参考"4. 设置环境变量" 这一节,此处不再详述。

(6) 开始测试
在主机上面使用mpdboot命令,启动每台机器上面的mpi进程:
zzm@zzm-desktop:/home/zzm$ mpdboot -n 2 -f /home/zzm/mpd.hosts

mpdboot通过ssh启动列表中每台机器上面的mpi进程,然后将所有的机器组成一个环(ring),这个环就是并行计算的基础了。
mpdboot的命令格式是:mpdboot -n <number to start>  -f /path/of/mpd.hosts

然后使用mpdtrace来查看当前在ring中的机器有哪些:
zzm@zzm-desktop:/home/zzm$ mpdtrace
zzm-desktop
zcni-desktop

使用mpdallexit命令,结束每台机器上面的mpi进程:
zzm@zzm-desktop:/home/zzm$ mpdallexit

如果你能得到上面的结果,说明你已经在多个机器之间成功建立了并行计算的环境。恭喜!如果有问题的话,请参考本文最后的Troubleshooting。

8. 并行程序运行测试

现在,我们来运行MPICH2的examples中的一个程序,让其在并行环境中运行:
zzm@zzm-desktop:/home/zzm/bin/mpich2/examples$ mpiexec -n 5 ./cpi
Process 1 of 5 is on zcni-desktop
Process 0 of 5 is on zzm-desktop
Process 2 of 5 is on zzm-desktop
Process 3 of 5 is on zcni-desktop
Process 4 of 5 is on zzm-desktop
pi is approximately 3.1415926544231225, Error is 0.0000000008333294
wall clock time = 0.002013
zzm@zzm-desktop:/home/zzm/bin/mpich2/examples$

9. 成功运行的关键点

每个测试机的环境配置必须一模一样
都必须有相同的用户名
都必须配置好环境变量
都必须可以在自己的机器上面ssh到任何一台机器上面而且不用输入密码

10. Troubleshooting

Note: 此处涉及到的错误及错误的解决方案皆是本人亲自碰到并成功处理的。

(1) no_port 错误
zzm@zzm-desktop:/home/zzm$ mpdboot -n 2 -f /home/zzm/mpd.hosts
mpdboot_zzm-desktop (handle_mpd_output 420): from mpd on zzm-desktop, invalid port info:
no_port

导致此错误的原因有很多个,下面是我发现的几个:
   * .mpd.conf文件的存取权限不正确,请确保其权限是600。
   * 客户机上面的环境与主机上面的不一样,比如目录不一样,或者目录中的内容有差别,请对照"9. 成功运行的关键点"这一节进行排错。
   * 客户机上面缺少.mpd.conf。 请参考"5. 添加mpd配置文件"这一节,在每台客户机上面都添加一个配置文件,并确保权限都是600,文件中的secret word都一样。

(2) failed to handshake 错误
zzm@zzm-desktop:~$ mpdboot -n 2 -f mpd.hosts
mpdboot_zzm-desktop (handle_mpd_output 407): failed to handshake with mpd on 192.168.1.248; recvd output={}

导致此错误的原 因有很多个,下面是我发现的几个:
   * 该错误是由于SSH不能达到本文中所说的"在列表中的每台机器上面都可以不用输入密码地SSH到列表中的所有机器上面,包括本机(localhost)" 而导致的。如果你做不到这点,请参考"7.3"节所述进行排错。
   * 不要将客户机上面的.mpd.conf文件的内容写成"secretwork=nicegiving",要写成 "secretword=nicegiving"

You Might Also Like