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

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

NVIDIA Collective Communications Library (NCCL) 是一个标准集体通信例程库,它适用于跨单个节点或多个节点的多个 GPU。可将 NCCL 与 EFA、libfabric 和 MPI 结合使用来支持各种机器学习工作负载。有关更多信息,请参阅 NCCL 网站。

您可以通过以下步骤,使用某个支持的基本操作系统的基础 AMI 来尝试 EFA 和 NCCL。

注意
  • 仅支持 p3dn.24xlargep4d.24xlargep5.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 的安全组
  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。仅支持 Amazon Linux 2、Ubuntu 20.04 和 Ubuntu 22.04。

  5. 实例类型部分中,选择 p3dn.24xlargep4d.24xlargep5.48xlarge

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

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

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

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

    3. 展开 Advanced network configuration(高级网络配置)部分,并为 Elastic Fabric Adapter 选择 Enable(启用)。

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

    注意

    您必须为 Nvidia CUDA 工具包额外预置 10 到 20 GiB 的存储空间。如果您没有预置足够的存储空间,您将在尝试安装 Nvidia 驱动程序和 CUDA 工具包时收到 insufficient disk space 错误。

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

步骤 3:安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN

Amazon Linux 2
安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN
  1. 为确保您的所有软件包都处于最新状态,请对您的实例执行快速软件更新。

    $ sudo yum upgrade -y && sudo reboot

    实例重启后,重新连接到实例。

  2. 安装在安装 Nvidia GPU 驱动程序和 Nvidia CUDA 工具包时需要的实用程序。

    $ sudo yum groupinstall 'Development Tools' -y
  3. 禁用 nouveau 开源驱动程序。

    1. 为您当前运行的内核版本安装所需的实用程序和内核标头软件包。

      $ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
    2. nouveau 添加到/etc/modprobe.d/blacklist.conf 拒绝列表文件。

      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatv EOF
    3. GRUB_CMDLINE_LINUX="rdblacklist=nouveau" 附加到 grub 文件并重新构建 Grub 配置。

      $ echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' | sudo tee -a /etc/default/grub \ && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  4. 重启实例并重新连接到它。

  5. 准备所需的存储库

    1. 安装适用于 DKMS 的 EPEL 存储库,并为您的 Linux 发行版启用任何可选存储库。

      $ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    2. 安装 CUDA 存储库公有 GPG 密钥。

      $ distribution='rhel7'
    3. 设置 CUDA 网络存储库并更新存储库缓存。

      $ ARCH=$( /bin/arch ) \ && sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/$distribution/${ARCH}/cuda-$distribution.repo \ && sudo yum clean expire-cache
    4. 仅限 5.10 内核版本)请仅在您使用基于 5.10 内核版本的 Amazon Linux 2 时执行这些步骤。如果您使用基于 4.12 内核版本的 Amazon Linux 2,请跳过以下步骤。要检查内核版本,请运行 uname -r

      1. 创建名为 /etc/dkms/nvidia.conf 的 Nvidia 驱动程序配置文件。

        $ sudo mkdir -p /etc/dkms \ && echo "MAKE[0]=\"'make' -j2 module SYSSRC=\${kernel_source_dir} IGNORE_XEN_PRESENCE=1 IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 CC=/usr/bin/gcc10-gcc\"" | sudo tee /etc/dkms/nvidia.conf
      2. (仅限 p4d.24xlargep5.48xlarge)复制 Nvidia 驱动程序配置文件。

        $ sudo cp /etc/dkms/nvidia.conf /etc/dkms/nvidia-open.conf
  6. 安装 Nvidia GPU 驱动程序、NVIDIA CUDA 工具包和 cuDNN。

    • p3dn.24xlarge

      $ sudo yum clean all \ && sudo yum -y install kmod-nvidia-latest-dkms nvidia-driver-latest-dkms \ && sudo yum -y install cuda-drivers-fabricmanager cuda libcudnn8-devel
    • p4d.24xlargep5.48xlarge

      $ sudo yum clean all \ && sudo yum -y install kmod-nvidia-open-dkms nvidia-driver-latest-dkms \ && sudo yum -y install cuda-drivers-fabricmanager cuda libcudnn8-devel
  7. 重启实例并重新连接到它。

  8. (仅限 p4d.24xlargep5.48xlarge)启动 Nvidia Fabric Manager 服务,并确保其在实例启动时自动启动。NV 交换管理需要 Nvidia Fabric 管理器。

    $ sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  9. 确保每次启动实例时均设置 CUDA 路径。

    • 对于 bash shell,请将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

      export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
    • 对于 tcsh shell,请将以下语句添加到 /home/username/.cshrc

      setenv PATH=/usr/local/cuda/bin:$PATH setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  10. 要验证 Nvidia GPU 驱动程序是否正常运行,请运行以下命令。

    $ nvidia-smi -q | head

    此命令应返回有关 Nvidia GPU、Nvidia GPU 驱动程序和 Nvidia CUDA 工具包的信息。

