开始使用 EFA 和 MPI 处理 Amazon EC2 上的 HPC 工作负载 - Amazon Elastic Compute Cloud

开始使用 EFA 和 MPI 处理 Amazon EC2 上的 HPC 工作负载

本教程可帮助您为 HPC 工作负载启动启用了 EFA 和 MPI 的实例集群。

步骤 1:准备启用 EFA 的安全组

EFA 需要使用一个安全组,以允许进出安全组本身的所有入站和出站流量。以下过程创建了一个安全组,该安全组允许所有进出其本身的入站和出站流量,并允许来自任何 IPv4 地址的入站 SSH 流量进行 SSH 连接。

重要

此安全组仅用于测试目的。对于您的生产环境,建议您创建入站 SSH 规则,该规则仅允许来自您连接的 IP 地址的流量,例如计算机的 IP 地址或本地网络中的一系列 IP 地址。

有关其他场景,请参阅 针对不同使用案例的安全组规则

创建启用 EFA 的安全组
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择 Security Groups (安全组),然后选择 Create Security Group (创建安全组)

  3. Create security group(创建安全组)窗口中,执行以下操作:

    1. 对于安全组名称,请输入一个描述性的安全组名称,例如 EFA-enabled security group

    2. (可选)对于描述,请输入安全组的简要描述。

    3. 对于 VPC,请选择要在其中启动启用了 EFA 的实例的 VPC。

    4. 选择创建安全组

  4. 选择您创建的安全组,然后在 Details(详细信息)选项卡上复制 Security group ID(安全组 ID)。

  5. 在安全组仍然选中的情况下,依次选择 Actions(操作)、Edit inbound rules(编辑入站规则),然后执行以下操作:

    1. 选择 Add rule

    2. 对于 Type (类型),请选择 All traffic (所有流量)

    3. 对于 Source type(源类型),请选择 Custom(自定义)并将您复制的安全组 ID 粘贴到该字段中。

    4. 选择 添加规则

    5. 对于 Type,选择 SSH

    6. 对于 Source type(源类型),请选择 Anywhere-IPv4

    7. 选择保存规则

  6. 在安全组仍然选中的情况下,依次选择 Actions(操作)、Edit outbound rules(编辑出站规则),然后执行以下操作:

    1. 选择 Add rule

    2. 对于 Type (类型),请选择 All traffic (所有流量)

    3. 对于 Destination type(目标类型),请选择 Custom(自定义)并将您复制的安全组 ID 粘贴到该字段中。

    4. 选择保存规则

步骤 2:启动临时实例

启动一个临时实例,可用于安装和配置 EFA 软件组件。您使用该实例创建一个启用了 EFA 的 AMI,您可以从中启动启用了 EFA 的实例。

启动临时实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Instances(实例),然后选择 Launch Instances(启动实例)以打开新的启动实例向导。

  3. 可选)在 Name and tags(名称和标签)部分中,提供实例的名称,例如 EFA-instance。名称作为资源标签(Name=EFA-instance)分配给实例。

  4. Application and OS Images(应用程序和操作系统映像)部分中,为其中一个支持的操作系统选择 AMI。

  5. Instance type(实例类型)部分中,选择 supported instance type(支持的实例类型)。

  6. Key pair(密钥对)部分中,选择要用于实例的密钥对。

  7. Network settings(网络设置)部分中,请选择 Edit(编辑),然后执行以下操作:

    1. 对于子网,选择要在其中启动实例的子网。如果您未选择子网,则不能启用 EFA 的实例。

    2. 对于 Firewall(security groups)(防火墙(安全组)),请选择 Select existing security group(选择现有安全组),然后选择您在上一步中创建的安全组。

    3. 展开高级网络配置部分。

      对于网络接口 1,选择网卡索引 = 0设备索引 = 0接口类型 = 带 ENA 的 EFA

      (可选)如果您使用的是多卡实例类型,例如 p4d.24xlargep5.48xlarge,则对于每个额外的网络接口,选择添加网络接口;对于网卡索引,选择下一个未使用的索引,然后选择设备索引 = 1接口类型 = 带 ENA 的 EFA仅限 EFA

  8. Storage(存储)部分中,根据需要配置卷。

  9. 在右侧的 Summary(摘要)面板中,选择 Launch instance(启动实例)。

