注意:

在 Oracle Roving Edge Infrastructure 上使用开放 MPI

简介

Oracle Roving Edge Infrastructure 是一个加固的云计算和存储平台,适用于在网络边缘或外部连接有限或没有外部连接的位置部署。随着更大、更复杂和更苛刻的工作负载向网络边缘移动,这可能会给边缘基础设施带来挑战。

Open MPI 是消息传递接口 (Message Passing Interface,MPI) 标准的实现,用于在高性能计算 (High Performance Computing,HPC) 中开发并行应用程序。开放式 MPI 可用于在相对较小的基础设施中部署高性能计算和高度并行工作负载,然后作为较大的聚合资源集运行。此方法可用于将负载分配给 CPU 和其他计算资源(例如 GPU),这允许在网络边缘部署更大的计算密集型任务,例如预测建模或其他人工智能/机器学习 (Artificial Intelligence/Machine Learning,AI/ML) 任务。

Open MPI 可用于利用 Oracle Roving Edge Infrastructure 节点中的资源部署并行工作负载。Netfilter 使用托管在 Oracle Roving Edge Infrastructure 节点上的集群软件为 VM 实例提供必要的目标网络地址转换 (Destination Network Address Translation,DNAT) 和源网络地址转换 (Source Network Address Translation,SNAT)。本教程在运行素数计算器的 Oracle Roving Edge Infrastructure 上使用 Netfilter 实施 Open MPI,以演示在使用并行资源时性能的提高。

背景信息

Open 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 地址。这些地址可以是可从 Internet 访问的 IPv4 地址,也可以是本地网络上专用子网上的地址。这些地址也称为外部 IP 地址,因为它们可以连接到托管 VM 实例的节点外部的资源。

了解在 Oracle Roving Edge Infrastructure 节点中运行的 VM 实例何时尝试访问节点外部的资源,流量通过在节点内路由的外部 IP 地址并输出到外部网络连接,这一点非常重要。

下图显示了 Oracle Roving Edge Infrastructure 节点上的 VM 实例示例,请注意分配的公共和专用 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 地址,并将这些地址注册到集群中的其他节点。

在 Oracle Roving Edge Infrastructure 上实施开放式 MPI

为了解决 Oracle Roving Edge Infrastructure 内部网络的非共享性问题,Linux VM 实例上的 Netfilter 软件用于重写来自其他 Oracle Roving Edge Infrastructure 节点上托管的 VM 的网络数据包。

设计注意事项

在本教程中,三个 Oracle Roving Edge Infrastructure Roving Edge 设备 (RED) 节点用于创建开放 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 规则,应如下所示:

      信噪比 来自 RED1 来自 RED2 来自 RED3
      关于 redvm1 N/A 输入 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 N/A 输入 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 N/A
    • 对每个 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 N/A 输出 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 N/A 输出 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 N/A
    • 对每个 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

Open MPI 使用 SSH 在群集成员之间进行通信,因此,在我们运行作业之前,需要注意一些事项。

  1. Open MPI 将使用每个 VM 的专用 IP 地址,在每个 Open MPI VM 实例上为每个 VM 实例创建 /etc/hosts 条目及其专用 IP 地址。

    例如,使用 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 使用。

    注:此处的假设是,这些新 VM 不包含 Ubuntu 用户的现有 SSH 密钥。如果您使用已创建 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 一起使用。有关更多信息,请参见 How do I use the -hostfile option to 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 上使用 Open MPI 运行 prime_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 秒钟。

    通过运行相同的示例(但使用 mpihosts_slots.txt 文件)浏览 Open MPI。与单独运行 prime_mpi 相比,您应该看到有所改进,但它在每个节点上仅使用 1 个处理器(共 3 个),而不是在所有节点上使用完整补充。通过更改每个 VM 实例上的插槽数,您可以控制作业的分配。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心