Ubuntu 20.04/22.04
安装 Nvidia GPU 驱动程序、Nvidia CUDA 工具包和 cuDNN
  1. 为确保您的所有软件包都处于最新状态,请对您的实例执行快速软件更新。

    $ sudo apt-get update && sudo apt-get upgrade -y
  2. 安装在安装 Nvidia GPU 驱动程序和 Nvidia CUDA 工具包时需要的实用程序。

    $ sudo apt-get update && sudo apt-get install build-essential -y
  3. 要使用 Nvidia GPU 驱动程序,您必须先禁用 nouveau 开源驱动程序。

    1. 为您当前运行的内核版本安装所需的实用程序和内核标头软件包。

      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
    2. nouveau 添加到/etc/modprobe.d/blacklist.conf 拒绝列表文件。

      $ cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatv EOF
    3. 使用首选文本编辑器打开 /etc/default/grub,并添加以下内容。

      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
    4. 重新生成 Grub 配置。

      $ sudo update-grub
  4. 重启实例并重新连接到它。

  5. 添加 CUDA 存储库并安装 Nvidia GPU 驱动程序、NVIDIA CUDA 工具包和 cuDNN。

    • p3dn.24xlarge

      $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \ && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \ && sudo dpkg -i /tmp/deeplearning.deb \ && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \ && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \ && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \ && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \ && sudo apt update \ && sudo apt install nvidia-dkms-535 \ && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
    • p4d.24xlargep5.48xlarge

      $ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/7fa2af80.pub \ && wget -O /tmp/deeplearning.deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu2004/x86_64/nvidia-machine-learning-repo-ubuntu2004_1.0.0-1_amd64.deb \ && sudo dpkg -i /tmp/deeplearning.deb \ && wget -O /tmp/cuda.pin https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin \ && sudo mv /tmp/cuda.pin /etc/apt/preferences.d/cuda-repository-pin-600 \ && sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub \ && sudo add-apt-repository 'deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /' \ && sudo apt update \ && sudo apt install nvidia-kernel-open-535 \ && sudo apt install -o Dpkg::Options::='--force-overwrite' cuda-drivers-535 cuda-toolkit-12-3 libcudnn8 libcudnn8-dev -y
  6. 重启实例并重新连接到它。

  7. (仅限 p4d.24xlargep5.48xlarge)安装 Nvidia Fabric Manager。

    1. 您必须安装与上一步中安装的 Nvidia 内核模块版本匹配的 Nvidia Fabric Manager 版本。

      运行以下命令以确定 Nvidia 内核模块的版本。

      $ cat /proc/driver/nvidia/version | grep "Kernel Module"

      下面是示例输出。

      NVRM version: NVIDIA UNIX x86_64 Kernel Module 450.42.01 Tue Jun 15 21:26:37 UTC 2021

      上述示例中安装了内核模块的主要版本 450。这意味着您需要安装 Nvidia Fabric Manager 版本 450

    2. 安装 Nvidia Fabric Manager。运行以下命令并指定上一步中确定的主要版本。

      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-major_version_number

      例如,如果已安装内核模块的主要版本 450,请使用以下命令安装与之匹配的 Nvidia Fabric Manager 版本。

      $ sudo apt install -o Dpkg::Options::='--force-overwrite' nvidia-fabricmanager-450
    3. 启动服务,并确保它在实例启动时自动启动。NV 交换管理需要 Nvidia Fabric 管理器。

      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
  8. 确保每次启动实例时均设置 CUDA 路径。

    • 对于 bash shell,请将以下语句添加到 /home/username/.bashrc/home/username/.bash_profile

      export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
    • 对于 tcsh shell,请将以下语句添加到 /home/username/.cshrc

      setenv PATH=/usr/local/cuda/bin:$PATH setenv LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
  9. 要验证 Nvidia GPU 驱动程序是否正常运行,请运行以下命令。

    $ nvidia-smi -q | head

    此命令应返回有关 Nvidia GPU、Nvidia GPU 驱动程序和 Nvidia CUDA 工具包的信息。

