分布式 [ MPI分布式系统的运行 ]

本文深入探讨了Mpdboot在多机并行计算环境中的配置方法及使用技巧,包括SSH配置、多机并行计算的实现步骤,以及解决常见报错的方法。重点介绍了如何通过SSH实现不同机器间的信任连接,以及如何在配置mpd.conf文件和创建主机列表文件后,成功启动并行计算集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的初步想法:1. 台式机XP虚拟Ubuntu10.04 + 笔记本Ubuntu9.04
 
            2. 台式机XP虚拟Ubuntu10.04 + Ubuntu10.04_2
             3. 在大型机上实验

配置Virtualbox环境:

均采用桥接方式:bridge,dhcp,这样能分别获得独立的同网段的ip地址

1.桥接方式(bridge) :
默认使用vmnet0
将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:
ip地址与主机同段相异,
子网掩码与主机相同,
网关与主机相同,
DNS服务器与主机相同。
实现虚拟机<--->主机虚拟机<---->互联网通信。

2.共享方式(nat) :
默认使用vmnet8
将虚拟机设置成使用dhcp方式上网,windows下选择"自动获取ip",linux下开启dhcp服务即可。

手动设置:
ip设置与vmnet8同网段,
网关设置成vmnet8的网关,
DNS服务器设置与主机相同,
实现虚拟机<--->主机虚拟机<---->互联网通信。
查找vmnet1的网关,通常是xxx.xxx.xxx.2
例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2
虚拟机设置: ip :172.16.249.100 gw: 172.16.249.2

3.私有方式(host-only):
默认使用vmnet1
将虚拟机ip设置与vmnet8同网段,gateway设置成vmnet1的ip,其余设置与vmnet1相同,dns设置与主机相同
例如 vmnet1 ip :172.16.245.1
虚拟机设置: ip :172.16.245.100 gateway :172.16.245.1
这样就实现了虚拟机<--->主机通信,但是虚拟机<--->互联网 仍无法通信


采用第二种方法,因为发现1和2情况一样

SSH配置和多机并行

MPI的多机并行是用mpdboot来管理启动的,是由参与计算的其中一台机器通过mpdboot同时启动其他机器上的mpd管理器并运行相应MPI程序的,所以,需要赋予运行mpdboot的机器执行其他机器上程序的能力。

MPICH2支持通过ssh和rsh来做到这一点,其中ssh是默认的,而且其安全性也优于rsh,因此,我在项目中是用的ssh。

首先,我们需要修改所有机器上的/etc/hosts文件,在里面添加上参与计算的机器名和ip地址,比如本文中有两台机器参加的例子里,

hosts文件应当为:
127.0.0.1 localhost.localdomain localhost
192.168.50.110 node0  // 主机名为node0的机器ip地址为192.168.50.110
192.168.50.107 node1  // 主机名为node1的机器ip地址为192.168.50.107 

当然,其实这一步也可以跳过,因为我们也可以在操作过程中直接使用ip地址,只不过那样不太方便。

另外就是,有些机器默认情况下第一行可能包括本机的主机名,比如在ip为192.168.50.110的node0上,hosts文件第一行是

127.0.0.1 localhost.localdomain localhost node0

这样可能会使得mpdboot工作不正常,所以还是最好给成上面的那种形式。

第二步是创建ssh密钥,命令行下:

#ssh-keygen -t rsa
-t rsa指的是密钥类型,具体请察看ssh相关资料,这里不多说。这样就在当前用户的home目录下生成了一个.ssh目录,本文中的就是/home/mpi/.ssh。

第三步,将/home/mpi/.ssh下的id_rsa.pub文件拷贝改名为authorized_keys,即

#cp id_rsa.pub authorized_keys

第四步,在其他所有机器上进行以下操作。

#ssh-keygen -t rsa                                            生成.ssh文件夹

#scp node0的IP:/home/mpi/.ssh/* ~/.ssh           拷贝node0上的.ssh文件夹覆盖本地的

第五步,在所有机器上建立与自己和所有其他机器的信任连接。

对每个节点执行:

#ssh node0

#ssh node1

根据提示键入yes即可。然后就可以在不需要用户名密码的情况下通过ssh登陆其他机器了,比如在node0上#ssh node1,

就可以直接进入node1。

第六步,在启动mpdboot的机器上创建一个参与计算的host列表文件,如文件mpd.hosts,每行是一个主机名,创建过程如

#cd ~

#touch mpd.hosts
#vi mpd.hosts
node1
node2

可以启动运算集群了
#mpdboot -n 2 -f mpd.hosts

-n表示要启动的机器个数,一般是不大于mpd.hosts文件中的机器数,比如本文中的例子就是两台机器。这样,列表中的机器就会启动其本机上的mpd管理器。

===============================================================

【报错】mpdboot_node1 (handle_mpd_output 405): failed to handshake with mpd on

node2; recvd output={}(我被它搞死了,mpd无法连通,就啥也干不了)

可能的原因:

(1).mpd.conf设置不对,注意他的权限必须是600

(2)无密码的ssh不通,一定要保证它通

(3)这是我遇到的,我的/etc/hosts:

127.0.0.1 localhost

127.0.1.1 shenjie-desktop.shenjie-desktop    shenjie-desktop

192.168.50.107 node2

192.168.50.110 node1

这样永远得不到正确的解析了,应该改成:

127.0.0.1 localhost

192.168.50.107 node2

192.168.50.110 node1

====================================================

#mpirun -np 2 ./a.out

-n表示要启动的进程个数,一般是不大于mpd.hosts文件中的机器数(或者cpu核心数?偶用的机器就是双核的了,所以单机的时候双进程比单进程效率好很多,但是三进程就不行)。

#mpirun -machinefile ./mm -np 8 ./a.out

由mm文件设定在不同的节点上需要使用的处理器个数,在mm文件中分别写了4个node1和node2.(需要换行写,个数不可以大于8,取用时从上往下分配节点)


Mpd在运行过程中,可以通过mpdtrace显示参与计算的机器名,mpdtrace –l则是显示机器名以及其端口。


每次启动重新设置好/etc/hosts,以便域名解析


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值