注意

考虑要求临时实例以及您将在步骤 9 中创建的 AMI 使用 IMDSv2,除非您已将 IMDSv2 设置为账户的默认值。有关 IMDSv2 配置的更多信息,请参阅 为新实例配置实例元数据选项

步骤 3:安装 EFA 软件

在临时实例上安装支持 EFA 所需的启用 EFA 的内核、EFA 驱动程序、Libfabric 和 Open MPI 堆栈。

根据您打算将 EFA 与 Open MPI、与 Intel MPI 还是同时与这两者结合使用,这些步骤有所不同。

安装 EFA 软件
  1. 连接到您启动的实例。有关更多信息,请参阅 使用 SSH 连接到 Linux 实例

  2. 为确保您的所有软件包都处于最新状态,请对您的实例执行快速软件更新。此过程可能需要几分钟时间。

    • Amazon Linux 2023、Amazon Linux 2、RHEL 8/9、Rocky Linux 8/9

      $ sudo yum update -y
    • Ubuntu 和 Debian

      $ sudo apt-get update && sudo apt-get upgrade -y
    • SUSE Linux Enterprise

      $ sudo zypper update -y
  3. 重启实例并重新连接到它。

  4. 下载 EFA 软件安装文件。软件安装文件将打包为压缩的 tarball(.tar.gz)文件。要下载最新的稳定 版本,请使用以下命令。

    $ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz

    您也可以通过将上面命令中的版本号替换为 latest 来获取最新版本。

  5. 可选)验证 EFA tarball(.tar.gz)文件的真实性和完整性。

    建议您执行此操作以验证软件发布者的身份,并检查该文件自发布以来是否已被更改或损坏。如果您不想验证 tarball 文件,请跳过此步骤。

    注意

    或者,如果您希望使用 MD5 或 SHA256 校验和验证 tarball 文件,请参阅 使用校验和验证 EFA 安装程序

    1. 下载公有 GPG 密钥并将其导入到您的密钥环中。

      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key

      该命令应返回一个密钥值。请记下密钥值,因为需要在下一步中使用该值。

    2. 验证 GPG 密钥的指纹。运行以下命令并指定上一步中的密钥值。

      $ gpg --fingerprint key_value

      该命令应返回一个与 4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC 相同的指纹。如果指纹不匹配,请不要运行 EFA 安装脚本,并联系 AWS Support。

    3. 下载签名文件并验证 EFA tarball 文件的签名。

      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.37.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.37.0.tar.gz.sig

      下面显示了示例输出。

      gpg: Signature made Wed 29 Jul 2020 12:50:13 AM UTC using RSA key ID DD2D3CCC gpg: Good signature from "Amazon EC2 EFA <ec2-efa-maintainers@amazon.com>" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC

      如果结果包含 Good signature,并且指纹与上一步中返回的指纹相匹配,请继续下一步。如果没有,请不要运行 EFA 安装脚本,并联系 AWS Support。

  6. 从压缩的 .tar.gz 文件中提取文件,并导航到提取的目录。

    $ tar -xf aws-efa-installer-1.37.0.tar.gz && cd aws-efa-installer
  7. 安装 EFA 软件。根据您的使用案例执行以下某种操作。

    注意

    在 SUSE Linux 操作系统下,EFA 不支持 NVIDIA GPUDirect。如果使用的是 SUSE Linux 操作系统,则必须另外指定 --skip-kmod 选项来防止 kmod 安装。预设情况下,SUSE Linux 不允许树外的内核模块。

    Open MPI and Intel MPI

    如果打算将 EFA 同时与 Open MPI 和 Intel MPI 结合使用,则必须安装 EFA 软件及 Libfabric 和 Open MPI,并且必须完成步骤 5:安装 Intel MPI

    若要安装 EFA 软件以及 Libfabric 和 Open MPI,请运行以下命令。

    注意

    从 EFA 1.30.0 开始,默认情况下会同时安装 Open MPI 4 和 Open MPI 5。您也可以指定要安装的 Open MPI 版本。要仅安装 Open MPI 4,请指定 --mpi=openmpi4。要仅安装 Open MPI 5,请指定 --mpi=openmpi5。要同时安装两者,请忽略 --mpi 选项。

    $ sudo ./efa_installer.sh -y

    Libfabric 已安装到 /opt/amazon/efa。Open MPI 4 已安装到 /opt/amazon/openmpi。Open MPI 5 已安装到 /opt/amazon/openmpi5

    Open MPI only

    如果打算将 EFA 与 Open MPI 结合使用,则必须安装 EFA 软件及 Libfabric 和 Open MPI,并且可以跳过步骤 5:安装 Intel MPI。若要安装 EFA 软件以及 Libfabric 和 Open MPI,请运行以下命令。

    注意

    从 EFA 1.30.0 开始,默认情况下会同时安装 Open MPI 4 和 Open MPI 5。您也可以指定要安装的 Open MPI 版本。要仅安装 Open MPI 4,请指定 --mpi=openmpi4。要仅安装 Open MPI 5,请指定 --mpi=openmpi5。要同时安装两者,请忽略 --mpi 选项。

    $ sudo ./efa_installer.sh -y

    Libfabric 已安装到 /opt/amazon/efa。Open MPI 4 已安装到 /opt/amazon/openmpi。Open MPI 5 已安装到 /opt/amazon/openmpi5

    Intel MPI only

    如果您仅打算将 EFA 与 Intel MPI 结合使用,则可以安装 EFA 而不带 Libfabric 和 Open MPI。在这种情况下,Intel MPI 使用其嵌入式 Libfabric。如果选择执行此操作,则必须完成步骤 5:安装 Intel MPI

    若要在没有 Libfabric 和 Open MPI 的情况下安装 EFA 软件,请运行以下命令。

    $ sudo ./efa_installer.sh -y --minimal
  8. 如果 EFA 安装程序提示您重启实例,请执行此操作,然后重新连接到实例。否则,请注销实例,然后重新登录以完成安装。