步骤 4:安装 GDRCopy

安装 GDRCopy 以提高 Libfabric 的性能。有关 GDRCopy 的更多信息,请参阅 GDRCopy 存储库

Amazon Linux 2
安装 GDRCopy
  1. 安装所需的依赖项。

    $ sudo yum -y install dkms rpm-build make check check-devel subunit subunit-devel
  2. 下载并解压缩 GDRCopy 程序包。

    $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \ && tar xf v2.4.tar.gz ; cd gdrcopy-2.4/packages
  3. 构建 GDRCopy RPM 程序包。

    $ CUDA=/usr/local/cuda ./build-rpm-packages.sh
  4. 安装 GDRCopy RPM 程序包。

    $ sudo rpm -Uvh gdrcopy-kmod-2.4-1dkms.noarch*.rpm \ && sudo rpm -Uvh gdrcopy-2.4-1.x86_64*.rpm \ && sudo rpm -Uvh gdrcopy-devel-2.4-1.noarch*.rpm
Ubuntu 20.04/22.04
安装 GDRCopy
  1. 安装所需的依赖项。

    $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
  2. 下载并解压缩 GDRCopy 程序包。

    $ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.4.tar.gz \ && tar xf v2.4.tar.gz \ && cd gdrcopy-2.4/packages
  3. 构建 GDRCopy RPM 程序包。

    $ CUDA=/usr/local/cuda ./build-deb-packages.sh
  4. 安装 GDRCopy RPM 程序包。

    $ sudo dpkg -i gdrdrv-dkms_2.4-1_amd64.*.deb \ && sudo dpkg -i libgdrapi_2.4-1_amd64.*.deb \ && sudo dpkg -i gdrcopy-tests_2.4-1_amd64.*.deb \ && sudo dpkg -i gdrcopy_2.4-1_amd64.*.deb

