zoukankan      html  css  js  c++  java
  • OpenMPI 集群配置

    现在有2台机器,希望可以尝试一下在多台机器上跑MPI的感觉,所以跑之前就得配置,先参考网址:

    https://www.cnblogs.com/awy-blog/p/3402949.html:

    1. 配置自动ssh登录

    这里主要是要各个机器之间能无密码访问,主要用到的就是SSH,因此需要一些设置。

    首先,我们需要导出各个节点的公钥和私钥:

    $ ssh-keygen -t rsa 

    在运行过程中,会提示你输入这个输入那个,不用管那么多,直接回车就完了。等运行结束后,进入.ssh目录,你会看到公钥和私钥文件;

    $ cd ~/.ssh 
    $ ls  
    id_rsa   id_rsa.pub  

    其中id_rsa就是私钥,id_rsa.pub就是公钥,现在我们需要把各个节点上的公钥都集中发送到一个节点上,来制作授权文件(authorized_keys).

    注意:在两台机器必须安装ssh(sudo apt-get install ssh openssh-server)而且必须设置root密码(sudo passwd root),才能远程登录

    $ scp ~/.ssh/id_rsa.pub node1:~/.ssh/1.pub

    在将 node2 的公钥文件拷贝到 node1 后,在node1-ubuntu进行如下处理,制作好文件  authorized_keys

    $ cp ~/.ssh/id_rsa.pub authorized_keys  
    $ cat ~/.ssh/1.pub >> authorized_keys  

    在node1 上制作好的authorized_keys拷贝到node2上:(node1使用scp)

    $ scp ~/.ssh/authorized_keys node2:~/.ssh/

    要想让这两台机器无密码登录,所以我们需要更改一下必要的文件的权限(所有节点都要更改):其实只要保证authorized_keys的文件权限为600或者644

    $ chmod 755 ~  
    $ chmod 755 ~/.ssh  
    $ chmod 600 ~/.ssh/authorized_keys  
    $ chmod 600 ~/.ssh/id_rsa  
    $ chmod 644 ~/.ssh/id_rsa.pub  

    至此,SSH配置就完成了。下面检验一下:

    在一个主机上面SSH另一个主机 ( 不需要账号和密码 ) :

    $ ssh node1

    现在2台机器已经可以自由的SSH登陆了!

    2. MPI运行环境配置

    执行了configure命令之后,

    ./configure --prefix=/home/<USERNAME>/openmpi  2>&1 | tee install1.log  

    提示:

    Open MPI configuration:
    -----------------------
    Version: 3.0.1
    Build MPI C bindings: yes
    Build MPI C++ bindings (deprecated): no
    Build MPI Fortran bindings: no
    MPI Build Java bindings (experimental): no
    Build Open SHMEM support: yes
    Debug build: no
    Platform file: (none)
    
    Miscellaneous
    -----------------------
    CUDA support: no
    
    Transports
    -----------------------
    Cray uGNI (Gemini/Aries): no
    Intel Omnipath (PSM2): no
    Intel SCIF: no
    Intel TrueScale (PSM): no
    Mellanox MXM: no
    Open UCX: no
    OpenFabrics Libfabric: no
    OpenFabrics Verbs: no
    Portals4: no
    Shared memory/copy in+copy out: yes
    Shared memory/Linux CMA: yes
    Shared memory/Linux KNEM: no
    Shared memory/XPMEM: no
    TCP: yes
    
    Resource Managers
    -----------------------
    Cray Alps: no
    Grid Engine: no
    LSF: no
    Moab: no
    Slurm: yes
    ssh/rsh: yes
    Torque: no

    这里可以看到我们支持的通信协议和资源管理器支持只ssh

    编译和安装的命令:

    make all 2>&1 | tee make.log  
    make install 2>&1 | tee install2.log  

    出来一堆乱七八糟的,没眼看,然后找到安装目录下的  bin, 里面有很多编译器和可执行程序:

    使用 mpicc 编译出可执行程序, 再使用 mpirun 去运行,就可以看到对应的输出。

     正常运行后,这步骤就完成了!

    3. 并行运行:

    用vim编辑一个文件命名为hosts:如果你想在一个节点上运行多个进程,那么hostfile 可以使用 "slots" 属性。如果没有指定"slots",那么将假设其数目为1.

    node1
    node2

    或者

    node1-ubuntu    slots=4
    node2-ubuntu    slots=2

    让两个节点并行运行例子程序,如下所示:

    $ mpiexec -hostfile hosts -np 8 ./Test

    如果运行正常,就会在运行该命令的机器上有一些显示,如果host列表中的机器的  相同路径下 没有这个文件的话,会报错:

    $  ~/OpenMpi/bin/mpiexec -hostfile hosts -np 2  ~/TestA
    --------------------------------------------------------------------------
    mpiexec was unable to launch the specified application as it could not access
    or execute an executable:
    
    Executable: /home/xxxxx/TestA
    Node: localhost
    
    while attempting to start process rank 0.
    --------------------------------------------------------------------------

    就是:

    1. 多台主机下 相同路径 下的 可执行程序命名相同

    2. 开启进程数不要太多,以免超出上限,可参考   OpenMPI运行问题:enough slots available in the system

    接下来,我发现,2台机器上的每个进程,但是 printf 输出的信息都只在一台机器上,这是为什么呢?——按照每台机器分别运行一个进程的话,应该打印在自身的控制台上才对呀? 

    后来通过测试,发现标准输出确实是只打印在运行命令的那台机器的控制台上。

    而且只要可执行程序名称相同就可以,源代码是可以不一样的。(当然,最好还是一样啦,我这里弄成不一样是为了测试确实在2台机器上跑了)

    机器一执行程序A: 输出固定数字  11

    机器二执行程序B(生成源代码仅仅只有一个 printf 语句是不同的): 输出固定数字 22

    给机器一划分一个进程,机器二也是一个进程,果然每次会输出11,22 或者 22,11 ——说明确实在2台机器上分别跑了。

    也就是说,我们这个 MPI 集群其实已经搭建好了,接下来更深入的机理我后续会尽力去理清楚。

  • 相关阅读:
    LeetCode 139. Word Break
    Amazon behavior question
    学习笔记之100 TOP Ikm C++ Online Test Questions
    学习笔记之IKM C++ 11
    学习笔记之C/C++指针使用常见的坑
    LeetCode 208. Implement Trie (Prefix Tree)
    队列 & 栈//岛屿的个数
    队列 & 栈//设计循环队列
    队列 & 栈//设计循环队列
    查找表类算法//存在重复元素 III
  • 原文地址:https://www.cnblogs.com/HelloGreen/p/8779055.html
Copyright © 2011-2022 走看看