附註:

在 Oracle Roving Edge Infrastructure 上使用開放式 MPI

簡介

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 位址 (在節點內路由並輸出至外部網路連線)。

下列影像顯示 Oracle Roving Edge Infrastructure 節點上的 VM 執行處理範例,注意指定的公用 IP 位址和專用 IP 位址。

Oracle Roving Edge Infrastructure 節點上的 VM 執行處理範例

在多個 Oracle Roving Edge Infrastructure 節點執行開啟 MPI 時所面臨的挑戰

若透過多個 Oracle Roving Edge Infrastructure 節點實作使用 VM 執行處理專用 IP 位址,叢集軟體 (例如 Open MPI) 會有問題。每個節點都無法察覺公用 IP 位址對應,以及轉譯其他節點上代管之 VM 執行處理的對應。由於未共用對應,因此使用專用 IP 位址的封包路由不正確或遺失。

此問題如何使用 Open MPI 的範例:

在 VM 執行處理上執行的開啟 MPI 將會嘗試判斷用來連線其他 VM 執行處理成員的最佳網路路徑,軟體可能會檢查本機介面和 IP 位址,並向叢集中的其他節點註冊這些 IP 位址。

在 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 執行處理。

VCN 和子網路 CIDR 表格

RED 名稱 VCN CIDR 子網路 CIDR
RED1 10.0.0.0/16 10.0.1.0/24
RED2 10.0.0.0/16 10.0.2.0/24
RED3 10.0.0.0/16 10.0.3.0/24

此範例顯示於下列影像中,兩個來自兩個不同 RED 的網路配置。

"RED1" 上的 VCN 和子網路範例

"RED2" 上的 VCN 和子網路範例

適用對象

Oracle Roving Edge Infrastructure 管理員、開發人員和使用者。

目標

必要條件

作業 1:建立虛擬機器執行處理

在每個 RED 的每個子網路中建立 VM 執行處理。

IP 位址指定範例:

RED 名稱 VM 名稱 VM O/S VM 專用 IP VM 公用 IP
RED1 redvm1 Ubuntu 22.04 版 10.0.1.2/24 10.123.123.32
RED2 redvm2 Ubuntu 22.04 版 10.0.2.2/24 10.123.123.67
RED3 redvm3 Ubuntu 22.04 版 10.0.3.2/24 10.123.123.101

注意:此作業中的 VM 執行處理是使用使用 OCI Ubuntu 22.04 LTS 從 Oracle Cloud Infrastructure (OCI) 匯出的映像檔建立。任何具備適當 Open MPI 套裝軟體的 Linux 發行套件都可以使用,例如 Oracle Linux 8 或 9、Fedora 等等。

"RED3" 上的 VM 清單範例

  1. 在每個 RED 上,瀏覽至運算執行處理,然後按一下建立執行處理

  2. 建立運算執行處理中,輸入名稱,選取匯入的自訂映像檔資源配置設定網路SSH 金鑰,然後按一下建立

    在每個 RED 上建立運算映像檔

作業 2:在每個 VM 執行處理上安裝開啟的 MPI 套裝程式

建立所有 VM 執行處理之後,請以佈建期間提供的金鑰,透過 SSH 登入每個 VM 執行處理。下列指令適用於 Ubuntu 22.04,如果您使用的是其他 Linux 發行套件,則可能需要改寫這些指示或包含額外的套裝軟體儲存庫。

  1. 執行下列指令來更新系統,然後重新啟動。

    sudo apt update && sudo apt upgrade -y
    

    這可能需要一些時間才能完成。完成之後,請重新啟動執行處理。

    sudo shutdown -r now
    
  2. 登入執行處理並安裝 Open MPI 套裝程式。

    注意:

    • 這會經歷相當少的相依性。

    • 只有在稍後編譯要測試的範例程式時,才需要使用 libopenmpi-dev 套裝軟體。如果您不想將 Open MPI 功能編譯到程式中,就不需要這個套裝軟體。

    sudo apt install openmpi-bin libopenmpi-dev -y
    

作業 3:設定目的地網路位址轉譯 (DNAT) 和來源網路位址轉譯 (SNAT)

  1. 檢視每個啟動的 VM 執行處理詳細資訊,並記下專用和隨機指定的公用 IP 位址。瀏覽至運算執行處理,然後按一下執行處理名稱以檢視詳細資訊。

    "RED3" 上的 VM 範例

  2. 建立 SNAT。

    • 如果表格中每個 VM 的 SNAT 規則對應,看起來應該如下:

      SNAT 由 RED1 提供 由 RED2 提供 由 RED3 提供
      redvm1 輸入 src 10.123.123.67 SNAT to src 10.0.2.2 輸入 src 10.123.123.101 SNAT to src 10.0.3.2
      redvm2 輸入 src 10.123.123.32 SNAT to src 10.0.1.2 輸入 src 10.123.123.101 SNAT to src 10.0.3.2
      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
    • 針對每個 VM 使用 iptables 指令。

      • 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
        

      注意:新增第一個規則 (sudo iptables -I INPUT --src 10.123.123.0/24 -j ACCEPT) 以允許 RED 用於公用 IP 的子網路存取。如果沒有這個 (或類似規則),接收的 RED 可能會捨棄從 RED 到 RED 的內送流量。在這些 VM 上,新規則會保存在 sudo netfilter-persistent save 中,但如果您使用不同的 Linux 發行套件,則此命令可能會是其他的。

  3. 建立 DNAT。

    • 同樣地,如果我們對應表格中每個 VM 的 DNAT 規則,則應該如下所示:

      DNAT 系列 移至 RED1 移至 RED2 移至 RED3
      redvm1 輸出 dst 10.0.2.2 DNAT to dst 10.123.123.67 輸出 dst 10.0.3.2 DNAT to dst 10.123.123.101
      redvm2 輸出 dst 10.0.1.2 DNAT to dst 10.123.123.32 輸出 dst 10.0.3.2 DNAT to dst 10.123.123.101
      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
    • 針對每個 VM 使用 iptables 指令。

      • 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
        

      注意:在 VM 執行處理上,新規則會與 sudo netfilter-persistent save 一起保存。

