클러스터 헤드 노드에서 linpack을 실행할 수 없습니다.

클러스터 헤드 노드에서 linpack을 실행할 수 없습니다.

나는 최근에 나만의 홈 클러스터(Raspberry Pi 4개)를 만들었습니다. 그런데 Linpack을 사용하여 4개 유닛을 모두 벤치마킹하려고 할 때 문제가 발생합니다.

노드 중 하나는 wlan0 인터페이스를 사용하여 인터넷과 로컬 Wi-Fi 네트워크에 연결하고 eth0을 사용하여 클러스터의 내부 LAN에 연결하는 rpislave1이라는 헤드 노드입니다.

다른 3개 노드는 rpislave2, rpislave3 및 rpislave4입니다. 각각은 헤드 노드인 rpislave1에 연결되어 있으며 rpislave1을 통해 인터넷에 액세스합니다. 단순화를 위해 3개 노드는 rpislave1에 연결된 플래시 드라이브에서 네트워크 부팅됩니다.

모든 장치에는 MAC 주소를 사용하여 dhcp를 통해 자체 IP 주소가 할당되었습니다.

헤드 노드의 /etc/hosts 파일입니다.

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1 cluster

192.168.50.1    rpislave1 cluster
192.168.50.11   rpislave2
192.168.50.12   rpislave3
192.168.50.13   rpislave4

모든 장치는 rpislave1에서 SSH를 통해 액세스할 수 있으며 비밀번호가 필요하지 않으며 rpislave1에 마운트된 썸 드라이브에 연결된 /sharezone에서 NFS 드라이브를 공유합니다.

나는 학습 경험에 매우 만족했으며 HPL 또는 linpack을 사용하여 rpislave1, rpislave2, rpislave3 및 rpislave4 클러스터의 전체 처리를 벤치마킹하기로 결정했습니다.https://www.netlib.org/benchmark/hpl/

헤드 노드인 rpislave1에 OpenMPI 설치를 시작했습니다.

자체 시계는 15GFlops로 작동합니다. 확실히 자랑할 만한 것은 아니지만 재미있습니다. 그런 다음 rpislave2에 linpack 및 openmpi를 계속 설정하고 나머지 장치(rpislave3 및 rpislave4) 등에 대해 독립적인 테스트를 수행했습니다.

그래서 rpislave1과 rpislave2라는 2개의 노드에서 실행해 보기로 결정했습니다.

이것이 제가 2개의 노드에 사용하고 있는 HPL.dat인데, 제가 사용하고 있는 HPL.dat에 문제가 있는 것 같지는 않습니다.

HPLinpack benchmark input file
Innovative Computing Laboratory, University of Tennessee
HPL.out      output file name (if any) 
6            device out (6=stdout,7=stderr,file)
1            # of problems sizes (N)
40704         Ns
1            # of NBs
192           NBs
0            PMAP process mapping (0=Row-,1=Column-major)
1            # of process grids (P x Q)
2            Ps
4            Qs
16.0         threshold
1            # of panel fact
2            PFACTs (0=left, 1=Crout, 2=Right)
1            # of recursive stopping criterium
4            NBMINs (>= 1)
1            # of panels in recursion
2            NDIVs
1            # of recursive panel fact.
1            RFACTs (0=left, 1=Crout, 2=Right)
1            # of broadcast
1            BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
1            # of lookahead depth
1            DEPTHs (>=0)
2            SWAP (0=bin-exch,1=long,2=mix)
64           swapping threshold
0            L1 in (0=transposed,1=no-transposed) form
0            U  in (0=transposed,1=no-transposed) form
1            Equilibration (0=no,1=yes)
8            memory alignment in double (> 0)
##### This line (no. 32) is ignored (it serves as a separator). ######
0                               Number of additional problem sizes for PTRANS
1200 10000 30000                values of N
0                               number of additional blocking sizes for PTRANS
40 9 8 13 13 20 16 32 64        values of NB

아니면 호스트 파일을 만들어서 사용해도 됩니다.

user@rpislave1:/sharezone/hpl $ cat host_file
rpislave1 slots=4
rpislave2 slots=4

이것은 내가 사용하는 명령입니다:

 time mpirun -hostfile host_file -np 8 /sharezone/xhpl/bin/xhpl

하지만 내가 얻는 결과는 다음과 같습니다.

user@rpislave1:/sharezone/hpl $ time mpirun -hostfile host_file -np 8 /sharezone/xhpl/bin/xhpl
================================================================================
HPLinpack 2.3  --  High-Performance Linpack benchmark  --   December 2, 2018
Written by A. Petitet and R. Clint Whaley,  Innovative Computing Laboratory, UTK
Modified by Piotr Luszczek, Innovative Computing Laboratory, UTK
Modified by Julien Langou, University of Colorado Denver
================================================================================

