Oracle Roving Edge Infrastructure 是一個堅固耐用的雲端運算和儲存平台,適合在網路邊緣部署,或在有限或沒有外部連線的位置部署。隨著更大、更複雜且高要求的負載移轉至網路邊緣,這可能會對邊緣基礎架構帶來挑戰。
開放 MPI
是「訊息傳送介面 (MPI)」標準的實作,用於在高效能運算 (HPC) 中開發平行應用程式。開放式 MPI 可用於在相對較小的基礎架構中部署高效能運算和高平行工作負載,然後以較大、聚總的一組資源方式運作。此方法可用來將工作負載分配給 CPU 和其他運算資源 (例如 GPU),以便在網路邊緣部署大型、運算密集的工作,例如預測模型或其他人工智慧 / 機器學習 (AI/ML) 工作。
開放式 MPI 可用來在 Oracle Roving Edge Infrastructure 節點上利用資源部署平行工作負載。Netfilter 使用跨 Oracle Roving Edge Infrastructure 節點代管的叢集軟體,為 VM 執行處理提供必要的目的地網路位址轉譯 (DNAT) 和來源網路位址轉譯 (SNAT)。本教學課程在 Oracle Roving Edge Infrastructure 上使用 Netfilter 實作 Open MPI,以執行質數計算器來示範使用平行資源時的效能提升。
開啟的 MPI 可在單一 Oracle Roving Edge Infrastructure 節點內或多個 Oracle Roving Edge Infrastructure 節點間跨多個虛擬機器 (VM) 執行處理執行。在單一 Oracle Roving Edge Infrastructure 節點上執行是無縫接軌的,不會造成任何問題。跨多個 Oracle Roving Edge Infrastructure 節點執行時,請務必瞭解 Oracle Roving Edge Infrastructure VM 執行處理的網路,以及 Open MPI 如何遞送流量以避免可能發生的問題。
Oracle Roving Edge Infrastructure 虛擬機器執行處理上的網路
在 Oracle Roving Edge Infrastructure 上執行的虛擬機器執行處理會使用專用 IP 位址,與相同節點上代管之相同子網路上的其他 VM 執行處理進行通訊。您可以將公用 IP 位址指定給 Oracle Roving Edge Infrastructure 上代管的 VM 執行處理,以允許執行處理與其代管之 Oracle Roving Edge Infrastructure 節點外部執行的其他子網路和資源進行通訊。
注意:
公用 IP 位址會從公用 IP 位址集區指派給 VM 執行處理 VNIC。這些位址稱為
公用 IP
時,實際上是 Oracle Roving Edge Infrastructure 節點透過其 RJ-45 連接埠連線之相同區域網路上的 IP 位址。這些位址可以是可從網際網路連線的 IPv4 位址,也可以是區域網路之專用子網路上的位址。這些位址也稱為外部 IP 位址,因為它們可以連線到代管 VM 執行處理之節點外部的資源。
請務必瞭解在 Oracle Roving Edge Infrastructure 節點內執行的 VM 執行處理何時嘗試存取節點外部的資源,流量會通過外部 IP 位址 (在節點內路由並輸出至外部網路連線)。
VM 所使用的專用 IP 位址是由代管 Oracle Roving Edge Infrastructure 節點轉譯為從公用 IP 位址集區指派的公用 (外部) IP 位址。
網路流量會從代管 Oracle Roving Edge Infrastructure 節點上的 VM 執行處理傳輸至外部網路,這實際上是 1:1 網路位址轉譯 (NAT)。
VM 執行處理有公用 (外部) IP 位址,但 VM 執行處理本身絕不會看到該 IP 位址。
另一方面,使用其指定之公用 (外部) IP 位址的 VM 執行處理外部流量會移至代管的 Oracle Roving Edge Infrastructure 節點,此節點會將公用 (外部) IP 位址轉譯為目的地 VM 執行處理的關聯專用 IP 位址。
下列影像顯示 Oracle Roving Edge Infrastructure 節點上的 VM 執行處理範例,注意指定的公用 IP 位址和專用 IP 位址。
在多個 Oracle Roving Edge Infrastructure 節點執行開啟 MPI 時所面臨的挑戰
若透過多個 Oracle Roving Edge Infrastructure 節點實作使用 VM 執行處理專用 IP 位址,叢集軟體 (例如 Open MPI) 會有問題。每個節點都無法察覺公用 IP 位址對應,以及轉譯其他節點上代管之 VM 執行處理的對應。由於未共用對應,因此使用專用 IP 位址的封包路由不正確或遺失。
叢集軟體通常會檢查 VM 執行處理介面和 IP 位址,並將資訊註冊到軟體叢集中的其他節點。
VM 執行處理只會知道其專用 IP 位址,無法共用其指定的公用 IP 位址。
代管其他叢集成員的遠端 Oracle Roving Edge Infrastructure 節點也無法將非代管的 VM 執行處理專用 IP 位址轉譯為其個別的公用 IP 位址。
叢集化由不同 Oracle Roving Edge Infrastructure 節點代管的 VM 執行處理時,其公用 IP 位址的組態交換只能包含其專用 IP 位址。
如果這些 VM 執行處理嘗試透過跨 Oracle Roving Edge Infrastructure 節點的專用 IP 位址進行通訊,則會將流量推送至外部網路,並可能被外部網路捨棄或路由不正確。
外部網路不知道如何處理
10.0.200.12
,或者可以在其他地方遞送,而不是在其他 Oracle Roving Edge Infrastructure 節點上代管的預期目的地 VM 執行處理。這是開啟的 MPI 通訊封包遺失的方式。
請記住,在 Oracle Roving Edge Infrastructure 節點上代管的虛擬實例 IP 上,
10.0.200.12
是專用的,外部網路不知道如何將專用 IP 位址對應回 VM 實例。
外部網路只知道將導向目的地 Oracle Roving Edge Infrastructure 節點的
10.123.123.99
(
vm-node-2
的公用 IP),然後會轉譯位址並將流量傳送至正確的 VM 執行處理。
在 Oracle Roving Edge Infrastructure 導入開放式 MPI
為了因應 Oracle Roving Edge Infrastructure 內部網路的非共用性質,Linux VM 執行處理上的
Netfilter
軟體可用來重寫來自其他 Oracle Roving Edge Infrastructure 節點上代管之 VM 的網路封包,並銷毀這些封包。
在本教學課程中,會使用三個 Oracle Roving Edge Infrastructure Roving Edge Devices (RED) 節點來建立 Open MPI 叢集。所有 RED 都會連線至共用的外部網路。每個節點都已設定自己的外部 IP 集區,以配置給 VM 執行處理。
RED 的外部網路仍然是 RFC1918 中的專用網路。
每個 RED 都會設定一個 VCN。在此使用案例中,VCN 使用
10.0.0.0/16
的 CIDR。
每個 RED 在將使用的子網路中都會有不同的 CIDR。使用不同的子網路 CIDR 可簡化設定,並確保不會在不同 RED 上的 VM 之間發生 IP 衝突。
VCN 和子網路 CIDR 表格
存取一或多個 Oracle Roving Edge Infrastructure 節點 webUI,本教學課程中的範例使用 3 個 Oracle Roving Edge Infrastructure 裝置 (RED)。
Oracle Roving Edge Infrastructure 的使用者權限,可建立及啟動執行處理。如需詳細資訊,請參閱
Roving Edge Infrastructure 的運算權限
。
在每個 Oracle Roving Edge Infrastructure 節點上設定虛擬雲端網路 (VCN)。如需詳細資訊,請參閱
建立 Roving Edge Infrastructure 裝置的 VCN
。
在每個具有公用 IP 位址的 Oracle Roving Edge Infrastructure 節點上設定子網路。如需詳細資訊,請參閱
建立 Roving Edge Infrastructure 裝置的子網路
。
瞭解如何將自訂運算映像檔匯入 Oracle Roving Edge Infrastructure。如需詳細資訊,請參閱
管理 OCI Compute 中的自訂映像檔
和
將自訂映像檔從儲存桶匯入至 Roving Edge Infrastructure 裝置
。
設定在 Oracle Roving Edge Infrastructure 節點上執行的執行處理,並透過 SSH 存取這些節點,請參閱
建立 Roving Edge Infrastructure 裝置的執行處理
。
對 Oracle Linux 的基本瞭解,可透過 SSH 連線至執行處理、使用 IP 表格、服務、編輯檔案、執行 Shell 命令檔、變更目錄、安裝軟體、使用套裝程式儲存區域以及使用代理主機伺服器。
作業 1:建立虛擬機器執行處理
在每個 RED 的每個子網路中建立 VM 執行處理。
IP 位址指定範例:
在
redvm3
輸入
src 10.123.123.32 SNAT to src 10.0.1.2
輸入
src 10.123.123.67 SNAT to src 10.0.2.2
在
redvm1
。
sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
sudo netfilter-persistent save
在 redvm2
。
sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.101 -j SNAT --to-source 10.0.3.2
sudo netfilter-persistent save
在 redvm3
。
sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT -m comment --comment "Allow REDs public subnet access."
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.32 -j SNAT --to-source 10.0.1.2
sudo iptables -t nat -I INPUT -p tcp -s 10.123.123.67 -j SNAT --to-source 10.0.2.2
sudo netfilter-persistent save
在 redvm3
輸出 dst 10.0.1.2 DNAT to dst 10.123.123.32
輸出 dst 10.0.2.2 DNAT to dst 10.123.123.67
在 redvm1
。
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
sudo netfilter-persistent save
在 redvm2
。
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.3.2 -j DNAT --to-destination 10.123.123.101
sudo netfilter-persistent save
在 redvm3
。
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.1.2 -j DNAT --to-destination 10.123.123.32
sudo iptables -t nat -I OUTPUT -p tcp -d 10.0.2.2 -j DNAT --to-destination 10.123.123.67
sudo netfilter-persistent save
開啟的 MPI 將使用每個 VM 的專用 IP 位址,在每個開啟的 MPI VM 執行處理上,為每個 VM 執行處理和其專用 IP 位址建立 /etc/hosts
項目。
例如,使用 redvm1
上 /etc/hosts
項目上方的組態將包含下列項目:
127.0.0.1 localhost
127.0.1.1 redvm1 redvm1
10.0.2.2 redvm2
10.0.3.2 redvm3
在 redvm2
上,/etc/hosts
將包含下列項目:
127.0.0.1 localhost
127.0.1.1 redvm2 redvm2
10.0.1.2 redvm1
10.0.3.2 redvm3
在 redvm3
上,/etc/hosts
將包含下列項目:
127.0.0.1 localhost
127.0.1.1 redvm3 redvm3
10.0.1.2 redvm1
10.0.2.2 redvm2
我們也必須確保每個 VM 之間都有 SSH 等化,才能使用 Open MPI。
注意:此處的假設這些是未包含 Ubuntu 使用者現有 SSH 金鑰的新 VM。如果您使用的是已經建立 SSH 金鑰的舊版 VM,則必須遵循這些指示,這些指示可能會覆寫現有的金鑰並將您鎖定在 VM 上。
在 redvm1
上,建立新的公用或私密金鑰組 (如果您尚未建立金鑰)。使用類似 ssh-keygen -b 4096 -t rsa
的 ssh-keygen
指令 (接受預設值,請勿設定新金鑰的密碼)。這會產生 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
。
透過執行 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
或透過文字編輯器以手動方式複製,將新的公開金鑰新增至 authorized_keys
檔案。
將 id_rsa
和 id_rsa.pub
同時複製到 redvm2
和 redvm3
的 ubuntu
使用者 ~/.ssh
目錄。請確定將 id_rsa.pub
新增至 authorized_keys
,並在 redvm2
和 redvm3
上執行 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
。
完成此作業之後,請從每個 VM 連線至所有其他 VM (包括 VM 本身),以確保連線正常運作,而 SSH 可信任其他主機。
redvm1
上的 SSH 連線。
ubuntu@redvm1:~$ ssh redvm1 date
The authenticity of host 'redvm1 (127.0.1.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'redvm1' (ED25519) to the list of known hosts.
Fri Apr 5 04:28:57 UTC 2024
ubuntu@redvm1:~$
ubuntu@redvm1:~$ ssh redvm2 date
The authenticity of host 'redvm2 (10.0.2.2)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'redvm2' (ED25519) to the list of known hosts.
Wed Jan 31 04:29:11 UTC 2024
ubuntu@redvm1:~$
ubuntu@redvm1:~$ ssh redvm3 date
The authenticity of host 'redvm3 (10.0.3.2)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'redvm3' (ED25519) to the list of known hosts.
Wed Jan 31 04:29:19 UTC 2024
注意:在理想情況下,所有使用 Open MPI 的 VM 執行處理都會有共用儲存體位置。這可以是 NFS、GlusterFS、OCFS2 或任何數目的其他共用檔案系統解決方案。如果工作負載需要通用工作目錄或資料集,此功能特別重要。
此範例不需要共用檔案系統,只有一個位置具有測試二進位檔的通用名稱。在每個 VM 上,建立通用名稱位置 /mpitest
。
sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
如果使用共用檔案系統,共用檔案系統將會掛載至所有 VM 執行處理的這個位置。
建立 hostfile
以與 mpirun
搭配使用。如需詳細資訊,請參閱如何使用 -hostfile 選項來 mpirun?。
我們將建立兩個用於測試的 hostfiles
。在 redvm1
上,使用上面建立的常用名稱位置 /mpitest
,建立含有下列內容的檔案 /mpitest/mpihosts.txt
:
redvm1
redvm2
redvm3
使用下列內容建立 /mpitest/mpihosts_slots.txt
檔案:
redvm1 slots=1
redvm2 slots=1
redvm3 slots=1
注意:在本教學課程中,測試只會從 redvm1
執行,因此我們不需要將這些檔案複製到 redvm2
和 redvm3
。如果您也想要從其他 VM 執行工作,則必須將這些檔案複製到其他 VM 執行處理,或使用適當的共用檔案系統,例如 NFS。
作業 5:測試 VM 執行處理
分散式命令的簡單測試。
簡單測試就是在所有叢集成員上呼叫如 hostname
的命令。以下是 slots=1
(mpihosts_slots.txt
) 檔案在三個節點間執行的預期輸出。slots
指令會通知 mpirun
可配置給此節點的程序數目,而不是 mpirun
決定程序數目。
注意:如果您使用 CPU 以外的有限資源 (例如 GPU),而想要將處理作業限制在其他資源的數目,則可能需要指定 slots
。若未這麼做,可能會導致處理作業因無法配置其他資源而失敗。
ubuntu@redvm1:~$ cd /mpitest
ubuntu@redvm1:/mpitest$ cat mpihosts_slots.txt
redvm1 slots=1
redvm2 slots=1
redvm3 slots=1
ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts_slots.txt hostname
redvm1
redvm2
redvm3
執行相同的測試,但不指定 slots
(mpihosts.txt
) 檔案,mpirun
將會決定可用的 CPU,並在每個節點上執行 CPU hostname
命令的數目。這三個 VM 有 16 個 CPU,因此我們應該得到 3 x 16 個回應 (每個主機名稱的 16 個)。
ubuntu@redvm1:/mpitest$ cat mpihosts.txt
redvm1
redvm2
redvm3
ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt hostname | sort | uniq -c
16 redvm1
16 redvm2
16 redvm3
建立 Open MPI 測試二進位 。
為了對使用 Open MPI 的程式進行適當的測試,我們使用 John Burkardt 的質數計算器範例。這需要在 redvm1
上下載和編譯。如需詳細資訊,請參閱 Prime Number Calculator by John Burkardt 。
ubuntu@redvm1:~$ cd /mpitest
ubuntu@redvm1:/mpitest$ curl https://people.sc.fsu.edu/~jburkardt/c_src/prime_mpi/prime_mpi.c -o prime_mpi.c
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4699 100 4699 0 0 2990 0 0:00:01 0:00:01 --:--:-- 2991
ubuntu@redvm1:/mpitest$ mpicc prime_mpi.c -o prime_mpi
ubuntu@redvm1:/mpitest$ ls -l prime_mpi
-rwxrwxr-x 1 ubuntu ubuntu 16736 Apr 5 05:38 prime_mpi
由於未設定要測試的共用檔案系統,因此必須將 prime_mpi
二進位檔案複製到 redvm2
和 redvm3
(位於與 redvm1
相同的位置)。執行下列命令。
ubuntu@redvm1:/mpitest$ scp prime_mpi redvm2:/mpitest
prime_mpi 100% 16KB 27.4MB/s 00:00
ubuntu@redvm1:/mpitest$ scp prime_mpi redvm3:/mpitest
prime_mpi 100% 16KB 28.3MB/s 00:00
若要比較基準,請獨立執行 Open MPI 二進位。針對基準或比較,在不開啟 MPI 的情況下執行 prime_mpi
。
ubuntu@redvm1:/mpitest$ ./prime_mpi
31 January 2024 06:08:17 AM
PRIME_MPI
C/MPI version
An MPI example program to count the number of primes.
The number of processes is 1
N Pi Time
1 0 0.000003
2 1 0.000000
4 2 0.000000
8 4 0.000000
16 6 0.000000
32 11 0.000001
64 18 0.000002
128 31 0.000022
256 54 0.000019
512 97 0.000066
1024 172 0.000231
2048 309 0.000810
4096 564 0.002846
8192 1028 0.010093
16384 1900 0.037234
32768 3512 0.137078
65536 6542 0.515210
131072 12251 1.932970
262144 23000 7.243419
PRIME_MPI - Master process:
Normal end of execution.
31 January 2024 06:08:27 AM
注意:處理作業數目為 1,完成時間大約需要 10 秒。
使用 Open MPI 的分散式執行。使用 mpihosts.txt
檔案,在三個 VM 執行處理上的所有可用 CPU 執行 prime_mpi
(含開啟 MPI)。