读研方向是分布式计算,所以最近一直在试图搭建一个简单的分布式计算集群,中间踩过很多坑,前后历经了大约十天左右终于搭好了,特此记录一下。
一共租用了16台阿里云服务器,一台作为master节点,其余15台作为worker节点,操作系统是Ubantu22.04.
为了便于后续操作,可以修改每一台服务器的hostname,修改主机名的教程网上有很多。在XShell中输入命令 hostname 即可查看每一台服务器的主机名。
1.构建ssh免密登录
首先在所有节点上执行如下命令:ssh-keygen -t rsa ,一路回车默认即可,最终生成公钥(id_rsa.pub)和私钥(id_rsa)文件。然后将所有节点公钥文件中的内容拷贝至主节点(即master节点)的 /root/.ssh目录下authorized_keys文件中,注意也要将主节点公钥文件的内容拷贝进去,最终主节点的authorized_keys文件中包含整个集群中所有节点的公钥。然后将主节点的authorized_keys文件中的内容复制粘贴至其它所有worker节点的authorized_keys文件中,即可完成免密登录的配置。
在XShell中输入 ssh 主机名/IP地址 ,可以看到无需输入密码即可登录另一台服务器。
2.下载openmpi
2.1 下载
下载地址:https://www.open-mpi.org/software/ompi/v4.1/
选择合适的版本(例如openmpi-4.1.5),在 File names上右击选择复制链接,在XShell中输入命令:wget 链接地址即可,如下所示:
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz
即可完成下载。
2.2 解压
输入命令 tar -zxvf openmpi-4.1.5.tar.gz
2.3 配置
输入命令 cd openmpi-4.1.5 进入 文件夹
输入命令 ./configure prefix="/usr/local/openmpi",prefix指定了openmpi的安装路径,最好是指定一个安装路径,这样卸载的时候只删除该文件夹即可
2.4 编译安装
编译:输入命令 make
安装:输入命令 sudo make install
2.5 添加环境变量
输入 cd ~ 命令退回到主目录下,输入命令 vim ~/.bashrc 打开配置文件,在最末端添加如下内容:
export PATH="$PATH:/usr/local/openmpi/bin"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/openmpi/lib/"
此处提示使用vim编辑文件的方法,因为当时我自己也浪费了好多时间
输入 vim ~/.bashrc 命令进入 .bashrc文件以后按 I 键进入插入(INSERT)模式,即可进行编辑,编辑完成以后,按 esc 键退出编辑模式,再输入 :wq 保存后退出。
2.6 输入sudo ldconfig 命令
2.7 测试是否安装成功
cd openmpi-4.1.5/examples
make all
mpirun -n 1 hello_c
输入以上命令后可能会提示以下错误:mpirun has detected an attempt to run as root.
因此第三句可以修改为:mpirun -n 1 --allow-run-as-root hello_c
-n 后面的数字的含义是开启的进程数
若安装成功会出现以下结果;
3.下载 mpi4py
我是使用源码方式安装的,据说直接使用pip命令安装会出现很多错误
3.1 下载mpi4py :https://pypi.python.org/pypi/mpi4py ,
下载方法和命令同openmpi
3.2 解压
tar -zxvf mpi4py-3.1.4.tar.gz
3.3 进入mpi4py中并修改配置文件
cd mpi4py-3.1.4
vim mpi.cfg
将 mpi_dir 处的内容修改为你自己服务器上 openmpi的安装目录(使用vim修改文件的方法上面写过了...)
3.4 编译
python3 setup.py build
3.5 安装
python3 setup.py install
4 当正确完成了以上1.2.3的所有步骤后,python的MPI环境应该是搭好了,可以使用一段代码来测试一下
from mpi4py import MPI
comm = MPI.COMM_WORLD # 获取通信域
size = comm.Get_size() # 获取进程号
rank = comm.Get_rank() # 获取进程数量
node_name = MPI.Get_processor_name() # 获取进程名称
print 'Hello world from process %d at %s.' % (rank, node_name)
接下来说一下该怎么正确运行这个程序
以下操作均在主节点(即master节点)上进行
方式一:使用如下命令:
mpirun -n X -host node1,node2,node3 --allow-run-as-root -prefix openmpi安装路径 python3 程序路径
其中 X指的是你要开启的进程数,node1,node2,node3指的是你要在哪些节点上面运行该程序,注意所有节点下程序的路径必须一致!
例如: mpirun -n 3 -host master,worker01,worker02 --allow-run-as-root -prefix /usr/local/openmpi python3 /home/Test.py
方式二:使用vim编辑一个host文件指定你要在哪些节点运行该程序以及在这些节点上分别要开启几个进程
在XShell中输入命令 vim hosts ,在其中输入以下内容,在我的集群中一共有16个节点,一个master和15个worker
其中 slots=1 的含义是在该节点上开启一个进程,当然你也可以指定别的数字
此时的运行命令为:
mpirun -n 要开启的进程数 -hostfile 文件名 --allow-run-as-root -prefix openmpi安装路径 python3 程序路径
例如:mpirun -n 5 -hostfile hosts --allow-run-as-root -prefix /usr/local/openmpi python3 /home/Test.py(此时我选取了5个节点,当然相应的hosts文件也应该修改为只剩下前五行)
如果并行环境配置成功应该出现以下运行结果:
5. 配置过程中踩过的坑
要构建python下的MPI环境需要安装一种MPI的具体实现(openmpi或者mpich),本来想安装mpich,看网上的教程说安装mpich之前必须先安装openmpi,所以一开始把openmpi、mpich以及mpi4py全部安装了,结果就是所有节点返回的rank值都是0,size值都是1。所以大家一定记住二选一安装就可以不要全部安装!!!
第二点就是在运行命令中一定要加上-prefix这一句,否则也会报错!!
关于moirun 的具体用法,可以在XShell中输入命令:man mpirun 来查看
以上就是我在配置python下的MPI环境中的一点心得,仅此记录以便于日后回看,也希望可以帮到大家一丢丢,有问题欢迎大家留言和我交流~