步骤 4:(可选)启用 Open MPI 5

注意

仅在打算使用 Open MPI 5 时执行此步骤。

从 EFA 1.30.0 开始,默认情况下会同时安装 Open MPI 4 和 Open MPI 5。或者,可以选择仅安装 Open MPI 4 或 Open MPI 5。

如果在步骤 3:安装 EFA 软件中选择安装 Open MPI 5,并且打算使用该软件,则必须执行以下步骤才能将其启用。

启用 Open MPI 5
  1. 将 Open MPI 5 添加到 PATH 环境变量中。

    $ module load openmpi5
  2. 确认已启用 Open MPI 5 以供使用。

    $ which mpicc

    命令应返回 Open MPI 5 安装目录:/opt/amazon/openmpi5

  3. 可选)要确保每次启动实例时都将 Open MPI 5 添加到 PATH 环境变量中,请执行以下操作:

    bash shell

    module load openmpi5 添加到 /home/username/.bashrc/home/username/.bash_profile

    csh and tcsh shells

    module load openmpi5 添加到 /home/username/.cshrc

如果需要从 PATH 环境变量中删除 Open MPI 5,请运行以下命令,并从 Shell 启动脚本中删除该命令。

$ module unload openmpi5

步骤 5:(可选)安装 Intel MPI

重要

仅在您打算使用 Intel MPI 时执行此步骤。如果您仅打算使用 Open MPI,请跳过此步骤。

Intel MPI 需要使用额外的安装和环境变量配置。

先决条件

确保执行以下步骤的用户具有 sudo 权限。

