使用 EFA 启动 AWS Deep Learning AMI 实例 - 深度学习 AMI
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 EFA 启动 AWS Deep Learning AMI 实例

最新 DLAMI可随时与 EFA 结合使用,并随附所需的驱动程序、内核模块、libfabric、openmpi 和适用于 GPU 实例的 NCCL OFI 插件

支持的 CUDA 版本:具有 EFA 的 NCCL 应用程序仅在 CUDA-10.0、CUDA-10.1、CUDA-10.2 和 CUDA-11.0 上受支持,因为 NCCL OFI 插件需要 NCCL 版本 > 2.4.2。

注意:

  • 在 EFA 上使用 mpirun 运行 NCCL 应用程序时,必须将 EFA 支持的安装的完整路径指定为:

    /opt/amazon/openmpi/bin/mpirun <command>
  • 要使您的应用程序能够使用 EFA,请将 FI_PROVIDER="efa" 添加到 mpirun 命令,如 在 DLAMI 上使用 EFA 中所示。

准备启用 EFA 的安全组

EFA 需要允许进出安全组本身的所有入站和出站流量的安全组。有关更多信息,请参阅 EFA 文档

  1. 通过 https://console.aws.amazon.com/ec2/ 打开 Amazon EC2 控制台。

  2. 在导航窗格中,选择 Security Groups,然后选择 Create Security Group

  3. Create Security Group 窗口中,执行以下操作:

    • 对于 Security group name (安全组名称),输入安全组的描述性名称,例如 EFA-enabled security group

    • (可选)对于 Description (描述),输入安全组的简要描述。

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

    • 选择创建

  4. 选择您创建的安全组,然后在 Description (描述) 选项卡上复制 Group ID (组 ID)

  5. Inbound (入站)Outbound (出站) 选项卡上,执行以下操作:

    • 选择 Edit

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

    • 对于 Source,选择 Custom

    • 将您复制的安全组 ID 粘贴到该字段中。

    • 选择 Save。 

  6. 启用入站流量,请参考授权您 Linux 实例的入站流量。如果您跳过此步骤,您将无法与您的 DLAMI 实例进行通信。

启动实例

上的 EFA 目前支持以下实例类型和操作系统:AWS Deep Learning AMI

  • P3dn.24xlarge:Amazon Linux、Amazon Linux 2、Ubuntu 16.04 和 Ubuntu 18.04

  • P4d.24xlarge:Amazon Linux 2、Ubuntu 16.04 和 Ubuntu 18.04

以下部分说明如何启动启用了 EFA 的 DLAMI 实例。有关启动启用了 EFA 的实例的更多信息,请参阅在集群置放群组中启动启用了 EFA 的实例

  1. 通过 https://console.aws.amazon.com/ec2/ 打开 Amazon EC2 控制台。

  2. 选择 Launch Instance

  3. 选择一个 AMI 页面上,选择“深度学习 AMI (Ubuntu 18.04) 版本 25.0”

  4. Choose an Instance Type 页面上,选择以下支持的实例类型之一,然后选择 Next:配置实例详细信息。有关支持的实例列表,请参阅此链接:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html

  5. Configure Instance Details (配置实例详细信息) 页面中,执行以下操作:

    • 对于 Number of instances (实例的数量),请输入要启动的启用了 EFA 的实例数量。

    • 对于 Network (网络)Subnet (子网),请选择要在其中启动实例的 VPC 和子网。

    • [可选] 对于 Placement group (置放群组),选择 Add instance to placement group (将实例添加到置放群组)。为获得最佳性能,请在置放群组中启动实例。

    • [可选] 对于 Placement group name (置放群组名称),选择 Add to a new placement group (添加到新置放群组),输入置放群组的描述性名称,然后对于 Placement group strategy (置放群组策略),选择 cluster (集群)

    • 请确保在此页面上启用“Elastic Fabric Adapter”。如果禁用此选项,请将子网更改为支持所选实例类型的子网。 

    • Network Interfaces (网络接口) 部分中,为设备 eth0 选择 New network interface (新网络接口)。您可以选择指定一个主要 IPv4 地址以及一个或多个辅助 IPv4 地址。如果您在具有关联的 IPv6 CIDR 块的子网中启动实例,则可以选择指定主 IPv6 地址以及一个或多个辅助 IPv6 地址。

    • 选择 Next: (下一步:)。 添加存储

  6. Add Storage (添加存储) 页面上,除了 AMI 指定的卷(如根设备卷)以外,还要指定要附加到实例的卷,然后选择 Next: (下一步:)。 添加标签

  7. Add Tags 页面上,为实例指定标签 (如用户友好型名称),然后选择 Next: 配置安全组

  8. Configure Security Group 页面上,对于 Assign a security group,选择 Select an existing security group,然后选择您之前创建的安全组

  9. 选择 Review and Launch

  10. Review Instance Launch (核查实例启动) 页面上,检查这些设置,然后选择 Launch (启动) 以选择一个密钥对并启动您的实例。

