【Python-分布式】MPI集群环境搭建

<p style="font-family:'-apple-system','SF UI Text',Arial,'PingFang SC','Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif,SimHei,Simsun;background-color:rgb(255,255,255);">【我的笔记】

<p style="font-family:'-apple-system',255);">1. 准备

<p style="font-family:'-apple-system',255);">用which mpicc和which mpiexec检查是否安装MPICC。

<p style="font-family:'-apple-system',255);">在一台机器ping另一台机器,看是否连通。

<p style="font-family:'-apple-system',255);">2.执行MPI文件

<p style="font-family:'-apple-system',255);">在home根目录(也可以是其他目录)下新建一个文件:<span style="color:#cc0000;">mpi_config_file。

<p style="font-family:'-apple-system',255);">mpi_config_file是在运行MPI程序时参考的配置文件,它显式注明每台机器各有几个cpu核。 

编辑mpi_config_file(这个文件在后面执行程序时会作为参数包括在命令中): sudo gedit mpi_config_file 

因为我主机是8核且每台虚拟机分配了四核,所以在mpi_config_file中输入以下内容并保存: 

<code class="language-plain">node1:4
node2:4
<p style="font-family:'-apple-system',255);">3. hello mpi

一个脚本hello_mpi.py,里面包含以下代码

<code class="language-python">from mpi4py import MPI
print("hello world'',end = ",")
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
print("my rank is: %d" % rank)

然后我们在命令行通过以下方式运行:

<code class="language-plain">mpiexec -n 5 -f /home/mpi_config_file python hello_mpi.py 

或者

<code class="language-plain">mpirun –np 5 python hello_mpi.py

-np5 指定启动5个mpi进程来执行后面的程序。相当于对脚本拷贝了5份,每个进程运行一份,互不干扰。在运行的时候代码里面唯一的不同,就是各自的rank也就是ID不一样。所以这个代码就会打印5个hello world和5个不同的rank值,从0到4.

4. Windows下安装mpi4py 

1) 要下一个Microsoft MPI,将其Bin文件夹所在路径添入环境变量path 
2) 使用conda install --channel https://conda.anaconda.org/dhirschfeld mpi4py 安装mpi4py 
3) 使用mpiexec -n 4 python C:\Users\YourName\Documents\Python\YourMPItest.py 测试一下安装是否成功

<p style="font-family:'-apple-system',255);">=============================================================================

<p style="font-family:'-apple-system',255);">我在前面两篇博客中简要介绍了为什么要并行计算以及MPI的一些学习心得,接下来我们正式开始MPI的学习之路。<span style="font-weight:700;">我们知道MPI是分布式内存编程,所以这篇博客会详细讲解MPI集群环境的搭建过程。

<p style="font-family:'-apple-system',255);"><span style="font-weight:700;">