安装 Intel MPI
  1. 要下载 Intel MPI 安装脚本,请执行以下操作

    1. 访问 Intel 网站

    2. 在网页的 Intel MPI Library 部分,选择 Intel MPI Library for Linux Offline 安装程序的链接。

  2. 运行您在上一个步骤中下载的安装脚本。

    $ sudo bash installation_script_name.sh
  3. 在安装程序中,选择 Accept & install(接受并安装)。

  4. 阅读 Intel 改进计划,选择适当的选项,然后选择 Begin Installation(开始安装)。

  5. 安装完成后,选择关闭

  6. 默认情况下,Intel MPI 使用其嵌入式(内部)Libfabric。您可以将 Intel MPI 配置为使用 EFA 安装程序附带的 Libfabric。通常,EFA 安装程序附带的 Libfabric 版本高于 Intel MPI。在某些情况下,EFA 安装程序附带的 Libfabric 比 Intel MPI 性能更强。要将 Intel MPI 配置为使用 EFA 安装程序附带的 Libfabric,请根据您的 Shell 执行以下操作之一。

    bash shells

    将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

    export I_MPI_OFI_LIBRARY_INTERNAL=0
    csh and tcsh shells

    将以下语句添加到 /home/username/.cshrc

    setenv I_MPI_OFI_LIBRARY_INTERNAL 0
  7. 将以下 source 命令添加到 Shell 脚本中,以从安装目录获取 vars.sh 脚本,以便在每次启动实例时设置编译器环境。根据您的 Shell 执行下列操作之一。

    bash shells

    将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

    source /opt/intel/oneapi/mpi/latest/env/vars.sh
    csh and tcsh shells

    将以下语句添加到 /home/username/.cshrc

    source /opt/intel/oneapi/mpi/latest/env/vars.csh
  8. 默认情况下,如果 EFA 因配置错误而不可用,Intel MPI 将默认为 TCP/IP 网络堆栈,这可能会导致应用程序性能下降。您可以通过将 I_MPI_OFI_PROVIDER 设置为 efa 来防止这种情况。如果 EFA 不可用,这将导致 Intel MPI 出现以下错误:

    Abort (XXXXXX) on node 0 (rank 0 in comm 0): Fatal error in PMPI_Init: OtherMPI error, MPIR_Init_thread (XXX)........: MPID_Init (XXXX)..............: MPIDI_OFI_mpi_init_hook (XXXX): open_fabric (XXXX)............: find_provider (XXXX)..........: OFI fi_getinfo() failed (ofi_init.c:2684:find_provider:

    根据您的 Shell 执行下列操作之一。

    bash shells

    将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

    export I_MPI_OFI_PROVIDER=efa
    csh and tcsh shells

    将以下语句添加到 /home/username/.cshrc

    setenv I_MPI_OFI_PROVIDER efa
  9. 默认情况下,Intel MPI 不会输出调试信息。您可以指定不同的详细程度来控制调试信息。可能的值(按提供的详细信息量排列)包括:0(默认值)、123451 级及以上将输出 libfabric versionlibfabric provider。使用 libfabric version 查看 Intel MPI 使用的是内部 Libfabric,还是 EFA 安装程序附带的 Libfabric。如果使用的是内部 Libfabric,则该版本的后缀为 impi。使用 libfabric provider 查看 Intel MPI 使用的是 EFA,还是 TCP/IP 网络。如果使用的是 EFA,则值为 efa。如果使用的是 TCP/IP,则值为 tcp;ofi_rxm

    要启用调试信息,请根据您的 Shell 执行以下操作之一。

    bash shells

    将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

    export I_MPI_DEBUG=value
    csh and tcsh shells

    将以下语句添加到 /home/username/.cshrc

    setenv I_MPI_DEBUG value
  10. 默认情况下,Intel MPI 使用操作系统的共享内存 (shm) 进行节点内通信,且仅使用 Libfabric (ofi) 进行节点间通信。通常,此配置可提供最佳性能。但是,在某些情况下,Intel MPI shm 结构可能会导致某些应用程序无限期挂起。

    要解决此问题,您可以强制 Intel MPI 使用 Libfabric 进行节点内和节点间通信。为此,请根据您的 Shell 执行下列操作之一。

    bash shells

    将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

    export I_MPI_FABRICS=ofi
    csh and tcsh shells

    将以下语句添加到 /home/username/.cshrc

    setenv I_MPI_FABRICS ofi
    注意

    EFA Libfabric 提供程序使用操作系统的共享内存进行节点内通信。这意味着将 I_MPI_FABRICS 设置为 ofi 可产生与默认 shm:ofi 配置接近的性能。

  11. 注销实例,然后重新登录。

如果您不再需要使用 Intel MPI,请从 Shell 启动脚本中删除环境变量。

步骤 6:禁用 Ptrace 保护

为了提高 HPC 应用程序的性能,当进程在同一实例上运行时,Libfabric 使用实例的本地内存进行进程间通信。

共享内存功能使用交叉内存附加 (CMA) 功能,但 ptrace 保护不支持该功能。如果您正在使用默认情况下启用 ptrace 保护的 Linux 发行版(例如 Ubuntu),则必须禁用它。如果您的 Linux 发行版默认未启用 ptrace 保护,请跳过此步骤。

禁用 ptrace 保护

请执行下列操作之一:

  • 要临时禁用 ptrace 保护以进行测试,请运行以下命令。

    $ sudo sysctl -w kernel.yama.ptrace_scope=0
  • 要永久禁用 ptrace 保护,请将 kernel.yama.ptrace_scope = 0 添加到 /etc/sysctl.d/10-ptrace.conf 并重新启动实例。

第 7 步。确认安装

要确认安装成功
  1. 要确认 MPI 已成功安装,请运行以下命令:

    $ which mpicc
    • 对于 Open MPI,返回的路径应包括 /opt/amazon/

    • 对于 Intel MPI,返回的路径应包括 /opt/intel/。如果您没有得到预期的输出,请确保您已获取 Intel MPI vars.sh 脚本。

  2. 要确认已成功安装 EFA 软件组件和 Libfabric,请运行以下命令。

    $ fi_info -p efa -t FI_EP_RDM

    该命令应返回有关 Libfabric EFA 接口的信息。以下示例显示了命令输出。

    provider: efa fabric: EFA-fe80::94:3dff:fe89:1b70 domain: efa_0-rdm version: 2.0 type: FI_EP_RDM protocol: FI_PROTO_EFA

步骤 8:安装 HPC 应用程序

在临时实例上安装 HPC 应用程序。安装过程因特定的 HPC 应用程序而异。有关更多信息,请参阅《Amazon Linux 2 User Guide》中的 Manage software on your AL2 instance

注意

请参阅 HPC 应用程序文档以了解安装说明。

步骤 9:创建启用 EFA 的 AMI

在安装所需的软件组件后,您可以创建一个 AMI,然后可以将其重复使用以启动启用了 EFA 的实例。

从临时实例创建 AMI
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择实例

  3. 选择您创建的临时实例,然后依次选择 Actions (操作)Image (映像)Create image (创建映像)

  4. 对于 Create image (创建映像),请执行以下操作:

    1. 对于 Image name (映像名称),为 AMI 输入一个描述性名称。

    2. (可选)对于 Image description (映像描述),输入 AMI 用途的简要描述。

    3. 选择创建映像

  5. 在导航窗格中,选择 AMIs

  6. 在列表中找到您创建的 AMI。等待状态从 pending 更改为 available,然后继续下一步。

步骤 10:在集群置放群组中启动启用 EFA 的实例

使用在步骤 7 中创建的启用了 EFA 的 AMI 以及在步骤 1 中创建的启用了 EFA 的安全组,在集群置放群组中启动启用了 EFA 的实例。

注意
  • 在集群置放群组中启动启用了 EFA 的实例并不是一个绝对要求。不过,我们建议在集群置放群组中运行启用了 EFA 的实例,因为它在单个可用区的低延迟组中启动实例。

  • 为了确保在扩展集群实例时容量可用,您可以为集群置放群组创建容量预留。有关更多信息,请参阅 在集群置放群组中创建容量预留

启动实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,请选择 Instances(实例),然后选择 Launch Instances(启动实例)以打开新的启动实例向导。

  3. 可选)在 Name and tags(名称和标签)部分中,提供实例的名称,例如 EFA-instance。名称作为资源标签(Name=EFA-instance)分配给实例。

  4. Application and OS Images(应用程序和操作系统映像)部分中,请选择 My AMIs(我的 AMI),然后选择您在上一步骤创建的 AMI。

  5. Instance type(实例类型)部分中,选择 supported instance type(支持的实例类型)。

  6. Key pair(密钥对)部分中,选择要用于实例的密钥对。

  7. Network settings(网络设置)部分中,请选择 Edit(编辑),然后执行以下操作:

    1. 对于子网,选择要在其中启动实例的子网。如果您未选择子网,则不能启用 EFA 的实例。

    2. 对于 Firewall(security groups)(防火墙(安全组)),请选择 Select existing security group(选择现有安全组),然后选择您在上一步中创建的安全组。

    3. 展开高级网络配置部分。

      对于网络接口 1,选择网卡索引 = 0设备索引 = 0接口类型 = 带 ENA 的 EFA

      可选)如果您使用的是多卡实例类型,例如 p4d.24xlargep5.48xlarge,则对于每个额外的网络接口,选择添加网络接口;对于网卡索引,选择下一个未使用的索引,然后选择设备索引 1接口类型 = 带 ENA 的 EFA仅限 EFA

  8. 可选)在 Storage(存储)部分中,根据需要配置卷。

  9. Advanced details(高级详细信息)部分中,对于置放群组名称,选择要在其中启动实例的集群置放群组。如果您需要创建新的集群置放群组,请选择 Create new placement group(创建新置放群组)。

  10. 在右侧的 Summary(摘要)面板中,为 Number of instances(实例数量)输入您要启动的启用了 EAA 的实例数量,然后选择 Launch instance(启动实例)。