步骤 5:安装 EFA 软件

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

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

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

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

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

  3. 可选)验证 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.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。

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

    $ tar -xf aws-efa-installer-1.35.0.tar.gz && cd aws-efa-installer
  5. 运行 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=openmpi4

    Libfabric 安装在 /opt/amazon/efa 目录中,而 Open MPI 安装在 /opt/amazon/openmpi 目录中。

  6. 如果 EFA 安装程序提示您重启实例,请执行此操作,然后重新连接到实例。否则,请注销实例,然后重新登录以完成安装。

  7. 确认已成功安装 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.24xlargep5.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
  1. 导航到 /opt 目录。

    $ cd /opt
  2. 将官方 NCCL 存储库克隆到实例,然后导航到本地克隆的存储库。

    $ sudo git clone https://github.com/NVIDIA/nccl.git && cd nccl
  3. 生成并安装 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 插件
  1. 导航到您的主目录。

    $ cd $HOME
  2. 安装所需的实用程序。

    • Amazon Linux 2

      $ sudo yum install hwloc-devel
    • Ubuntu

      $ sudo apt-get install libhwloc-dev
  3. 下载 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
  4. 从压缩的 .tar.gz 文件中提取这些文件,然后导航到放置提取文件的目录。

    $ tar -xf aws-ofi-nccl-1.11.0-aws.tar.gz && cd aws-ofi-nccl-1.11.0-aws
  5. 要生成 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
  6. 将 Open MPI 目录添加到 PATH 变量中。

    $ export PATH=/opt/amazon/openmpi/bin/:$PATH
  7. 安装 aws-ofi-nccl 插件。

    $ make && sudo make install

步骤 8:安装 NCCL 测试

安装 NCCL 测试。NCCL 测试使您能够确认是否已正确安装 NCCL 以及它是否正在按预期运行。有关 NCCL 测试的更多信息,请参阅 nccl-tests 存储库

安装 NCCL 测试
  1. 导航到您的主目录。

    $ cd $HOME
  2. 将官方 nccl-tests 存储库克隆到实例,然后导航到本地克隆的存储库。

    $ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
  3. 将 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
  4. 安装 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 配置
  1. 创建一个主机文件来指定要在其上运行测试的主机。以下命令创建一个名为 my-hosts 的主机文件,该文件包含对实例本身的引用。

    IMDSv2
    [ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
    IMDSv1
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-ipv4 >> my-hosts
  2. 运行测试并指定主机文件 (--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.24xlargep5.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
  3. 打印 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
  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,然后继续下一步。

步骤 12:终止临时实例

现在,已不再需要您启动的临时实例。您可以终止实例以停止产生费用。

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

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

  3. 选择您创建的临时实例,然后依次选择 Actions (操作)Instance state (实例状态)Terminate instance (终止实例)

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

步骤 13:在集群放置组中启动启用了 EFA 和 NCCL 的实例

使用启用了 EFA 的 AMI 以及之前创建的启用了 EFA 的安全组,在集群置放群组中启动启用了 EFA 和 NCCL 的实例。

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

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

New console
启动临时实例
  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(实例类型)部分中,选择 p3dn.24xlargep4d.24xlarge

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

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

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

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

    3. 展开 Advanced network configuration(高级网络配置)部分,并为 Elastic Fabric Adapter 选择 Enable(启用)。

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

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

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

Old console
在集群置放群组中启动启用了 EFA 和 NCCL 的实例
  1. 通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/

  2. 选择 Launch Instance(启动实例)

  3. Choose an AMI (选择 AMI) 页面上,选择 My AMIs (我的 AMI),找到之前创建的 AMI,然后选择 Select (选择)

  4. 选择实例类型页面上,选择 p3dn.24xlarge,然后选择下一步:配置实例详细信息

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

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

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

    3. 对于 Placement group (置放群组),请选择 Add instance to placement group (将实例添加到置放群组)

    4. 对于 Placement group name (置放群组名称),请选择 Add to a new placement group (添加到新的置放群组),然后输入一个描述性的置放群组名称。然后,对于 Placement group strategy (置放群组策略),请选择 cluster (集群)

    5. 对于 EFA,请选择 Enable (启用)

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

    7. 选择下一步:添加存储

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

  7. Add Tags (添加标签) 页面上,为实例指定标签(例如,便于用户识别的名称),然后选择 Next: Configure Security Group (下一步:配置安全组)

  8. Configure Security Group (配置安全组) 页面上,为 Assign a security group (分配安全组) 选择 Select an existing security group (选择一个现有的安全组),然后选择之前创建的安全组。

  9. 选择审核并启动

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

步骤 14:启用无密码 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

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