An explanation of the input/output parameters follows:
T/V    : Wall time / encoded variant.
N      : The order of the coefficient matrix A.
NB     : The partitioning blocking factor.
P      : The number of process rows.
Q      : The number of process columns.
Time   : Time in seconds to solve the linear system.
Gflops : Rate of execution for solving the linear system.

The following parameter values will be used:

N      :   40704
NB     :     192
PMAP   : Row-major process mapping
P      :       2
Q      :       4
PFACT  :   Right
NBMIN  :       4
NDIV   :       2
RFACT  :   Crout
BCAST  :  1ringM
DEPTH  :       1
SWAP   : Mix (threshold = 64)
L1     : transposed form
U      : transposed form
EQUIL  : yes
ALIGN  : 8 double precision words

--------------------------------------------------------------------------------

- The matrix A is randomly generated for each test.
- The following scaled residual check will be computed:
      ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
- The relative machine precision (eps) is taken to be               1.110223e-16
- Computational tests pass if scaled residuals are less than                16.0

--------------------------------------------------------------------------
Open MPI detected an inbound MPI TCP connection request from a peer
that appears to be part of this MPI job (i.e., it identified itself as
part of this Open MPI job), but it is from an IP address that is
unexpected.  This is highly unusual.

The inbound connection has been dropped, and the peer should simply
try again with a different IP interface (i.e., the job should
hopefully be able to continue).

  Local host:          rpislave2
  Local PID:           1574
  Peer hostname:       rpislave1 ([[58941,1],2])
  Source IP of socket: 192.168.50.1
  Known IPs of peer:
        169.254.131.47
--------------------------------------------------------------------------

이 문제의 원인이 무엇인지는 모르지만 rpislave2, rpislave3, rpislave4 또는 2의 조합에서 linpack 테스트를 실행하면 문제 없이 작동한다는 것을 알았습니다.

이로 인해 헤드 노드 rpislave1에서 실행할 수 없습니다.

며칠 동안 다양한 단계를 시도했는데 개방형 MPI가 로컬 Wi-Fi 네트워크에 연결하기 위해 헤드 노드의 wlan0에 액세스하고 있는 것 같아서 "--mca btl_tcp_if_exclude wlan0" 또는 다른 mca 옵션을 사용해 보았습니다. 아무 효과도 없습니다. Github 문제도 찾아봤지만 모두 수정된 것 같으니 최신 패치가 있어야 합니다. 이것은 내가 가지고 있는 openmpi 버전입니다.

user@rpislave1:/sharezone/hpl $ sudo apt install openmpi-bin openmpi-common libopenmpi3 libopenmpi-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
libopenmpi-dev is already the newest version (4.1.0-10).
libopenmpi3 is already the newest version (4.1.0-10).
openmpi-bin is already the newest version (4.1.0-10).
openmpi-common is already the newest version (4.1.0-10).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
user@rpislave1:/sharezone/hpl $

"Open MPI가 이 MPI 작업의 일부인 것으로 보이는 피어로부터의 인바운드 MPI TCP 연결 요청을 감지했습니다." 오류의 원인을 아는 사람이 있습니까? 나는 이것이 wlan0 인터페이스와 관련이 있다고 생각합니다.

 Known IPs of peer:
        169.254.131.47

Traceroute는 이 결과를 보여줍니다

user@rpislave1:/sharezone/hpl $ traceroute 169.254.131.47
traceroute to 169.254.131.47 (169.254.131.47), 30 hops max, 60 byte packets
 1  rpislave1.local (169.254.131.47)  0.192 ms  0.107 ms  0.096 ms
user@rpislave1:/sharezone/hpl $

이것은 rpislave1/head 노드의 ifconfig입니다.