步骤 11:终止临时实例

此时,您已不再需要在步骤 2 中启动的实例。您可以终止实例以停止产生费用。

终止临时实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 在导航窗格中,选择实例

  3. 选择您创建的临时实例,然后依次选择操作实例状态终止(删除)实例

  4. 当系统提示您确认时,选择终止(删除)

步骤 12:启用无密码 SSH

要使应用程序能够在集群中的所有实例上运行,您必须启用从领导节点到成员节点的无密码 SSH 访问。领导节点是从中运行应用程序的实例。集群中的其余实例是成员节点。

在集群中的实例之间启用无密码 SSH
  1. 在集群中选择一个实例作为领导节点,然后连接到该实例。

  2. 在领导节点上禁用 strictHostKeyChecking 并启用 ForwardAgent。使用首选文本编辑器打开 ~/.ssh/config,并添加以下内容。

    Host * ForwardAgent yes Host * StrictHostKeyChecking no
  3. 生成 RSA 密钥对。

    $ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

    密钥对在 $HOME/.ssh/ 目录中创建。

  4. 更改领导节点上私有密钥的权限。

    $ chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/config
  5. 使用首选文本编辑器打开 ~/.ssh/id_rsa.pub 并复制密钥。

  6. 对于集群中的每个成员节点,请执行以下操作:

    1. 连接到实例。

    2. 使用首选文本编辑器打开 ~/.ssh/authorized_keys,并添加之前复制的公有密钥。

  7. 要测试无密码 SSH 是否按预期运行,请连接到领导节点并运行以下命令。

    $ ssh member_node_private_ip

    您应该连接到成员节点,而不会收到输入密钥或密码的提示。