作業 4:設定未結 MPI

開啟 MPI 會使用 SSH 在叢集成員之間進行通訊,因此在執行工作之前,必須先處理一些事項。

  1. 開啟的 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
    
  2. 我們也必須確保每個 VM 之間都有 SSH 等化,才能使用 Open MPI。

    注意:此處的假設這些是未包含 Ubuntu 使用者現有 SSH 金鑰的新 VM。如果您使用的是已經建立 SSH 金鑰的舊版 VM,則必須遵循這些指示,這些指示可能會覆寫現有的金鑰並將您鎖定在 VM 上。

    1. redvm1 上,建立新的公用或私密金鑰組 (如果您尚未建立金鑰)。使用類似 ssh-keygen -b 4096 -t rsassh-keygen 指令 (接受預設值,請勿設定新金鑰的密碼)。這會產生 ~/.ssh/id_rsa~/.ssh/id_rsa.pub

    2. 透過執行 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 或透過文字編輯器以手動方式複製,將新的公開金鑰新增至 authorized_keys 檔案。

    3. id_rsaid_rsa.pub 同時複製到 redvm2redvm3ubuntu 使用者 ~/.ssh 目錄。請確定將 id_rsa.pub 新增至 authorized_keys,並在 redvm2redvm3 上執行 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

    4. 完成此作業之後,請從每個 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
        
    5. 重複上述 redvm2 連線至 redvm2redvm1redvm3 以及 redvm3 的步驟,以連線至 redvm3redvm1redvm2

  3. 為每個叢集成員建立通用儲存體位置。

    注意:在理想情況下,所有使用 Open MPI 的 VM 執行處理都會有共用儲存體位置。這可以是 NFS、GlusterFS、OCFS2 或任何數目的其他共用檔案系統解決方案。如果工作負載需要通用工作目錄或資料集,此功能特別重要。

    此範例不需要共用檔案系統,只有一個位置具有測試二進位檔的通用名稱。在每個 VM 上,建立通用名稱位置 /mpitest

    sudo mkdir /mpitest && sudo chown ubuntu:ubuntu /mpitest
    

    如果使用共用檔案系統,共用檔案系統將會掛載至所有 VM 執行處理的這個位置。

  4. 建立 hostfile 以與 mpirun 搭配使用。如需詳細資訊,請參閱如何使用 -hostfile 選項來 mpirun?

    1. 我們將建立兩個用於測試的 hostfiles。在 redvm1 上,使用上面建立的常用名稱位置 /mpitest,建立含有下列內容的檔案 /mpitest/mpihosts.txt

      redvm1
      redvm2
      redvm3
      
    2. 使用下列內容建立 /mpitest/mpihosts_slots.txt 檔案:

      redvm1 slots=1
      redvm2 slots=1
      redvm3 slots=1
      

注意:在本教學課程中,測試只會從 redvm1 執行,因此我們不需要將這些檔案複製到 redvm2redvm3。如果您也想要從其他 VM 執行工作,則必須將這些檔案複製到其他 VM 執行處理,或使用適當的共用檔案系統,例如 NFS。

作業 5:測試 VM 執行處理

  1. 分散式命令的簡單測試。

    • 簡單測試就是在所有叢集成員上呼叫如 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
      
  2. 建立 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 二進位檔案複製到 redvm2redvm3 (位於與 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
    
  3. 若要比較基準,請獨立執行 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 秒。

  4. 使用 Open MPI 的分散式執行。使用 mpihosts.txt 檔案,在三個 VM 執行處理上的所有可用 CPU 執行 prime_mpi (含開啟 MPI)。

    ubuntu@redvm1:/mpitest$ mpirun --hostfile mpihosts.txt ./prime_mpi
    31 January 2024 06:09:02 AM
    
    PRIME_MPI
      C/MPI version
    
      An MPI example program to count the number of primes.
      The number of processes is 48
    
            N        Pi          Time
    
            1         0        0.020740
            2         1        0.000428
            4         2        0.000331
            8         4        0.000392
            16         6        0.000269
            32        11        0.000295
            64        18        0.000374
          128        31        0.000390
          256        54        0.000380
          512        97        0.000331
          1024       172        0.000351
          2048       309        0.000385
          4096       564        0.000740
          8192      1028        0.001931
        16384      1900        0.006316
        32768      3512        0.021577
        65536      6542        0.078834
        131072     12251        0.273368
        262144     23000        0.808825
    
    PRIME_MPI - Master process:
      Normal end of execution.
    
    31 January 2024 06:09:03 AM
    

    使用 48 個處理,執行時間大約需要 1 秒。

    執行相同的範例來探索 Open MPI,但使用 mpihosts_slots.txt 檔案。與獨立執行 prime_mpi 相較之下,您應該有所改善,但每個節點上只會使用 1 個處理器 (總計 3 個),而不是所有節點上的完整補數。藉由變更每個 VM 執行處理上的槽位數目,您可以控制工作的分配。

認可

其他學習資源

瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center