user@rpislave1:/sharezone/hpl $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.50.1  netmask 255.255.255.0  broadcast 192.168.50.255
        inet6 fe80::d314:681c:2e82:d5bc  prefixlen 64  scopeid 0x20<link>
        ether d8:3a:dd:1d:92:15  txqueuelen 1000  (Ethernet)
        RX packets 962575  bytes 911745808 (869.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 590397  bytes 382892062 (365.1 MiB)
        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  (Local Loopback)
        RX packets 3831  bytes 488990 (477.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3831  bytes 488990 (477.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.101.15  netmask 255.255.255.0  broadcast 192.168.101.255
        inet6 2001:f40:950:b164:806e:1571:b836:23a4  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::1636:9990:bd05:dd05  prefixlen 64  scopeid 0x20<link>
        ether d8:3a:dd:1d:92:16  txqueuelen 1000  (Ethernet)
        RX packets 44632  bytes 12764596 (12.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 74151  bytes 13143926 (12.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

user@rpislave1:/sharezone/hpl $

이 문제를 해결하는 데 도움을 주시면 대단히 감사하겠습니다.

답변1

마침내 문제를 발견하고 해결했습니다.

나는 rpislave1 2개의 IP 주소(192.168.50.1(rpislave1에 설정한 DHCP 서버에서 온 것임)와 또 다른 169.254.131.47)에 eth0을 제공하고 있음을 발견했습니다. 이로 인해 Open MPI가 mpirun 주소 중에 엉망이 되었습니다. 문제는 - 프로세스가 무엇입니까? rpislave1은 모든 Raspberry Pi의 내부 네트워크(범위 192.168.50.0/24) 및 외부 세계에 대한 연결을 위한 DHCP 서버이므로 net.ipv4.ip_forward=1이고 iptables라고 생각했습니다. 아니요, 몇 가지 테스트를 수행했습니다. 전혀 효과가 없습니다.

그런 다음 라즈베리 파이가 동일한 네트워크 인터페이스에 2개의 IP 주소를 갖는 이유를 조사하고 dhcpcd.service를 찾았습니다.

user@rpislave1:/etc $ sudo systemctl status  dhcpcd.service
● dhcpcd.service - DHCP Client Daemon
     Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/dhcpcd.service.d
             └─wait.conf
     Active: active (running) since Fri 2023-07-28 16:22:45 +08; 16min ago
       Docs: man:dhcpcd(8)
    Process: 473 ExecStart=/usr/sbin/dhcpcd -w -q (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 8755)
        CPU: 685ms
     CGroup: /system.slice/dhcpcd.service
             ├─564 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0
             └─765 dhcpcd: [master] [ip4] [ip6]

Jul 28 16:22:42 rpislave1 dhcpcd[473]: eth0: probing for an IPv4LL address
Jul 28 16:22:45 rpislave1 dhcpcd[473]: forked to background, child pid 765
Jul 28 16:22:45 rpislave1 systemd[1]: Started DHCP Client Daemon.
Jul 28 16:22:45 rpislave1 dhcpcd[765]: wlan0: leased 192.168.101.15 for 259200 seconds
Jul 28 16:22:45 rpislave1 dhcpcd[765]: wlan0: adding route to 192.168.101.0/24
Jul 28 16:22:45 rpislave1 dhcpcd[765]: wlan0: adding default route via 192.168.101.1
Jul 28 16:22:47 rpislave1 dhcpcd[765]: eth0: using IPv4LL address 169.254.131.47
Jul 28 16:22:47 rpislave1 dhcpcd[765]: eth0: adding route to 169.254.0.0/16
Jul 28 16:22:50 rpislave1 dhcpcd[765]: eth0: offered 192.168.50.1 from 192.168.50.1
Jul 28 16:22:51 rpislave1 dhcpcd[765]: eth0: no IPv6 Routers available

DHCP 요청을 보내기 전에 IPv4LL을 할당한 서비스를 찾으세요(그런데 동일한 장치에 있습니다). 이 IPv4LL은 동일한 서버에서 실행되는 DHCP 서버로부터 IP 주소를 얻기 전에 IP 주소와 경로를 설정합니다. 그러나 169.254.0.0/16에 대한 경로는 제거되지 않는 것 같습니다(rpislave.local에 재사용되는 것으로 의심되지만 이는 내 목적과 관련이 없습니다).

dhcpcd.service를 살펴보면서 이 옵션을 찾았습니다.

Local Link configuration
If dhcpcd failed to obtain a lease, it probes for a valid IPv4LL address (aka ZeroConf, aka APIPA). Once obtained it restarts the process of looking for a DHCP server to get a proper address.

When using IPv4LL, dhcpcd nearly always succeeds and returns an exit code of 0. In the rare case it fails, it normally means that there is a reverse ARP proxy installed which always defeats IPv4LL probing. To disable this behaviour, you can use the -L, --noipv4ll option.

따라서 /etc/systemd/system/dhcpcd.service.d의 wait.conf 파일이 편집되었습니다. 이러한 모든 세부 정보는 위의 상태 코드에서 찾을 수 있습니다.

[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpcd -w -q --noipv4ll

재부팅하고 dhcpcd를 다시 확인하세요.

user@rpislave1:/etc/systemd/system/dhcpcd.service.d $ sudo systemctl status  dhcpcd.service
● dhcpcd.service - DHCP Client Daemon
     Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/dhcpcd.service.d
             └─wait.conf
     Active: active (running) since Fri 2023-07-28 16:44:15 +08; 3min 17s ago
       Docs: man:dhcpcd(8)
    Process: 472 ExecStart=/usr/sbin/dhcpcd -w -q --noipv4ll (code=exited, status=0/SUCCESS)
      Tasks: 2 (limit: 8755)
        CPU: 619ms
     CGroup: /system.slice/dhcpcd.service
             ├─568 wpa_supplicant -B -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0
             └─775 dhcpcd: [master] [ip4] [ip6]

Jul 28 16:44:10 rpislave1 dhcpcd[472]: wlan0: adding route to 2001:f40:950:b164::/64
Jul 28 16:44:10 rpislave1 dhcpcd[472]: wlan0: requesting DHCPv6 information
Jul 28 16:44:10 rpislave1 dhcpcd[472]: wlan0: adding default route via fe80::101
Jul 28 16:44:15 rpislave1 dhcpcd[472]: wlan0: leased 192.168.101.15 for 259200 seconds
Jul 28 16:44:15 rpislave1 dhcpcd[472]: wlan0: adding route to 192.168.101.0/24
Jul 28 16:44:15 rpislave1 dhcpcd[472]: wlan0: adding default route via 192.168.101.1
Jul 28 16:44:15 rpislave1 dhcpcd[472]: forked to background, child pid 775
Jul 28 16:44:15 rpislave1 systemd[1]: Started DHCP Client Daemon.
Jul 28 16:44:19 rpislave1 dhcpcd[775]: eth0: offered 192.168.50.1 from 192.168.50.1
Jul 28 16:44:21 rpislave1 dhcpcd[775]: eth0: no IPv6 Routers available
user@rpislave1:/etc/systemd/system/dhcpcd.service.d $

그리고 "eth0: IPv4LL 주소 169.254.131.47 사용" 경로가 전혀 설정되지 않았습니다.

그래서 전체 클러스터를 테스트하기 시작했습니다.

user@rpislave1:/sharezone/ClusterProcessing/HPL $  time mpirun -hostfile ../host_file -np 16 /sharezone/xhpl/bin/xhpl |tee HPL.log
================================================================================
HPLinpack 2.3  --  High-Performance Linpack benchmark  --   December 2, 2018
Written by A. Petitet and R. Clint Whaley,  Innovative Computing Laboratory, UTK
Modified by Piotr Luszczek, Innovative Computing Laboratory, UTK
Modified by Julien Langou, University of Colorado Denver
================================================================================

An explanation of the input/output parameters follows:
T/V    : Wall time / encoded variant.
N      : The order of the coefficient matrix A.
NB     : The partitioning blocking factor.
P      : The number of process rows.
Q      : The number of process columns.
Time   : Time in seconds to solve the linear system.
Gflops : Rate of execution for solving the linear system.

The following parameter values will be used:

N      :   57600
NB     :     192
PMAP   : Row-major process mapping
P      :       4
Q      :       4
PFACT  :   Right
NBMIN  :       4
NDIV   :       2
RFACT  :   Crout
BCAST  :  1ringM
DEPTH  :       1
SWAP   : Mix (threshold = 64)
L1     : transposed form
U      : transposed form
EQUIL  : yes
ALIGN  : 8 double precision words

--------------------------------------------------------------------------------

- The matrix A is randomly generated for each test.
- The following scaled residual check will be computed:
      ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
- The relative machine precision (eps) is taken to be               1.110223e-16
- Computational tests pass if scaled residuals are less than                16.0

================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR11C2R4       57600   192     4     4            2558.14             4.9804e+01
HPL_pdgesv() start time Fri Jul 28 16:55:04 2023

HPL_pdgesv() end time   Fri Jul 28 17:37:42 2023

--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   3.39874554e-03 ...... PASSED
================================================================================

Finished      1 tests with the following results:
              1 tests completed and passed residual checks,
              0 tests completed and failed residual checks,
              0 tests skipped because of illegal input values.
--------------------------------------------------------------------------------

End of Tests.
================================================================================
[rpislave4:00682] PMIX ERROR: NO-PERMISSIONS in file ../../../../../../src/mca/common/dstore/dstore_base.c at line 237
[rpislave3:00688] PMIX ERROR: NO-PERMISSIONS in file ../../../../../../src/mca/common/dstore/dstore_base.c at line 237
[rpislave2:00696] PMIX ERROR: NO-PERMISSIONS in file ../../../../../../src/mca/common/dstore/dstore_base.c at line 237

real    43m33.445s
user    141m36.616s
sys     28m21.561s
user@rpislave1:/sharezone/ClusterProcessing/HPL $

그리고 효과가 있어요~! 이제 헤드를 포함한 4개 유닛 모두에 대해 전체 벤치마크를 할 수 있게 되었습니다~!

관련 정보