目标:
我们想实现2台主机免密互联,将MPI Hello World跑起来
假设hostname是node01,node02,(Linux shell窗口一般是UserName@HostName,node1和node2一定要和HostName一样)
hostname是/etc/hosts中的配置,如下:
ssh node1
ssh node2
使用IP免密登录(用户名相同时,ssh+主机名;如果不同,登录方式就是 ssh+用户名@IP地址)
可以参考:https://help.ubuntu.com/community/MpichCluster
修改hosts文件
分别假如主机,修改/etc/hosts文件,保证两台主机的username一样,linux 窗口一般都会是UserName@HostName组成
sudo vi /etc/hosts
#然后添加
#注意一点是不要用127.0.0.1,自己本机还是用共IP如下
10.8.103.195 node1
10.8.100.30 node2
生成并拷贝密钥
cd
cd .ssh
#生成密钥
ssh-keygen -t rsa
在.ssh/目录下,会新生成两个文件:id_rsa.pub和 id_rsa
互相上传公钥到目标机器
#机器node2
ssh-copy-id node1
#机器node1
ssh-copy-id node2
然后就可以互联啦。
然后,配置一个machinefile
node1:1
node2:2
如果出现下面错误
Host key verification failed.
[mpiexec@-d2004-20230516] ui_cmd_cb (mpiexec/pmiserv_pmci.c:51): Launch proxy failed.
[mpiexec@-d2004-20230516] HYDT_dmxu_poll_wait_for_event (lib/tools/demux/demux_poll.c:76): callback returned error status
[mpiexec@-d2004-20230516] HYD_pmci_wait_for_completion (mpiexec/pmiserv_pmci.c:173): error waiting for event
[mpiexec@-d2004-20230516] main (mpiexec/mpiexec.c:260): process manager error waiting for completion
大概率是上面node1/2和hostname没有一一对应起来导致的。
然后在两台机器创建相同的文件夹。并且挂载同一个sample
#命令行安装mpich
#或者源码安装到/usr,这样不会出现各种找不到文件的情况
#2台机器都要装
#或者可以一台机器装好,采用mount去挂载
sudo ./configure --disable-fortran --prefix=/usr/
sudo make
sudo make install
$ sudo mount -t nfs 10.9.114.22:/workspace /home/worspace
$ cd sample
$ mpirun -n 2 -f /home/zhencheng.pace/eccl/mpich-4.2.1/build/bin/machinefile ./mpi_hello_world
如果在单机上运行那么只要不加-f就可以了
#可以测试hostname是一个命令,可以用ls等
mpiexec -f machinefile -n 2 hostname
$ mpiexec -n 4 ./mpi_hello_world
Hello world from processor enflame-d2004-20230516, rank 0 out of 4 processors
Hello world from processor enflame-d2004-20230516, rank 2 out of 4 processors
Hello world from processor enflame-d2004-20230516, rank 1 out of 4 processors
Hello world from processor enflame-d2004-20230516, rank 3 out of 4 processors
简化办法
如果mpi编译在自己文件夹下,那么可以通过下面的方式来
sudo ./configure --disable-fortran --prefix=/you/works/dir
sudo make -j12
sudo make install
export PATH=$PATH:/you/works/dir/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/you/works/dir/lib
#核心保证2台机器上都要有mpi所有的bin和so,并且在同一个目录下
mpiexec -f machinefile -n 2 hostname
slave机器上挂载
sudo mount -t nfs 10.9.114.22:/workspace/mpi /workspace/mp
MPI的原理就是在多台机器上(相同目录,相同username)上同时启动,用户只要在一台机器上启动,MPI自动在其它机器上启动
可能会出现下面错误相关问题
可以设置环境变量:
env | grep FI_
export FI_LOG_LEVEL=debug
export FI_PROVIDER=tcp
export FI_SOCKETS_IFACE=lo
netstat -lpunt |grep -i 34116
IP
下面是libfabric的介绍:
https://blog.csdn.net/ssbandjl/article/details/133248887
其实最后的结果猜测是服务器IP端口设置的缘故,在本机回环测试通过也行
后来反复测试发现,原来是服务器A的mpiexec默认打开的是服务器B上的docker0的虚拟网卡,导致两台服务器无法通过tcp/udp通信,把docker服务关闭,docker0虚拟网卡关掉就可以了。
#关闭docker0
sudo ifconfig docker0 down #up是打开
#关闭服务,只要关闭对端的就可以了
sudo service docker stop #start
mpiexec -f hostfile -iface eth0 -n 8 ./mpi_hello_world