开始使用 EFA 和 NCCL 处理 Amazon EC2 上的 ML 工作负载
NVIDIA Collective Communications Library (NCCL) 是一个标准集体通信例程库,它适用于跨单个节点或多个节点的多个 GPU。可将 NCCL 与 EFA、libfabric 和 MPI 结合使用来支持各种机器学习工作负载。有关更多信息,请参阅 NCCL
您可以通过以下步骤,使用某个支持的基本操作系统的基础 AMI 来尝试 EFA 和 NCCL。
注意
-
仅支持
p3dn.24xlarge
、p4d.24xlarge
和p5.48xlarge
实例类型。 -
仅支持 Amazon Linux 2 和 Ubuntu 20.04/22.04 基础 AMI。
-
仅支持将 NCCL 2.4.2 及更高版本与 EFA 结合使用。
有关使用 AWS Deep Learning AMIs 运行包含 EFA 和 NCCL 的机器学习工作负载的更多信息,请参阅《AWS Deep Learning AMIs 开发者指南》中的在 DLAMI 上使用 EFA。
步骤
步骤 1:准备启用 EFA 的安全组
EFA 需要使用一个安全组,以允许进出安全组本身的所有入站和出站流量。以下过程创建了一个安全组,该安全组允许所有进出其本身的入站和出站流量,并允许来自任何 IPv4 地址的入站 SSH 流量进行 SSH 连接。
重要
此安全组仅用于测试目的。对于您的生产环境,建议您创建入站 SSH 规则,该规则仅允许来自您连接的 IP 地址的流量,例如计算机的 IP 地址或本地网络中的一系列 IP 地址。
有关其他场景,请参阅 针对不同使用案例的安全组规则。
创建启用 EFA 的安全组
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择 Security Groups (安全组),然后选择 Create Security Group (创建安全组)。
-
在 Create security group(创建安全组)窗口中,执行以下操作:
-
对于安全组名称,请输入一个描述性的安全组名称,例如
EFA-enabled security group
。 -
(可选)对于描述,请输入安全组的简要描述。
-
对于 VPC,请选择要在其中启动启用了 EFA 的实例的 VPC。
-
选择创建安全组。
-
-
选择您创建的安全组,然后在 Details(详细信息)选项卡上复制 Security group ID(安全组 ID)。
-
在安全组仍然选中的情况下,依次选择 Actions(操作)、Edit inbound rules(编辑入站规则),然后执行以下操作:
-
选择 Add rule。
-
对于 Type (类型),请选择 All traffic (所有流量)。
-
对于 Source type(源类型),请选择 Custom(自定义)并将您复制的安全组 ID 粘贴到该字段中。
-
选择 添加规则。
-
对于 Type,选择 SSH。
-
对于 Source type(源类型),请选择 Anywhere-IPv4。
-
选择保存规则。
-
-
在安全组仍然选中的情况下,依次选择 Actions(操作)、Edit outbound rules(编辑出站规则),然后执行以下操作:
-
选择 Add rule。
-
对于 Type (类型),请选择 All traffic (所有流量)。
-
对于 Destination type(目标类型),请选择 Custom(自定义)并将您复制的安全组 ID 粘贴到该字段中。
-
选择保存规则。
-
步骤 2:启动临时实例
启动一个临时实例,可用于安装和配置 EFA 软件组件。您使用该实例创建一个启用了 EFA 的 AMI,您可以从中启动启用了 EFA 的实例。
启动临时实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,请选择 Instances(实例),然后选择 Launch Instances(启动实例)以打开新的启动实例向导。
-
(可选)在 Name and tags(名称和标签)部分中,提供实例的名称,例如
EFA-instance
。名称作为资源标签(Name=
)分配给实例。EFA-instance
-
在 Application and OS Images(应用程序和操作系统映像)部分中,为其中一个支持的操作系统选择 AMI。仅支持 Amazon Linux 2、Ubuntu 20.04 和 Ubuntu 22.04。
-
在实例类型部分中,选择
p3dn.24xlarge
、p4d.24xlarge
或p5.48xlarge
。 -
在 Key pair(密钥对)部分中,选择要用于实例的密钥对。
-
在 Network settings(网络设置)部分中,请选择 Edit(编辑),然后执行以下操作:
-
对于子网,选择要在其中启动实例的子网。如果您未选择子网,则不能启用 EFA 的实例。
-
对于 Firewall(security groups)(防火墙(安全组)),请选择 Select existing security group(选择现有安全组),然后选择您在上一步中创建的安全组。
-
展开 Advanced network configuration(高级网络配置)部分,并为 Elastic Fabric Adapter 选择 Enable(启用)。
-
-
在 Storage(存储)部分中,根据需要配置卷。
注意
您必须为 Nvidia CUDA 工具包额外预置 10 到 20 GiB 的存储空间。如果您没有预置足够的存储空间,您将在尝试安装 Nvidia 驱动程序和 CUDA 工具包时收到
insufficient disk space
错误。 -
在右侧的 Summary(摘要)面板中,选择 Launch instance(启动实例)。
步骤 3:安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN
步骤 4:安装 GDRCopy
安装 GDRCopy 以提高 Libfabric 的性能。有关 GDRCopy 的更多信息,请参阅 GDRCopy 存储库
步骤 5:安装 EFA 软件
在临时实例上安装支持 EFA 所需的启用 EFA 的内核、EFA 驱动程序、Libfabric 和 Open MPI 堆栈。
安装 EFA 软件
-
连接到您启动的实例。有关更多信息,请参阅 使用 SSH 连接到 Linux 实例。
-
下载 EFA 软件安装文件。软件安装文件将打包为压缩的 tarball(
.tar.gz
)文件。要下载最新的稳定 版本,请使用以下命令。$
curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.35.0.tar.gz您也可以通过将上面命令中的版本号替换为
latest
来获取最新版本。 (可选)验证 EFA tarball(
.tar.gz
)文件的真实性和完整性。建议您执行此操作以验证软件发布者的身份,并检查该文件自发布以来是否已被更改或损坏。如果您不想验证 tarball 文件,请跳过此步骤。
注意
或者,如果您希望使用 MD5 或 SHA256 校验和验证 tarball 文件,请参阅 使用校验和验证 EFA 安装程序。
-
下载公有 GPG 密钥并将其导入到您的密钥环中。
$
wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key该命令应返回一个密钥值。请记下密钥值,因为需要在下一步中使用该值。
-
验证 GPG 密钥的指纹。运行以下命令并指定上一步中的密钥值。
$
gpg --fingerprintkey_value
该命令应返回一个与
4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC
相同的指纹。如果指纹不匹配,请不要运行 EFA 安装脚本,并联系 AWS Support。 -
下载签名文件并验证 EFA tarball 文件的签名。
$
wget https://efa-installer.amazonaws.com/aws-efa-installer-1.35.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.35.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。
-
-
从压缩的
.tar.gz
文件中提取文件,并导航到提取的目录。$
tar -xf aws-efa-installer-1.35.0.tar.gz && cd aws-efa-installer -
运行 EFA 软件安装脚本。
注意
从 EFA 1.30.0 开始,默认情况下会同时安装 Open MPI 4 和 Open MPI 5。除非需要 Open MPI 5,否则我们建议只安装 Open MPI 4。以下命令仅安装 Open MPI 4。如果需要安装 Open MPI 4 和 Open MPI 5,请删除
--mpi=openmpi4
。$
sudo ./efa_installer.sh -y --mpi=openmpi4Libfabric 安装在
/opt/amazon/efa
目录中,而 Open MPI 安装在/opt/amazon/openmpi
目录中。 -
如果 EFA 安装程序提示您重启实例,请执行此操作,然后重新连接到实例。否则,请注销实例,然后重新登录以完成安装。
-
确认已成功安装 EFA 软件组件。
$
fi_info -p efa -t FI_EP_RDM该命令应返回有关 Libfabric EFA 接口的信息。以下示例显示了命令输出。
-
p3dn.24xlarge
(具有单个网络接口)provider: efa fabric: EFA-fe80::94:3dff:fe89:1b70 domain: efa_0-rdm version: 2.0 type: FI_EP_RDM protocol: FI_PROTO_EFA
-
p4d.24xlarge
和p5.48xlarge
具有多个网络接口provider: efa fabric: EFA-fe80::c6e:8fff:fef6:e7ff domain: efa_0-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::c34:3eff:feb2:3c35 domain: efa_1-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::c0f:7bff:fe68:a775 domain: efa_2-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA provider: efa fabric: EFA-fe80::ca7:b0ff:fea6:5e99 domain: efa_3-rdm version: 111.0 type: FI_EP_RDM protocol: FI_PROTO_EFA
-
步骤 6:安装 NCCL
安装 NCCL。有关 NCCL 的更多信息,请参阅 NCCL 存储库
安装 NCCL
-
导航到
/opt
目录。$
cd /opt -
将官方 NCCL 存储库克隆到实例,然后导航到本地克隆的存储库。
$
sudo git clone https://github.com/NVIDIA/nccl.git && cd nccl -
生成并安装 NCCL,然后指定 CUDA 安装目录。
$
sudo make -j src.build CUDA_HOME=/usr/local/cuda
步骤 7:安装 aws-ofi-nccl 插件
aws-ofi-nccl 插件将 NCCL 的面向连接的传输 API 映射到 Libfabric 的无连接可靠接口。这使您能够在运行基于 NCCL 的应用程序时将 Libfabric 用作网络提供程序。有关 aws-ofi-nccl 插件的更多信息,请参阅 aws-ofi-nccl 存储库
安装 aws-ofi-nccl 插件
-
导航到您的主目录。
$
cd $HOME -
安装所需的实用程序。
-
Amazon Linux 2
$
sudo yum install hwloc-devel -
Ubuntu
$
sudo apt-get install libhwloc-dev
-
-
下载 aws-ofi-nccl 插件文件。这些文件将打包为压缩的 tarball (
.tar.gz
) 格式。$
wget https://github.com/aws/aws-ofi-nccl/releases/download/v1.11.0-aws/aws-ofi-nccl-1.11.0-aws.tar.gz -
从压缩的 .tar.gz 文件中提取这些文件,然后导航到放置提取文件的目录。
$
tar -xf aws-ofi-nccl-1.11.0-aws.tar.gz && cd aws-ofi-nccl-1.11.0-aws -
要生成 make 文件,请运行
configure
脚本并指定 MPI、Libfabric、NCCL 和 CUDA 安装目录。$
./configure --prefix=/opt/aws-ofi-nccl --with-mpi=/opt/amazon/openmpi \ --with-libfabric=/opt/amazon/efa \ --with-cuda=/usr/local/cuda \ --enable-platform-aws -
将 Open MPI 目录添加到
PATH
变量中。$
export PATH=/opt/amazon/openmpi/bin/:$PATH -
安装 aws-ofi-nccl 插件。
$
make && sudo make install
步骤 8:安装 NCCL 测试
安装 NCCL 测试。NCCL 测试使您能够确认是否已正确安装 NCCL 以及它是否正在按预期运行。有关 NCCL 测试的更多信息,请参阅 nccl-tests 存储库
安装 NCCL 测试
-
导航到您的主目录。
$
cd $HOME -
将官方 nccl-tests 存储库克隆到实例,然后导航到本地克隆的存储库。
$
git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests -
将 Libfabric 目录添加到
LD_LIBRARY_PATH
变量。-
Amazon Linux 2
$
export LD_LIBRARY_PATH=/opt/amazon/efa/lib64
:$LD_LIBRARY_PATH -
Ubuntu
$
export LD_LIBRARY_PATH=/opt/amazon/efa/lib
:$LD_LIBRARY_PATH
-
-
安装 NCCL 测试并指定 MPI、NCCL 和 CUDA 安装目录。
$
make MPI=1 MPI_HOME=/opt/amazon/openmpi
NCCL_HOME=/opt/nccl/build
CUDA_HOME=/usr/local/cuda
步骤 9:测试 EFA 和 NCCL 配置
运行测试以确保为 EFA 和 NCCL 正确配置临时实例。
测试 EFA 和 NCCL 配置
-
创建一个主机文件来指定要在其上运行测试的主机。以下命令创建一个名为
my-hosts
的主机文件,该文件包含对实例本身的引用。 -
运行测试并指定主机文件 (
--hostfile
) 和要使用的 GPU 数 (-n
)。以下命令在实例本身的 8 个 GPU 上运行all_reduce_perf
测试,并指定以下环境变量。-
FI_EFA_USE_DEVICE_RDMA=1
–(仅p4d.24xlarge
)使用设备的 RDMA 功能进行单侧和双侧传输。 -
NCCL_DEBUG=INFO
—启用详细的调试输出。您也可以指定VERSION
以在测试开始时仅输出 NCCL 版本,或指定WARN
以仅接收错误消息。
有关 NCCL 测试参数的更多信息,请参阅官方 nccl-tests 存储库中的 NCCL 测试自述文件
。 -
p3dn.24xlarge
$
/opt/amazon/openmpi/bin/mpirun \ -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/aws-ofi-nccl/lib:$LD_LIBRARY_PATH \ -x NCCL_DEBUG=INFO \ --hostfile my-hosts -n 8 -N 8 \ --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \ $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100 -
p4d.24xlarge
和p5.48xlarge
$
/opt/amazon/openmpi/bin/mpirun \ -x FI_EFA_USE_DEVICE_RDMA=1 \ -x LD_LIBRARY_PATH=/opt/nccl/build/lib:/usr/local/cuda/lib64:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:/opt/aws-ofi-nccl/lib:$LD_LIBRARY_PATH \ -x NCCL_DEBUG=INFO \ --hostfile my-hosts -n 8 -N 8 \ --mca pml ^cm --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \ $HOME/nccl-tests/build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
-
-
打印
NCCL_DEBUG
日志时,您可以确认 EFA 是否作为 NCCL 的底层提供程序处于活动状态。ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Selected Provider is efa*
使用
p4d.24xlarge
实例时会显示以下附加信息。ip-192-168-2-54:14:14 [0] NCCL INFO NET/OFI Running on P4d platform, Setting NCCL_TOPO_FILE environment variable to /home/ec2-user/install/plugin/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml
步骤 10:安装机器学习应用程序
在临时实例上安装机器学习应用程序。安装过程因特定的机器学习应用程序而异。有关在 Linux 实例上安装软件的更多信息,请参阅 Manage software on your Amazon Linux 2 instance。
注意
请参阅机器学习应用程序文档以了解安装说明。
步骤 11:创建启用了 EFA 和 NCCL 的 AMI
在安装所需的软件组件后,您可以创建一个 AMI,然后可以将其重复使用以启动启用了 EFA 的实例。
从临时实例创建 AMI
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择实例。
-
选择您创建的临时实例,然后依次选择 Actions (操作)、Image (映像)、Create image (创建映像)。
-
对于 Create image (创建映像),请执行以下操作:
-
对于 Image name (映像名称),为 AMI 输入一个描述性名称。
-
(可选)对于 Image description (映像描述),输入 AMI 用途的简要描述。
-
选择创建映像。
-
-
在导航窗格中,选择 AMIs。
-
在列表中找到您创建的 AMI。等待状态从
pending
更改为available
,然后继续下一步。
步骤 12:终止临时实例
现在,已不再需要您启动的临时实例。您可以终止实例以停止产生费用。
终止临时实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在导航窗格中,选择实例。
-
选择您创建的临时实例,然后依次选择 Actions (操作)、Instance state (实例状态)、Terminate instance (终止实例)。
-
当系统提示您确认时,选择终止。
步骤 13:在集群放置组中启动启用了 EFA 和 NCCL 的实例
使用启用了 EFA 的 AMI 以及之前创建的启用了 EFA 的安全组,在集群置放群组中启动启用了 EFA 和 NCCL 的实例。
注意
-
在集群置放群组中启动启用了 EFA 的实例并不是一个绝对要求。不过,我们建议在集群置放群组中运行启用了 EFA 的实例,因为它在单个可用区的低延迟组中启动实例。
-
为了确保在扩展集群实例时容量可用,您可以为集群置放群组创建容量预留。有关更多信息,请参阅 在集群置放群组中创建容量预留。
步骤 14:启用无密码 SSH
要使应用程序能够在集群中的所有实例上运行,您必须启用从领导节点到成员节点的无密码 SSH 访问。领导节点是从中运行应用程序的实例。集群中的其余实例是成员节点。
在集群中的实例之间启用无密码 SSH
-
在集群中选择一个实例作为领导节点,然后连接到该实例。
-
在领导节点上禁用
strictHostKeyChecking
并启用ForwardAgent
。使用首选文本编辑器打开~/.ssh/config
,并添加以下内容。Host * ForwardAgent yes Host * StrictHostKeyChecking no
-
生成 RSA 密钥对。
$
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa密钥对在
$HOME/.ssh/
目录中创建。 -
更改领导节点上私有密钥的权限。
$
chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/config -
使用首选文本编辑器打开
~/.ssh/id_rsa.pub
并复制密钥。 -
对于集群中的每个成员节点,请执行以下操作:
-
连接到实例。
-
使用首选文本编辑器打开
~/.ssh/authorized_keys
,并添加之前复制的公有密钥。
-
-
要测试无密码 SSH 是否按预期运行,请连接到领导节点并运行以下命令。
$
sshmember_node_private_ip
您应该连接到成员节点,而不会收到输入密钥或密码的提示。