验证 EFA 附件

通过控制台

启动实例后,在 AWS 控制台中查看实例详细信息。为此,请在 EC2 控制台中选择实例,然后查看页面下部窗格中的 Description (描述) 选项卡。找到参数“Network Interfaces: eth0”,然后单击 eth0,这将弹出一个弹出窗口。确保“Elastic Fabric Adapter”已启用。

如果未启用 EFA,您可以通过以下任一方式解决此问题:

  • 终止 EC2 实例并使用相同步骤启动新实例。确保已附加 EFA。

  • 将 EFA 附加到现有实例。

    1. 在 EC2 控制台中,转到 Network Interfaces (网络接口)。

    2. 单击 Create a Network Interface (创建虚拟网络接口)。

    3. 选择您的实例所在的相同子网。

    4. 确保启用“Elastic Fabric Adapter”并点击 Create (创建)。

    5. 返回 EC2 Instances (EC2 实例) 选项卡并选择您的实例。

    6. 转到操作:实例状态并在附加 EFA 之前停止实例。

    7. 从 Actions (操作) 中,选择 Networking (联网):附加网络接口。

    8. 选择您刚刚创建的界面,然后点击“附加”。

    9. 重新启动您的实例。

通过实例

以下测试脚本已存在于 DLAMI 中。运行它以确保内核模块正确加载。

$ fi_info -p efa

您的输出应类似于以下内容。

provider: efa     fabric: EFA-fe80::e5:56ff:fe34:56a8     domain: efa_0-rdm     version: 2.0     type: FI_EP_RDM     protocol: FI_PROTO_EFA provider: efa     fabric: EFA-fe80::e5:56ff:fe34:56a8     domain: efa_0-dgrm     version: 2.0     type: FI_EP_DGRAM     protocol: FI_PROTO_EFA provider: efa;ofi_rxd     fabric: EFA-fe80::e5:56ff:fe34:56a8     domain: efa_0-dgrm     version: 1.0     type: FI_EP_RDM     protocol: FI_PROTO_RXD

验证安全组配置

以下测试脚本已存在于 DLAMI 中。运行它以确保您创建的安全组配置正确。

$ cd ~/src/bin/efa-tests/ $ ./efa_test.sh

您的输出应类似于以下内容。

Starting server... Starting client... bytes   #sent   #ack     total       time     MB/sec    usec/xfer   Mxfers/sec 64      10      =10      1.2k        0.02s      0.06    1123.55       0.00 256     10      =10      5k          0.00s     17.66      14.50       0.07 1k      10      =10      20k         0.00s     67.81      15.10       0.07 4k      10      =10      80k         0.00s    237.45      17.25       0.06 64k     10      =10      1.2m        0.00s    921.10      71.15       0.01 1m      10      =10      20m         0.01s   2122.41     494.05       0.00

如果它停止响应或未完成,请确保您的安全组具有正确的入站/出站规则。