分布式并行库MPICH2安装

安装环境:
VMware10, Ubuntu14.04.

目录:(大部分内容转自http://duanple.blog.163.com/blog/static/709717672010329581914/,整个流程本人亲测!)
———————
一. 什么是MPICH2
二. 安装前的系统准备
三. 安装步骤
四. 设置环境变量
五. 添加mpd配置文件
六. 开始单机测试
七. 安装后配置(多机测试)
(7.1) 修改/etc/hosts
(7.2) 创建mpd.hosts
(7.3) 配置SSH
(7.4) 配置samba共享, NFS共享?
(7.5) 配置测试机器的环境变量
(7.6) 开始测试
八. 并行程序运行测试
九. 成功运行的关键点
十. Troubleshooting
———————

[一]. 什么是MPICH/MPICH2?
MPICH is a freely available, portable implementation of MPI, a standard for message-passing for distributed-memory applications used in parallel computing. MPICH is Free Software and is available for most flavours of Unix (including Linux and Mac OS X) and Microsoft Windows.
MPICH2 is one of the most popular implementations of MPI. It is used as the foundation for the vast majority of MPI implementations including IBM MPI (for Blue Gene), Intel MPI, Cray MPI, Microsoft MPI, Myricom MPI, OSU MVAPICH/MVAPICH2, and many others.
[上面这段 From Wikipedia].

Note: 下面这段摘自MPICH2官方网站:http://www.mpich.org/
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,及其他各个版本http://www.mpich.org/static/downloads/

[二].安装前的系统准备

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

jacobxu@jacobxu-ubuntuNode001:~$ gcc –version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 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.

jacobxu@jacobxu-ubuntuNode001:~$ g++ –version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 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.

jacobxu@jacobxu-ubuntuNode001:~$ python -V
Python 2.7.6
jacobxu@jacobxu-ubuntuNode001:~$ gfortran –version
GNU Fortran (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 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用户进行安装。

[三]. 安装步骤
标准的 configure, make, make install 步骤,非常简单!
jacobxu@jacobxu-ubuntuNode001:~/20140715Temp$ tar xzf mpich2-1.2.1.tar.gz
jacobxu@jacobxu-ubuntuNode001:~/20140715Temp$ cd mpich2-1.2.1/
jacobxu@jacobxu-ubuntuNode001:~/20140715Temp/mpich2-1.2.1$ ./configure –prefix=/home/jacobxu/bin/mpich2
(… 我保证你绝对不想看的非常多的输出)
jacobxu@jacobxu-ubuntuNode001:~/20140715Temp/mpich2-1.2.1$ make
(… 我保证你绝对不想看的非常多的输出)
jacobxu@jacobxu-ubuntuNode001:~/20140715Temp/mpich2-1.2.1$ make install
(… 我保证你绝对不想看的非常多的输出)

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

安装结束!

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

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

[五]. 添加mpd配置文件
在当前用户的home目录下面新建立一个名为”.mpd.conf”的配置文件,文件的内容如下应该包括下面这行:
secretword=
比如:
jacobxu@jacobxu-ubuntuNode001:~$ more .mpd.conf
secretword=imjiaming

是你的密钥,是每台机器进行连接并用建立并行环境互相信任的基础。
接下来,需要设置该文件的存取权限,这步是必须的,否则在后面的运行中会报错。
jacobxu@jacobxu-ubuntuNode001:~$ chmod 600 .mpd.conf //权限设置为只有自己有读写权限
jacobxu@jacobxu-ubuntuNode001:~$ ls -ll .mpd.conf
-rw——- 1 jacobxu jacobxu 21 7月 15 18:07 .mpd.conf

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

[六]. 开始单机测试
如果你能得到下面的结果而且没有出现任何错误的话,说明你的MPICH2已经安装成功。
jacobxu@jacobxu-ubuntuNode001:~$ mpd &
[1] 3125
jacobxu@jacobxu-ubuntuNode001:~$ mpdtrace
jacobxu-ubuntuNode001
jacobxu@jacobxu-ubuntuNode001:~$ mpdallexit
jacobxu@jacobxu-ubuntuNode001:~$ ps axu |grep mpd
jacobxu 3213 0.0 0.0 15960 936 pts/0 S+ 20:38 0:00 grep –color=auto mpd
[1]+ 完成 mpd

[七]. 安装后配置(多机测试)
由于需要将多台机器进行联网,组成强大的并行计算环境,我们必须对已经安装好的MPICH2进行多台机器的联机测试,看看到底可用否。
MPICH2在多台机器上面组成并行计算环境的通信协议是SSH,因此我们首先必须保证,在参与计算的机器中,在每台机器上面都可以不用输入密码地SSH 到其他的机器上面(包括本机),这个我们通过配置SSH的公钥和私钥来解决。
另一个重要的基础是每台机器上面的配置环境必须一模一样,有着同样的用户名,同样的用户目录,同样的环境变量,同样的MPICH2的bin目录及位置,同样的需要并行计算的程序,这个我们采用samba文件共享来解决,让所有的客户机都共享同样的主机目录,这样只需要在主机上面做配置就可以了,其他的机器上面直接享有主机的配置,省去了一台一台配置的麻烦,特别是当参与计算的机器很多的时候。其实采用samba文件共享仍然不是十分完美的解决方案,真正好的方案是采用GFS(Global File System)等网络文件系统建立一个文件服务器,文件服务器当作主机,所有的客户机的用户的home目录都挂载主机的home目录。这不属于本文范畴,我们就此打住。
注:有人尝试使用NFS来进行网络文件共享的,关于如果使用NFS比较好的参考资料是:http://wenku.baidu.com/view/e94f846b011ca300a6c39084.html
下面,让我们一步一步来做。
需要说明的是,步骤(1)、(2)和(5)需要在每台客户机上面都执行。步骤(3)中的.ssh文件夹需要拷贝到每台客户机上面。
(7.1) 修改/etc/hosts (两台虚拟机都做)
在hosts文件中添加所有参与计算的机器的IP和主机名的配置,这样,我们就可以通过主机名来访问每台机器,省去了输入IP地址的麻烦。比如,我的 hosts文件配置如下:
zzm@zzm-desktop:~$ more /etc/hosts
127.0.0.1 localhost
#127.0.1.1 jacobxu-ubuntuNode001

192.168.111.128 jacobxu-ubuntuNode001
192.168.111.129 jacobxu-ubuntuNode002

# 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 jacobxu-ubuntuNode001″注释掉。下面两行是对参与计算的机器的配置:
192.168.111.128 jacobxu-ubuntuNode001
192.168.111.129 jacobxu-ubuntuNode002

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

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

7.3.2. 然后配置密钥: (主节点做)
首先在本机(主机)上面生成SSH公钥和私钥:
jacobxu@jacobxu-ubuntuNode001:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jacobxu/.ssh/id_rsa): [使用默认值,我什么都没输入]
Enter passphrase (empty for no passphrase): [使用默认值,我什么都没输入]
Enter same passphrase again: [使用默认值,我什么都没输入]
Your identification has been saved in /home/jacobxu/.ssh/id_rsa.
Your public key has been saved in /home/jacobxu/.ssh/id_rsa.pub.
The key fingerprint is:
8f:52:f9:e5:ba:4c:12:11:47:5c:83:f8:25:42:0f:69 jacobxu@jacobxu-ubuntuNode001
The key’s randomart image is:
+–[ RSA 2048]—-+
| .+=ooo |
| E=+ .. |
| ..o.o |
| o. |
| S . |
| . = o |
| . o + . |
| . + . |
| +. |
+—————–+
jacobxu@jacobxu-ubuntuNode001:~$ cd .ssh/
jacobxu@jacobxu-ubuntuNode001:~/.ssh$ ls
id_rsa id_rsa.pub known_hosts

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

jacobxu@jacobxu-ubuntuNode001:~/.ssh$ mv id_rsa.pub authorized_keys
jacobxu@jacobxu-ubuntuNode001:~/.ssh$ ls
authorized_keys id_rsa known_hosts

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

jacobxu@jacobxu-ubuntuNode001:~/.ssh$ scp /home/jacobxu/.ssh/* jacobxu@192.168.111.129:/home/jacobxu/.ssh/
The authenticity of host ’192.168.111.129 (192.168.111.129)’ can’t be established.
ECDSA key fingerprint is 10:b4:19:9b:2e:19:d7:5b:67:7e:5f:16:04:35:91:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ’192.168.111.129′ (ECDSA) to the list of known hosts.
jacobxu@192.168.111.129′s password:
authorized_keys 100% 411 0.4KB/s 00:00
id_rsa 100% 1679 1.6KB/s 00:00
known_hosts 100% 444 0.4KB/s 00:00
jacobxu@jacobxu-ubuntuNode001:~/.ssh$

执行完上面的操作之后,我们来进行测试:
jacobxu@jacobxu-ubuntuNode001:~/.ssh$ ssh jacobxu-ubuntuNode002
The authenticity of host ‘jacobxu-ubuntunode002 (192.168.111.129)’ can’t be established.
ECDSA key fingerprint is 10:b4:19:9b:2e:19:d7:5b:67:7e:5f:16:04:35:91:90.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘jacobxu-ubuntunode002′ (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)

* Documentation: https://help.ubuntu.com/

jacobxu@jacobxu-ubuntuNode002:~$

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

(7.4) 配置samba共享

首先在本机上面安装samba服务器和客户端:(主节点做)
jacobxu@jacobxu-ubuntuNode001:~$ sudo apt-get install samba cifs-utils

在所有的客户机上面安装samba的客户端工具:(从节点做)
jacobxu@jacobxu-ubuntuNode002:~$ sudo apt-get install cifs-utils

在本机上面配置samba共享:
将当前用户名加入samba的用户列表当中:
jacobxu@jacobxu-ubuntuNode001:~$ sudo smbpasswd -a jacobxu
New SMB password: (123456)
Retype new SMB password: (123456)
Added user jacobxu.
jacobxu@jacobxu-ubuntuNode001:~$

然后打开/etc/samba/smb.conf,在文件的最后添加如下的语句:
[bin]
comment = mpich2 shared folder
path = /home/jacobxu/bin/mpich2
public = yes
writable = yes
valid users = jacobxu
#就是建立文件的预设值
create mask = 0664
#就是建立目录的预设值
directory mask = 0775
force user = jacobxu
force group = jacobxu
available = yes
browseable = yes

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

然后关闭文件,重新启动samba服务:
jacobxu@jacobxu-ubuntuNode001:/etc/init.d$ sudo service smbd restart
smbd stop/waiting
smbd start/running, process 3842

查看samba状态:
jacobxu@jacobxu-ubuntuNode001:/etc/init.d$ ./samba status
* nmbd is running
* smbd is not running

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

(7.5) 配置测试机器的环境变量(由于我们是克隆主机得到的,这部分也直接跳过)
在每个测试机器上面也需要配置各自的环境变量,该部分参考”四. 设置环境变量” 这一节,此处不再详述。

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

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

然后使用mpdtrace来查看当前在ring中的机器有哪些:
jacobxu@jacobxu-ubuntuNode001:~$ mpdtrace
jacobxu-ubuntuNode001
jacobxu-ubuntuNode002

使用mpdallexit命令,结束每台机器上面的mpi进程:
jacobxu@jacobxu-ubuntuNode001:~$ mpdallexit

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

八. 并行程序运行测试
注,要先启动MPI。
现在,我们来运行MPICH2的examples中的一个程序,让其在并行环境中运行:
jacobxu@jacobxu-ubuntuNode001:~/bin/mpich2/examples$ mpiexec -n 5 ./cpi
Process 2 of 5 is on jacobxu-ubuntuNode001
Process 0 of 5 is on jacobxu-ubuntuNode001
Process 4 of 5 is on jacobxu-ubuntuNode001
Process 1 of 5 is on jacobxu-ubuntuNode002
Process 3 of 5 is on jacobxu-ubuntuNode002
pi is approximately 3.1415926544231225, Error is 0.0000000008333294
wall clock time = 0.041154
jacobxu@jacobxu-ubuntuNode001:~/bin/mpich2/examples$

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

10. Troubleshooting
Note: 此处涉及到的错误及错误的解决方案皆是zzm亲自碰到并成功处理的。
(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

导致此错误的原因有很多个,下面是zzm发现的几个:
* .mpd.conf文件的存取权限不正确,请确保其权限是600。
* 客户机上面的环境与主机上面的不一样,比如目录不一样,或者目录中的内容有差别,请对照”9. 成功运行的关键点”这一节进行排错。
* 客户机上面缺少.mpd.conf。 请参考”五. 添加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={}

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

其他:
[1]. samba和NFS的区别是什么?[出自 ChinaUnix版主 bjchenxu]
samba是DEC开始开发的,用于在不同的Unix机器间进行资源共享,采用udp协议。后来基于tcp重新开发后,效率有了很大提高。它使用的协议是SMB。微软不愿意交License费,在windows系统中对该协议重新进行了实现。既然samba和windows中的网络邻居都使用SMB协议。那么,samba自然主要用于在windows和unix之间共享资源。资源包括文件、打印机等等。

NFS是SUN开发的,用于UNIX机器之间的资源共享。其设置相当容易,主要是配置/etc/exports文件,然后运行exportfs -a来共享出来。现在NFS已经成为UNIX/LINUX上的标配。

两者的文档都说自己的效率高一些:)从我的经验来看,nfs的效率要稍微高一些,只是差别不是太大。
从配置来看,samba比较复杂,nfs比较简单。但是复杂有复杂的道理,它让我们能够灵活的配置。

顺便说一句,SUN公司是一个很有意思的公司,它以技术创新而著称。其产品和技术为全世界广泛享用,以至于大家都忘记了它是该技术的发明者,比如说vi/csh/nfs/pam等等等等。对了,还有tcp/ip协议,也是Sun的Bill Joy首先移植到BSD中的。不过大家毕竟都知道,它是JAVA的创始者:)

[2]. 数据文件读取问题?
MPI会从不同的节点上读取数据,因而应设置文件共享,使得每个节点都能够看到这个文件。我尝试使用HDFS进行共享,但由于HDFS只提供Java接口,而MPI大多是基于C写的,因而需要JNI接口进行调用。另一种比较简单的方式是 搭建NFS,使用网络文件共享系统进行磁盘共享。另外有人提及:MPI 程序需要一个输入数据文件,但是我们往往只是由一个进程去分发数据(比如 0号进程),因此在其他进程的机器上并不需要真实的数据文件,只需要一个相同文件名的空文件使
程序运行起来即可。见:[http://blog.csdn.net/labmpi/article/details/1092210]
参考:
[1]. http://duanple.blog.163.com/blog/static/709717672010329581914/
[2]. http://wenku.baidu.com/view/e94f846b011ca300a6c39084.html

分布式并行库MPICH2安装》上有 2 条评论

  1. Pingback 引用通告: VMware+Ubuntu安装,创建多个集群虚拟机 | 刻骨铭心

  2. Pingback 引用通告: Hadoop在Ubuntu14.04上的集群配置 | 刻骨铭心

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>