<h2 id="一准备工作" style="font-family:'-apple-system',255);"><a name="t0">一、准备工作<ol style="list-style:none;color:rgb(51,51,51);font-family:'-apple-system',SimSun;font-size:14px;background-color:rgb(255,255);">
  • <span style="font-weight:700;">选择Linux版本:这里我选择的是Ubuntu14.04,其他Linux版本如CentOS、Fedora等操作类似,一些命令和配置文件路径会有一些差别。
  • <span style="font-weight:700;">物理服务器集群和虚拟节点选择:我是用VMware创建多个虚拟机来进行集群模拟,后期我会把环境部署到实验室的服务器集群上,基本操作应该是一样的,如果有需要注意的地方,我会在后续的博客中进行说明。
  • <span style="font-weight:700;">在VMware中安装Ubuntu14.04,实验模拟安装两个节点即可。建议初始设置时用户名取一样的,因为后面每个虚拟机节点之间免密登录时需要保证用户名一致,这样可以避免出现未知的问题。
  • <h2 id="二安装mpich" style="font-family:'-apple-system',255);"><a name="t1">二、安装MPICH<p style="font-family:'-apple-system',255);"><span style="font-weight:700;">到MPICH官网下载源码包,解压、配置、编译、安装即可。 

    我的安装文件


    上图是我VMware的一些文件夹的命名,受电脑配置限制,我创建了两个节点,如图左边所示,节点名称是node1和node2。我将mpich-3.2.tar.gz压缩包放在了mpi_install路径下,mpi_share是节点之间的共享目录,后面会说明。 
    首先,解压mpich-3.2.tar.gz:tar -zxvf ./mpich-3.2.tar.gz。 
    解压后的文件夹中有个README文件,打开后有详细的安装步骤,这里我简要说明:

    <ul style="list-style:none;color:rgb(51,255);">
  • 为避免错误,在安装MPICH之前,分别执行以下命令:<span style="font-weight:700;">sudo apt-get update(保证安装的源最新)、<span style="font-weight:700;">sudo apt-get install gcc(安装gcc编译器,用于编译C语言)、<span style="font-weight:700;">sudo apt-get install g++(安装g++编译器,用于编译C++)、<span style="font-weight:700;">sudo apt-get install gfortran(安装gfortran编译器,用于编译fortran语言)。
  • 进入源码包解压后的路径,执行如下命令:<span style="font-weight:700;">cat /etc/shells。 
    (1)如果显示为:/bin/sh 和 /bin/bash,则配置、编译和安装命令分别为: 
    配置: 
    <span style="font-weight:700;">./configure 2>&1 | tee c.txt 
    编译: 
    <span style="font-weight:700;">make 2>&1 | tee m.txt 
    安装: 
    <span style="font-weight:700;">make install |& tee mi.txt 
    配置和编译时间较长,安装路径及一些配置可以设置,不清楚的可以参考linux下软件的不同安装方式,可以参考以下博客:<a href="http://blog.csdn.net/u010509774/article/details/50593231" rel="nofollow">linux下软件安装。 
    (2)如果显示为:/bin/csh 和 /bin/tcsh,则配置、编译和安装命令分别为: 
    配置: 
    <span style="font-weight:700;">./configure |& tee c.txt 
    编译: 
    <span style="font-weight:700;">make |& tee m.txt 
    安装: 
    <span style="font-weight:700;">make install |& tee mi.txt
  • <p style="font-family:'-apple-system',255);"><span style="color:#cc0000;">安装结束后,用which mpicc和which mpiexec检查安装是否成功,如果有这两个可执行程序的路径显示,则表示安装成功。注意:如果自行选择安装路径的话,记得设置环境变量,具体README文档中有详细说明。<span style="font-weight:700;">这里希望大家注意一个问题,如果设置环境变量的话,~/.bashrc配置文件下的环境变量和切换sudo执行时的环境变量不同,sudo执行时会找不到命令。关于配置文件的介绍,可以参考下面文章:<a href="https://www.cnblogs.com/xiehongfeng100/p/4969477.html" rel="nofollow">linux环境变量配置文件区别。 

    <span style="font-weight:700;">在每个节点中安装MPICH,方法同上。建议每个节点中安装路径相同,统一命名(虽然安在不同的位置也可以,只要保证找到执行命令即可,但为了后期开发方便以及赏心悦目的原则,我们还是专业一点好)。

    <h2 id="三ssh免密登录" style="font-family:'-apple-system',255);"><a name="t2">三、SSH免密登录<p style="font-family:'-apple-system',255);">1.<span style="font-weight:700;">网络环境配置(网络搭建和ip地址设置) 
    分别配置两台机器的hosts文件,在此之前先通过<span style="font-weight:700;">ip addr show或<span style="font-weight:700;">ifconfig命令查看两台机器的IP地址,我的IP地址为: 
    <span style="font-weight:700;">node1:192.168.36.145 
    <span style="font-weight:700;">node2:192.168.36.146 
    然后修改hosts文件: 
    <span style="font-weight:700;">sudo gedit /etc/hosts 
    根据以上查得的IP地址,在两台机器的hosts文件中均输入以下内容并保存: 
    <span style="font-weight:700;">192.168.36.145 node1 
    <span style="font-weight:700;">192.168.36.146 node2 
    <span style="color:#cc0000;">此时,两个节点间应该可以互相ping通(<span style="font-weight:700;">node1 ping node2)。 
    <span style="font-weight:700;">注意:虚拟机中每个机器的ip会自动分配发生变化,我们可以手动设置为固定ip(Ubuntu可以参考以下文章:<a href="http://blog.csdn.net/wolf_soul/article/details/46409323" rel="nofollow">Ubuntu固定ip)。 
    2.<span style="font-weight:700;">SSH免密登录 
    (1)在每个节点安装SSH服务(远程登录服务):<span style="font-weight:700;">sudo apt-get install ssh (有些版本Ubuntu安装过程中可能会出现问题,安装错误提示一步一步搜索即可解决问题)。 
    (2)各节点生成私钥和公钥 
    <span style="font-weight:700;">ssh-keygen -t rsa // 生成的钥匙文件在 ~/.ssh/下,其他linux版本如CentOS路径会有所不同 
    <span style="font-weight:700;">cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys //认证(执行该步后可以保证本机免密登录,使用ssh node1进行测试) 
    (3)把各子节点的 id_rsa.pub 传到主节点 
    <span style="font-weight:700;">scp id_rsa.pub lw@node1:~/.ssh/id_rsa.pub.node2(这里我们把node1看作主节点,将node2节点的钥匙文件传到node1上) 
    (4)在主节点上操作 
    <span style="font-weight:700;">cat ~/.ssh/id_rsa.pub.node2 >> ~/.ssh/authorized_keys//认证 
    <span style="font-weight:700;">scp authorized_keys lw@node2:~/.ssh/authorized_keys//将认证文件传回每个子节点 
    (5)验证无密码登录 
    在node1节点上执行:<span style="font-weight:700;">ssh node2 

    关于SSH免密登录谈谈我的个人理解:因为MPI是分布式内存编程,在后面的开发中涉及节点间信息的传递,往往数据和程序是在一个节点上,所以需要保证执行命令时各节点之间信息的交换。设置SSH免密登录可以免去操作中密码的输入。各节点生成私钥和公钥后需要认证,此时可以保证本机免密登录。将各个子节点的公钥文件发送给主节点,然后分别加入到主节点的认证文件中,此时可以保证主节点对各个子节点的免密登录。最后将认证文件传回到每个子节点,从而保证各个子节点对其他节点之间的免密登录

    <h2 id="四建立和挂载nfs共享目录" style="font-family:'-apple-system',255);"><a name="t3">四、建立和挂载NFS共享目录<p style="font-family:'-apple-system',255);">前面几步我们安装了MPICH和实现了SSH免密登录,如果要执行程序的话,需要保证每个节点的相同目录中都生成可执行文件,该操作方式比较繁琐,为解决该问题,我们可以采用建立共享目录的方案。 
    (1)在所有节点中建立相同路径下的相同目录:<span style="font-weight:700;">mkdir /home/mpi_share。 
    (2)安装NFS,不同的Linux安装和启动NFS的命令可能不同,在ubuntu14.04中,命令为:<span style="font-weight:700;">sudo apt-get install nfs-kernel-server,另外还需要安装<span style="font-weight:700;">sudo apt-get install portmap或<span style="font-weight:700;">sudo apt-get install rpcbind(这里安装如果出现问题的话,根据提示搜索可以解决问题)。 
    (3)设置NFS服务器,选取一个节点作为服务器,即编写程序的虚拟机,当在此台虚拟机的共享目录编写程序并编译后会将共享目录中的所有文件同步到其它虚拟机中(NFS客户端):<span style="font-weight:700;">sudo vi /etc/exports或<span style="font-weight:700;">sudo gedit /etc/exports,打开文件后,在文件的最后附件上所有同步的客户端的虚拟机的ip和权限,如下: 
    /home/mpi_share 192.168.36.145 (rw,sync,no_root_squash,no_subtree_check) 
    /home/mpi_share 192.168.36.146 (rw,no_subtree_check) 
    其中/home/mpi_share是共享目录,ip地址是所有的客户端(其它节点)的地址,包括本机的,后面括号中的是权限,具体含义可上网查阅(rw即读写权限)。 
    (4)重启NFS,sudo /etc/init.d/nfs-kernel-server restart,此时,NFS服务器虚拟机配置完毕。 
    (5)接下来需要配置其它NFS客户端虚拟机,使其能共享NFS服务器的共享目录:在其他节点中运行<span style="font-weight:700;">sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share,其中ip为NFS服务器的地址,:后面跟的是服务器的共享目录,在后面跟的是本机(客户端)的共享同步目录。此时,所有的共享目录便配置完毕了(每次节点启动时都需重新执行挂载命令,<span style="font-weight:700;">如果想开机自动挂载:把上述指令sudo mount -t nfs 192.168.36.145:/home/mpi_share /home/mpi_share 写到 /etc/rc.local 文件中)。 
    (6)测试:在NFS服务器端的共享目录建立一个文件gedit test.c并保存,几秒钟后检查其他节点中是否在共享目录中产生了该文件,若产生则配置成功。 

    <span style="font-weight:700;">建立和挂载NFS共享目录的目的是保证主节点生成的可执行文件和需要的数据其他节点可以访问,这样就可以保证多个节点之间的并行(如果不执行这一步的话,需要将执行文件和需要的数据复制到每个节点的相同位置)。

    <h2 id="五集群环境执行mpi程序" style="font-family:'-apple-system',255);"><a name="t4">五、集群环境执行MPI程序<p style="font-family:'-apple-system',255);">(1)新建配置文件: 
    在home根目录(也可以是其他目录)下新建一个文件:mpi_config_file。mpi_config_file是在运行MPI程序时参考的配置文件,它显式注明每台机器各有几个cpu核。 
    编辑mpi_config_file(这个文件在后面执行程序时会作为参数包括在命令中): 
    <span style="font-weight:700;">sudo gedit mpi_config_file 
    因为我主机是8核且每台虚拟机分配了四核,所以在mpi_config_file中输入以下内容并保存: 
    <span style="font-weight:700;">node1:4 
    <span style="font-weight:700;">node2:4 
    (2)编写MPI程序: 
    这里我们选取案例程序进行测试,在我们之前解压的mpich-3.2文件夹下的examples目录下就有现成的可执行程序<span style="font-weight:700;">cpi,我们运行它即可。 
    (3)运行可执行程序: 
    将可执行文件cpi复制到共享目录<span style="font-weight:700;">/home/mpi_share/中,保证每个节点都可以访问该可执行文件(如果不安装NFS服务的话,需要将可执行文件放到每台机器的相同目录下)。 
    切换到共享目录:<span style="font-weight:700;">cd /home/mpi_share/ 
    执行指令:<span style="font-weight:700;">mpiexec -n 8 -f /home/mpi_config_file ./cpi(mpiexec 表示执行该mpi程序,-n 8表示开8个进程,参数-f /home/mpi_config_file 表示运行过程参考配置文件mpi_config_file,./cpi是当前目录下的执行文件名)。执行成功后结果如下: 
    lw@node1:/home/mpi_share$ <span style="font-weight:700;">mpiexec -n 8 -f /home/mpi_config_file ./cpi 
    <span style="font-weight:700;">Process 2 of 8 is on node2 
    <span style="font-weight:700;">Process 5 of 8 is on node1 
    <span style="font-weight:700;">Process 7 of 8 is on node2 
    <span style="font-weight:700;">Process 4 of 8 is on node1 
    <span style="font-weight:700;">Process 3 of 8 is on node2 
    <span style="font-weight:700;">Process 1 of 8 is on node1 
    <span style="font-weight:700;">Process 6 of 8 is on node2 
    <span style="font-weight:700;">Process 0 of 8 is on node1

    <p style="font-family:'-apple-system',255);">接下来我会持续更新该系列博客,并结合自己MPI程序实例分析MPI中的通信函数和并行设计策略。以下是我的邮箱:<span style="font-weight:700;">18771012018@163.com,如有问题,欢迎讨论。

    <p style="font-family:'-apple-system',255);">转自:https://blog.csdn.net/secyb/article/details/78697976

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐


    我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
    说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
    记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
    文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
    文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
    文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
    首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
    seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
    Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
    1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
    1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
    文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
    文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
    文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
    Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
    1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
    文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
    文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
    mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
    文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实