如题:

最近在看MPI方面的东西,主要是Python下的MPI4PY,学校有超算机房可以使用MPI,但是需要申请什么的比较麻烦,目的也本就是为了学习一下,所以就想着在自己的电脑上先配置一下。

现有硬件:两台装有Ubuntu18.04的操作系统(下面简称A电脑,B电脑)

A电脑: 24物理核心(48逻辑核心)

B电脑:6物理核心(12逻辑核心)

网络:

A、B电脑之间使用100M以太网交换机连接(就是TP-Link路由器)。

A、B电脑上都装有docker并且有多个物理网卡,因此各个电脑的网络情况比较复杂,具体:

A电脑网络配置:

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:78:17:6c:07 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp7s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.105.219.170 netmask 255.255.0.0 broadcast 10.105.255.255
inet6 2001:da8:a800:af00:2e4d:54ff:fe44:a14b prefixlen 64 scopeid 0x0<global>
inet6 fe80::2e4d:54ff:fe44:a14b prefixlen 64 scopeid 0x20<link>
ether 2c:4d:54:44:a1:4b txqueuelen 1000 (Ethernet)
RX packets 2892225 bytes 321651342 (321.6 MB)
RX errors 0 dropped 3 overruns 0 frame 0
TX packets 251303 bytes 155089869 (155.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xc6400000-c647ffff enp8s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.66 netmask 255.255.255.0 broadcast 192.168.11.255
inet6 fe80::2e4d:54ff:fe44:a14c prefixlen 64 scopeid 0x20<link>
inet6 2001:da8:a800:af00:2e4d:54ff:fe44:a14c prefixlen 64 scopeid 0x0<global>
ether 2c:4d:54:44:a1:4c txqueuelen 1000 (Ethernet)
RX packets 3260138 bytes 1003925411 (1.0 GB)
RX errors 66178 dropped 3 overruns 0 frame 53701
TX packets 319204 bytes 22576077 (22.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xc6300000-c637ffff lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 42491 bytes 26674547 (26.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 42491 bytes 26674547 (26.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

B电脑:

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:b9:51:8d:33 txqueuelen 0 (以太网)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.105.246.82 netmask 255.255.0.0 broadcast 10.105.255.255
inet6 2001:da8:a800:af00:645d:7de8:7fe8:99e9 prefixlen 64 scopeid 0x0<global>
inet6 2001:da8:a800:af00:61f7:413d:2daf:e00a prefixlen 64 scopeid 0x0<global>
inet6 fe80::4ed5:7f18:afc3:59e4 prefixlen 64 scopeid 0x20<link>
ether 94:c6:91:7e:20:24 txqueuelen 1000 (以太网)
RX packets 2824242 bytes 259143858 (259.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 62606 bytes 48094535 (48.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enx000ec6c08c64: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.206 netmask 255.255.255.0 broadcast 192.168.11.255
inet6 fe80::a036:3b28:aad9:62ac prefixlen 64 scopeid 0x20<link>
inet6 2001:da8:a800:af00:531e:f6f1:a573:9dbc prefixlen 64 scopeid 0x0<global>
inet6 2001:da8:a800:af00:a15e:c952:ce3e:f155 prefixlen 64 scopeid 0x0<global>
ether 00:0e:c6:c0:8c:64 txqueuelen 1000 (以太网)
RX packets 3089507 bytes 227967288 (227.9 MB)
RX errors 0 dropped 2977 overruns 0 frame 0
TX packets 549163 bytes 822545241 (822.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (本地环回)
RX packets 45005 bytes 13777274 (13.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45005 bytes 13777274 (13.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

其中,A、B电脑的各自两个网卡均处在两个局域网中,即:192.168.11.0/24   ,     10.105.0.0/24  。

在子网:192.168.11.0/24  中,

A电脑网卡:enp8s0    ,   B电脑网卡:enx000ec6c08c64

在子网:10.105.0.0/24  中,

A电脑网卡:enp7s0    ,   B电脑网卡:enp5s0

为举例说明,使用下面的MPI4PY代码:

from mpi4py import MPI
import numpy as np comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank() sendbuf = np.zeros(100*10000, dtype='i') + rank
recvbuf = None
if rank == 0:
recvbuf = np.empty([size, 100*10000], dtype='i') print( MPI.Get_processor_name() ) import time
a = time.time()
for _ in range(1):
comm.Gather(sendbuf, recvbuf, root=0)
b = time.time()
if rank == 0:
print(b-a)

代码意思比较简单,不进行信息pickle和unpickle情况下做个信息收集gather操作。

本文前提假设已经安装好了openmpi及mpi4py,单机环境已经配置好。A、B两电脑之间免密码ssh登录也已经配置好,本文不对此进行介绍。

说明:

本文只是学习目的,没有实际生成价值意义,毕竟分布式mpi大家都是用几千上万的infiband网络连接,而不会使用3元、5元一米网线的以太网TCP连接。

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

最初的运行方式:

mpiexec -np 8   -host 192.168.11.66:4   -host 192.168.11.206:4   python x.py

报错:

WARNING: Open MPI accepted a TCP connection from what appears to be a
another Open MPI process but cannot find a corresponding process
entry for that peer.

This attempted connection will be ignored; your MPI job may or may not
continue properly.

[[61134,1],0][btl_tcp_endpoint.c:626:mca_btl_tcp_endpoint_recv_connect_ack] received unexpected process identifier [[61134,1],2]
[[61134,1],0][btl_tcp_endpoint.c:626:mca_btl_tcp_endpoint_recv_connect_ack] received unexpected process identifier [[61134,1],1]

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

如上面运行的报错,引出了一个问题:多网卡系统下如何使用tcp协议实现MPI的分布式多机运行

如题所述,在单网卡的环境中多个电脑都配置好了openmpi,mpi4py等软件,而且在各个电脑上都有相同的用户,运行文件都存在相同的路径下,Python的运行路径也都相同,各个电脑之间也都配置好了免密登录,那么运行代码自然不会出现上述的问题,但是如果你的电脑上每个电脑都不是只有一个网卡呢,就像本文中每台电脑均有两个物理网卡并且均有一个虚拟网卡,这个情况下如果运行代码就会上面的错误。为什么多个电脑之间使用mpi,如果只有一个网卡就不报错,而电脑如果有超过一个网卡的话就会报错呢???

最终找到了答案,具体看下面的相关讨论:

相关讨论:

https://www.javaroad.cn/questions/122550

相关资料:

https://blog.csdn.net/ljhandlwt/category_6317687.html

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

从上面的讨论可以知道使用mpi的时候如果不设置主机之间通信使用的具体网卡或网段,mpi会对所有网卡均进行通信尝试,从而造成错误。

那么使用mpi在多机分布式使用tcp协议的时候如果主机有多个网卡该如何设置呢???下面给出几种解决方法:

1.  运行时通过设置参数指定运行的网段

设置参数:  --mca btl_tcp_if_include 192.168.11.0/24

上文可以知道网络中的主机A、B之间其实是存在两个局域网互联的,网段分别为:192.168.11.0/24,10.105.0.0/16

如果不指定具体使用的网段那么A、B主机会对这两个网段均进行通信尝试,这时可能会出现A主机在网段192.168.11.0/24上对B通信,而此时B在网段10.105.0.0/16上工作,从而导致报错。设定工作的具体网段后A、B主机均会使用该网段通信,从而避免了上述的错误。

这里我们的具体运行命令为:

mpirun --mca btl_tcp_if_include 192.168.11.0/24 -np 8 -host 192.168.11.66:4 -host 192.168.11.206:4   /home/xxxxxx/anaconda3/bin/python x.py

2.  通过mpi配置文件指定工作的具体网卡:

在当前linux用户的home文件夹下建立 .openmpi 文件夹,并在~/.openmpi 文件夹下面建立openmpi配置文件 mca-params.conf 并为其编写配置:

~/.openmpi/mca-params.conf

分别在A、B两个主机上对应的配置文件上添加内容:

主机A 192.168.11.66 对应网卡enp8s0

btl_tcp_if_include=enp8s0

主机B 192.168.11.206 对应网卡 enx000ec6c08c64

btl_tcp_if_include=enx000ec6c08c64

此时执行运行命令:

mpirun -np 8 -host 192.168.11.66:4 -host 192.168.11.206:4   /home/xxxxxx/anaconda3/bin/python x.py

以上两种方法均可解决mpi在多机分布式使用tcp协议的多网卡主机通信报错问题。

多网卡系统下如何使用tcp协议实现MPI的分布式多机运行(mpi的实现使用openmpi)的更多相关文章

  1. 什么情况下适合用UDP协议,什么情况下适合用TCP协议?

    总的来说 TCP协议提供可靠的服务, UDP协议提供高效率的服务. 高可靠性的TCP服务提供面向连接的服务,主要用于一次传输大量报文的情形, 如文件传输,远程登录等: 高效率的UDP协议提供无连接的数 ...

  2. 单纯linux系统下hadoop2.7.3 eclipse,记一次成功的运行wordcount的注意事项

    hadoop要正确安装好 hadoop eclipse plugin要对应相应的eclipse版本 define hadoop location mr master:9000 另一个9001  下面的 ...

  3. 在dedecms系统下, 改写火车头的入库接口 写一个接口文件运行一次自动读取 http://news.163.com/rank/

    1:火车头入库接口里面的密码与login.php传过来的密码是保持一致的: 2:在(!$ispost)里面编写一个form表单提交,验证用户名,channelid,以及typeid; html代码格式 ...

  4. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/108 来源:腾云阁 https://www.qclo ...

  5. 浅析TCP协议---转载

    https://cloud.tencent.com/developer/article/1150971 前言 说到TCP协议,相信大家都比较熟悉了,对于TCP协议总能说个一二三来,但是TCP协议又是一 ...

  6. 为什么 TCP 协议有粘包问题

    为什么 TCP 协议有粘包问题 这部分转载自draveness博客. TCP/IP 协议簇建立了互联网中通信协议的概念模型,该协议簇中的两个主要协议就是 TCP 和 IP 协议.TCP/ IP 协议簇 ...

  7. window系统下如何查看so库的信息

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10458388.html  linux系统下能够直接用命令行查看so库的信息,但是window系统下咋办好 ...

  8. 多网卡下对ServerSocket以TCP协议绑定IP和端口的测试

    一.引言:之前开发TCP协议的程序(C#里是Socket为主)都是基于主机上只有一个IP的,后来项目里涉及到了主机需要同时连接内外和外网的情况,在该主机上部署着一套WCS系统和一套WMS系统:WCS系 ...

  9. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...

  10. Linux下tcp协议socket的recv函数返回时机分析(粘包)

    http://www.vckbase.com/index.php/wv/10http://blog.csdn.net/zlzlei/article/details/7689409 文章一: 当前在网络 ...

随机推荐

  1. 《Android开发卷——实时监听文本框输入》

       在实际开发中,有时候会让用户发布一些类似微博.说说的东西,但是这个是有限制长度的,除了在文本输入框限制长度外,还要在旁边有一条提示还能输入多少个字的"友好提示". 1.文本框 ...

  2. Spring扩展———自定义bean组件注解

    引言 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和 Javadoc 不同,Java ...

  3. spring与设计模式之一工厂模式

    大家都说要多阅读spring的代码,这非常在理,毕竟spring的代码是许许多多杰出工程师的结晶,是业界多年的累积. 最近也不是非常忙,所以准备记录一系列的相关代码. 工厂模式是所有人都会的模式,是最 ...

  4. 关于kubesphere集群calico网络组件报错的修复

    最近公司的项目用到了Kubesphere,于是自己先在虚拟机上测试了一番,遇到了很多的问题,现将遇到的有关calico的问题记录一下 上一篇介绍了如何离线安装kubesphere v3.0,安装之后我 ...

  5. 国芯新作 | 四核Cortex-A53@1.4GHz,仅168元起?含税?哇!!!

        获取更多T507全国产平台资料可在评论区留言或关注官方公众号~

  6. QEMU + Vscode + Arm Arch's Linux调试小记

    QEMU + Vscode + Arm Arch's Linux调试小记 ​ 前几天看到了一篇讲授如何调试ARM Linux内核的文章,这里现在记录一下调试ARM Linux内核的办法 下载QEMU ...

  7. 通过Docker搭建Debezium同步MySQL的数据变化

    Debezium是红帽开发的一款CDC产品,和阿里的Canel类似,都是同步binlog,不过强大了一点点.为了不再麻烦,下面称之为dbz. 达拉崩吧斑得贝迪卜多比鲁翁... dbz的搭建依赖很多中间 ...

  8. javascript的内存(垃圾)回收机制?

    垃圾回收机制 1.js中的内存回收 在js中,垃圾回收器每隔一段时间就会找出那些不再使用的数据,并释放其所占用的内存空间. 以全局变量和局部变量来说,函数中的局部变量在函数执行结束后这些变量已经不再被 ...

  9. 转载 | win11右键菜单改为win10的bat命令(以及恢复方法bat)

    原文来自这里:https://blog.51cto.com/knifeedge/5340751 版权归:IT利刃出鞘 本质上就是写入注册表. 一.右键菜单改回Win10(展开) 1. 新建文件:win ...

  10. LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021

    论文提出了用于快速图像分类推理的混合神经网络LeVIT,在不同的硬件平台上进行不同的效率衡量标准的测试.总体而言,LeViT在速度/准确性权衡方面明显优于现有的卷积神经网络和ViT,比如在80%的Im ...