

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon EC2 上的適用於 ML 工作負載的 EFA 和 NCCL 入門
<a name="efa-start-nccl"></a>

NVIDIA Collective Communications Library (NCCL) 是一種標準集體溝通常式程式庫，用於多個 GPU 橫跨單一節點或多個節點。NCCL 可與 EFA、Libfabric 和 MPI 一同使用來支援不同的機器學習工作負載。如需詳細資訊，請參閱 [NCCL](https://developer.nvidia.com/nccl) 網站。

**要求**
+ 僅支援加速運算 P 系列執行個體類型。如需詳細資訊，請參閱 [ Amazon EC2 加速運算執行個體](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html#ac-sizes)。
+ 僅支援 Amazon Linux 2023、Amazon Linux 2、Ubuntu 24.04 和 Ubuntu 22.04 基本 AMI。
+ EFA 僅支援 NCCL 2.4.2 和更新版本。

如需使用 搭配 EFA 和 NCCL 執行機器學習工作負載的詳細資訊 AWS 深度學習 AMIs，請參閱《 *AWS 深度學習 AMIs 開發人員指南*》中的[在 DLAMI 上使用 EFA](https://docs.aws.amazon.com/dlami/latest/devguide/tutorial-efa-using.html)。

**Topics**
+ [步驟 1：準備具備 EFA 功能的安全群組](#nccl-start-base-setup)
+ [步驟 2：啟動暫時執行個體](#nccl-start-base-temp)
+ [步驟 3：安裝 Nvidia GPU 驅動程式、Nvidia CUDA 工具組和 cuDNN](#nccl-start-base-drivers)
+ [步驟 4：安裝 GDRY](#nccl-start-base-gdrcopy)
+ [步驟 5：安裝 EFA 軟體](#nccl-start-base-enable)
+ [步驟 6：安裝 NCCL](#nccl-start-base-nccl)
+ [步驟 7：安裝 NCCL Test](#nccl-start-base-tests)
+ [步驟 8：測試您的 EFA 和 NCCL 組態](#nccl-start-base-test)
+ [步驟 9：安裝您的機器學習應用程式](#nccl-start-base-app)
+ [步驟 10：建立 EFA 和 NCCL 啟用的 AMI](#nccl-start-base-ami)
+ [步驟 11：終止暫時執行個體](#nccl-start-base-terminate)
+ [步驟 12：在叢集置放群組中啟動 EFA 和具備 NCCL 功能的執行個體](#nccl-start-base-cluster)
+ [步驟 13：啟用無密碼 SSH](#nccl-start-base-passwordless)

## 步驟 1：準備具備 EFA 功能的安全群組
<a name="nccl-start-base-setup"></a>

EFA 需要有安全群組來允許往返安全群組自身的所有傳入和傳出流量。下列程序會建立一個安全群組，該安全群組允許所有傳入和傳出流量，並允許來自任何 IPv4 地址的傳入 SSH 流量以進行 SSH 連線。

**重要**  
此安全群組僅供測試之用。對於生產環境，我們建議您建立傳入 SSH 規則，該規則僅允許來自連線 IP 位址的流量，例如電腦的 IP 位址或區域網路中的一系列 IP 位址。

如需其他案例，請參閱[不同使用案例的安全群組規則](security-group-rules-reference.md)。

**建立具備 EFA 功能的安全群組**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Security Groups** (安全群組)，然後選擇 **Create Security Group** (建立安全群組)。

1. 在 **Create Security Group** (建立安全群組) 視窗中，執行下列動作：

   1. 對於 **Security group name** (安全群組名稱)，輸入安全群組的描述性名稱，例如 `EFA-enabled security group`。

   1. (選用) 對於 **Description** (描述)，輸入安全群組的簡短描述。

   1. 對於 **VPC**，選取您打算讓具備 EFA 功能的執行個體在其中啟動的 VPC。

   1. 選擇 **Create Security Group** (建立安全群組)。

1. 選取您建立的安全群組，在 **Details** (詳細資料) 索引標籤上，複製 **Security group ID** (安全群組 ID)。

1. 在仍然選取安全群組的情況下，依序選取 **Actions** (動作) 和 **Edit inbound rules** (編輯傳入規則)，然後執行下列動作。

   1. 選擇**新增規則**。

   1. 針對**類型**，選擇**所有流量**。

   1. 若為 **Source type** (來源類型)，選擇 **Custom** (自訂)，然後將您複製的安全群組 ID 貼到欄位中。

   1. 選擇**新增規則**。

   1. 針對 **Type** (類型)，選擇 **SSH**。

   1. 針對 **Source type** (來源類別)，選擇 **Anywhere-IPv4**(隨處 - IPv4)。

   1. 選擇**儲存規則**。

1. 在仍然選取安全群組的情況下，依序選取 **Actions** (動作) 和 **Edit outbound rules** (編輯傳出規則)，然後執行下列動作。

   1. 選擇**新增規則**。

   1. 針對**類型**，選擇**所有流量**。

   1. 若為 **Destination type** (目的地類型)，選擇 **Custom** (自訂)，然後將您複製的安全群組 ID 貼到欄位中。

   1. 選擇**儲存規則**。

## 步驟 2：啟動暫時執行個體
<a name="nccl-start-base-temp"></a>

啟動暫時執行個體，以用來安裝和設定 EFA 軟體元件。您可以使用此執行個體來建立具備 EFA 功能的 AMI，再從中啟動具備 EFA 功能的執行個體。

**啟動暫時執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Instances** (執行個體)，接著選擇 **Launch Instances** (啟動執行個體) 來開啟新的啟動執行個體精靈。

1. (*選用*) 在 **Name and tags** (名稱和標籤) 區段中，為執行個體命名，例如，`EFA-instance`。該名稱將指派作為執行個體的資源標籤 (`Name={{EFA-instance}}`)。

1. 在**應用程式和作業系統映像**區段中，為其中一個支援的作業系統選取 AMI。

1. 在**執行個體類型**區段中，選取支援的執行個體類型。

1. 在 **Key pair** (金鑰對) 區段中，選取要用於執行個體的金鑰對。

1. 在 **Network settings** (網路設定) 區段，選擇 **Edit** (編輯)，接著執行下列動作：

   1. 對於 **Subnet (子網路)**，請選擇要在其中啟動執行個體的子網路。
**重要**  
您必須選取子網路。若您未選取子網路，便無法啟用 EFA 的執行個體。

   1. 針對 **Firewall (security groups)** (防火牆 (安全群組))，選取 **Select existing security group** (選取現有的安全群組)，接著選取您在前一個步驟中建立的安全群組。

   1. 展開**進階設定**區段。

      針對**網路介面 1**，選取**網路卡索引 = 0**、**裝置索引 = 0**，以及**介面類型 = EFA 搭配 ENA**。

      (*選用*) 如果您使用的是多卡執行個體類型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，則針對所需的每個額外網路介面，選擇**新增網路介面**，針對**網路卡索引**，選擇下一個未使用的索引，然後選擇**裝置索引 = 1**，**介面類型 = EFA 搭配 ENA** **或僅限 EFA**。

1. 在**儲存**區段中，根據需求設定磁碟區。
**注意**  
您必須為 Nvidia CUDA 工具組佈建額外的 10 到 20 GitB 儲存空間。如果您沒有佈建足夠的儲存空間，您會在嘗試安裝 Nvidia 驅動程式和 CUDA 工具組時，收到 `insufficient disk space` 錯誤。

1. 在右邊的 **Summary** (摘要) 面板中，選擇 **Launch instance** (啟動執行個體)。

## 步驟 3：安裝 Nvidia GPU 驅動程式、Nvidia CUDA 工具組和 cuDNN
<a name="nccl-start-base-drivers"></a>

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**安裝 Nvidia GPU 驅動程式、Nvidia CUDA 工具組和 cuDNN**

1. 為確保所有軟體套件皆為最新版本，請對您的執行個體執行快速軟體更新。

   ```
   $ sudo yum upgrade -y && sudo reboot
   ```

   重新啟動執行個體後，請重新與它連線。

1. 請安裝 Nvidia GPU 驅動程式和 Nvidia CUDA 工具組需要的公用程式。

   ```
   $ sudo yum groupinstall 'Development Tools' -y
   ```

1. 停用 `nouveau` 開放原始碼驅動程式。

   1. 針對您目前執行的核心版本，安裝需要的公用程式和核心標頭套件。

      ```
      $ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
      ```

   1. 新增 `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
      ```

   1. 將 `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
      ```

1. 重新啟動執行個體並重新連線至其中。

1. 準備所需的儲存庫

   1. 啟用 EPEL 儲存庫並將分佈設定為 `rhel7`。

      ```
      $ sudo amazon-linux-extras install epel \
      && distribution='rhel7'
      ```

   1. 設定 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
      ```

   1. (*僅限核心版本 5.10*) 唯有當您使用 Amazon Linux 2 搭配核心版本 5.10 時，才執行下列步驟。如果您是使用 Amazon Linux 2 搭配核心版本 4.12，請跳過下列步驟。若要檢查核心版本，請執行 **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
         ```

      1. (僅限 `p4d.24xlarge` 和 `p5.48xlarge`) 複製 Nvidia 驅動程序組態檔案。

         ```
         $ sudo cp /etc/dkms/nvidia.conf /etc/dkms/nvidia-open.conf
         ```

1. 安裝 Nvidia GPU 驅動程式、NVIDIA CUDA 工具組和 cuDNN。

   ```
   $ sudo yum clean all \
   && sudo yum -y install nvidia-driver-latest-dkms \
   && sudo yum -y install cuda-drivers-fabricmanager cuda libcudnn8-devel
   ```

1. 重新啟動執行個體並重新連線至其中。

1. (僅限 `p4d.24xlarge` 和 `p5.48xlarge`) 啟動 Nvidia Fabric Manager 服務，並確保它會在執行個體啟動時自動啟動。NV Switch Management 需要使用 Nvidia Fabric Manager。

   ```
   $ sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
   ```

1. 確認每次執行個體啟動時都已設定 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
     ```

1. 若要確認 Nvidia GPU 驅動程式正確運作，請執行下列命令。

   ```
   $ nvidia-smi -q | head
   ```

   命令應該回傳 Nvidia GPU、Nvidia GPU 驅動程式和 Nvidia CUDA 工具組的資訊。

------
#### [ Ubuntu 24.04 and Ubuntu 22.04 ]

**安裝 Nvidia GPU 驅動程式、Nvidia CUDA 工具組和 cuDNN**

1. 為確保所有軟體套件皆為最新版本，請對您的執行個體執行快速軟體更新。

   ```
   $ sudo apt-get update && sudo apt-get upgrade -y
   ```

1. 請安裝 Nvidia GPU 驅動程式和 Nvidia CUDA 工具組需要的公用程式。

   ```
   $ sudo apt-get update && sudo apt-get install build-essential -y
   ```

1. 若要使用 Nvidia GPU 驅動程式，您必須先停用 `nouveau` 開源驅動程式。

   1. 針對您目前執行的核心版本，安裝需要的公用程式和核心標頭套件。

      ```
      $ sudo apt-get install -y gcc make linux-headers-$(uname -r)
      ```

   1. 新增 `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
      ```

   1. 使用您偏好的文字編輯器開啟 `/etc/default/grub`，然後新增下列命令。

      ```
      GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
      ```

   1. 重建 Grub 組態。

      ```
      $ sudo update-grub
      ```

1. 重新啟動執行個體並重新連線至其中。

1. 新增 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.24xlarge` 和 `p5.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
     ```

1. 重新啟動執行個體並重新連線至其中。

1. (僅限 `p4d.24xlarge` 和 `p5.48xlarge`) 安裝 Nvidia Fabric Manager。

   1. 您安裝的 Nvidia Fabric Manager 版本必須與您在上一個步驟中安裝的 Nvidia 核心模組版本一致。

      執行以下命令來判斷 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`。

   1. 安裝 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
      ```

   1. 啟動服務，並確保服務會在執行個體啟動時自動啟動。NV Switch Management 需要使用 Nvidia Fabric Manager。

      ```
      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
      ```

1. 確認每次執行個體啟動時都已設定 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
     ```

1. 若要確認 Nvidia GPU 驅動程式正確運作，請執行下列命令。

   ```
   $ nvidia-smi -q | head
   ```

   命令應該回傳 Nvidia GPU、Nvidia GPU 驅動程式和 Nvidia CUDA 工具組的資訊。

------

## 步驟 4：安裝 GDRY
<a name="nccl-start-base-gdrcopy"></a>

安裝 GDRCopy 以提高 Libfabric 的效能。如需更多關於 GDRCopy 的詳細資訊，請參閱 [GDRCopy 儲存庫](https://github.com/NVIDIA/gdrcopy)。

------
#### [ Amazon Linux 2023 and Amazon Linux 2 ]

**若要安裝 GDRCopy**

1. 安裝所需的依存項目。

   ```
   $ sudo yum -y install dkms rpm-build make check check-devel subunit subunit-devel
   ```

1. 下載並解壓縮 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
   ```

1. 建立 GDRCopy RPM 套件。

   ```
   $ CUDA=/usr/local/cuda ./build-rpm-packages.sh
   ```

1. 安裝 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 24.04 and Ubuntu 22.04 ]

**若要安裝 GDRCopy**

1. 安裝所需的依存項目。

   ```
   $ sudo apt -y install build-essential devscripts debhelper check libsubunit-dev fakeroot pkg-config dkms
   ```

1. 下載並解壓縮 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
   ```

1. 建立 GDRCopy RPM 套件。

   ```
   $ CUDA=/usr/local/cuda ./build-deb-packages.sh
   ```

1. 安裝 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 軟體
<a name="nccl-start-base-enable"></a>

在執行個體上安裝支援 EFA 所需的具備 EFA 功能的核心、EFA 驅動程式、Libfabric、aws-ofi-nccl 外掛程式和 Open MPI 堆疊。

**安裝 EFA 軟體**

1. 連接至您啟動的執行個體。如需詳細資訊，請參閱[使用 SSH 連線至您的 Linux 執行個體](connect-to-linux-instance.md)。

1. 下載 EFA 軟體安裝檔案。軟體安裝檔案已封裝成壓縮 tarball (`.tar.gz`) 檔案。若要下載最新*穩定*版本，請使用下列命令：

   您也可以在之前的命令中以 `latest` 取代版本號碼，以取得最新版本。

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

1. (*選用*) 驗證 EFA tarball (`.tar.gz`) 檔案的真確性及完整性。

   我們建議您執行這項操作來確認軟體發布者的身分，並檢查檔案自發行以來並未遭到變更或損毀。如果您不想驗證 tarball 檔案，請略過此步驟。
**注意**  
或者，如果您偏好使用 MD5 或 SHA256 檢查總和來驗證 tarball 檔案，請參閱[使用檢查總和驗證 EFA 安裝程式](efa-verify.md)。

   1. 下載公有 GPG 金鑰並匯入至您的 keyring。

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

      命令應傳回金鑰值。請記下金鑰的值，因為下一個步驟將需要它。

   1. 驗證 GPG 金鑰的指紋。執行以下命令，並指定上一步驟中的金鑰值。

      ```
      $ gpg --fingerprint {{key_value}}
      ```

      命令應傳回與 `4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC` 相同的指紋。如果指紋不相符，請勿執行 EFA 安裝指令碼，並聯絡 支援。

   1. 下載簽章檔案並驗證 EFA tarball 檔案的簽章。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.48.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.48.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 安裝指令碼，並聯絡 支援。

1. 從壓縮的 `.tar.gz` 檔案中解壓縮檔案，然後導覽至解壓縮的目錄。

   ```
   $ tar -xf aws-efa-installer-1.48.0.tar.gz && cd aws-efa-installer
   ```

1. (*選用*) 在安裝期間驗證個別套件簽章。

   從 EFA 安裝程式 1.48.0 開始，安裝程式包含 GPG 簽署的個別 RPM 和 DEB 套件。若要在安裝期間驗證每個個別套件的真實性和完整性，請使用 `--check-signatures`旗標。當您啟用此旗標時，安裝程式會先驗證所有套件簽章，而且只有在每個套件通過驗證時才會繼續安裝。如果任何套件驗證失敗，安裝程式會立即結束，而無需安裝任何項目。

   1. 下載 GPG 公有金鑰。

      ```
      $ wget https://efa-installer.amazonaws.com/aws-efa-installer.key
      ```

   1. 匯出金鑰路徑。然後，在下一個步驟中，將 附加`--check-signatures`到安裝命令，並使用 `sudo -E`而不是 `sudo` 來保留環境變數。

      ```
      $ export EFA_INSTALLER_KEY=$(pwd)/aws-efa-installer.key
      ```

   在 RPM 型系統上 (Amazon Linux、RHEL、Rocky Linux 和 SUSE)，安裝程式會使用 驗證每個 RPM`rpm --checksig`。在 DEB 型系統 (Ubuntu、Debian) 上，安裝程式會使用 GPG 簽章驗證來驗證每個 DEB。

   如果任何套件的驗證失敗，安裝會立即中止，保護您的系統免於損壞或惡意的套件。
**注意**  
`--check-signatures` 旗標為選用。如果沒有，安裝程式不會執行個別簽章驗證。

1. 執行 EFA 軟體安裝指令碼。
**注意**  
如果您已完成上一個設定套件簽章驗證的選用步驟，請附加`--check-signatures`至安裝命令並使用 `sudo -E`，而非 `sudo`。例如：`sudo -E ./efa_installer.sh -y --mpi=openmpi4 --check-signatures`。
**注意**  
從 EFA 1.30.0 開始，預設會同時安裝 Open MPI 4.1 和 Open MPI 5。除非您需要 Open MPI 5，否則我們建議您僅安裝 Open MPI 4.1。下列命令只會安裝 Open MPI 4.1。如果您想要安裝 Open MPI 4.1 和 Open MPI 5，請移除 `--mpi=openmpi4`。

   ```
   $ sudo ./efa_installer.sh -y --mpi=openmpi4
   ```

   **Libfabric** 安裝在 `/opt/amazon/efa` 目錄中。**aws-ofi-nccl 外掛程式**安裝在 `/opt/amazon/ofi-nccl` 目錄中。**Open MPI** 安裝在 `/opt/amazon/openmpi` 目錄中。

1. 如果 EFA 安裝程式提示您重新啟動執行個體，請執行這項操作，然後重新連線至執行個體。否則，請登出執行個體，然後重新登入以完成安裝。

1. 確認已成功安裝 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
<a name="nccl-start-base-nccl"></a>

安裝 NCCL。如需更多關於 NCCL 詳細資訊，請參閱 [NCCL 存放庫](https://github.com/NVIDIA/nccl)。

**若要安裝 NCCL**

1. 請前往 `/opt` 目錄。

   ```
   $ cd /opt
   ```

1. 複製官方的 NCCL 存放庫至執行個體，並導覽至本地複製的存放庫。

   ```
   $ sudo git clone https://github.com/NVIDIA/nccl.git -b v2.23.4-1 && cd nccl
   ```

1. 建立並安裝 NCCL 並指定 CUDA 安裝目錄。

   ```
   $ sudo make -j src.build CUDA_HOME=/usr/local/cuda
   ```

## 步驟 7：安裝 NCCL Test
<a name="nccl-start-base-tests"></a>

安裝 NCCL test。NCCL test 可讓您確認 NCCL 已正確安裝，並如預期中執行。如需更多關於 NCCL test 的詳細資訊，請參閱 [nccl-test 存放庫](https://github.com/NVIDIA/nccl-tests)。

**若要安裝 NCCL test**

1. 導覽至您的主目錄。

   ```
   $ cd $HOME
   ```

1. 複製官方的 nccl-tests 存放庫至執行個體，並導覽至本地複製的存放庫。

   ```
   $ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
   ```

1. 新增 Libfabric 目錄至 `LD_LIBRARY_PATH` 變數。
   + Amazon Linux 2023 和 Amazon Linux 2

     ```
     $ export LD_LIBRARY_PATH={{/opt/amazon/efa/lib64}}:$LD_LIBRARY_PATH
     ```
   + Ubuntu 24.04 和 Ubuntu 22.04

     ```
     $ export LD_LIBRARY_PATH={{/opt/amazon/efa/lib}}:$LD_LIBRARY_PATH
     ```

1. 安裝 NCCL test 並指定 MPI、NCCL 和 CUDA 安裝目錄。

   ```
   $ make MPI=1 MPI_HOME={{/opt/amazon/openmpi}} NCCL_HOME={{/opt/nccl/build}} CUDA_HOME={{/usr/local/cuda}}
   ```

## 步驟 8：測試您的 EFA 和 NCCL 組態
<a name="nccl-start-base-test"></a>

執行測試以確保已對 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
   ```

------

1. 執行測試並指定主機檔案 (`--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-test 存放庫中的 [NCCL Test README](https://github.com/NVIDIA/nccl-tests/blob/master/README.md)。
   + `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/amazon/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/amazon/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
     ```

1. 列印 `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
   ```

## 步驟 9：安裝您的機器學習應用程式
<a name="nccl-start-base-app"></a>

在暫時執行個體上安裝機器學習應用程式。安裝程序依特定的機器學習應用程式而異。如需有關在您的 Linux 執行個體上安裝軟體的詳細資訊，請參閱[在您的 Amazon Linux 2 執行個體上管理軟體](https://docs.aws.amazon.com/linux/al2/ug/managing-software.html)。

**注意**  
參考機器學習應用程式的文件，以取得安裝指示。

## 步驟 10：建立 EFA 和 NCCL 啟用的 AMI
<a name="nccl-start-base-ami"></a>

安裝所需的軟體元件之後，您需要建立 AMI，以重複用來啟動具備 EFA 功能的執行個體。

**從暫時執行個體建立 AMI**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Instances** (執行個體)。

1. 選取您建立的暫時執行個體，然後選取 **Actions** (動作)、**Image** (映像)、**Create image** (建立映像)。

1. 對於 **Create image** (建立映像)，執行下列動作：

   1. 對於 **Image name** (映像名稱)，輸入 AMI 的描述性名稱。

   1. (選用) 對於 **Image description** (映像描述)，輸入 AMI 的簡短描述。

   1. 選擇**建立映像**。

1. 在導覽窗格中，選擇 **AMIs**。

1. 在清單中找出您建立的 AMI。等待狀態從 `pending` 變為 `available`，再繼續進行下一個步驟。

## 步驟 11：終止暫時執行個體
<a name="nccl-start-base-terminate"></a>

此時，您不再需要您啟動的暫時執行個體。您可以終止執行個體，以停止產生費用。

**終止暫時執行個體**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Instances** (執行個體)。

1. 選取您建立的暫時執行個體，然後選取**動作**、**執行個體狀態**、**終止執行個體**。

1. 出現確認提示時，請選擇**終止**。

## 步驟 12：在叢集置放群組中啟動 EFA 和具備 NCCL 功能的執行個體
<a name="nccl-start-base-cluster"></a>

使用具備 EFA 功能的 AMI 和具備 EFA 功能的安全群組，在叢集置放群組中啟動具備 EFA 和 NCCL 功能的執行個體。

**注意**  
在叢集置放群組中啟動具備 EFA 的執行個體並非絕對必要。不過，建議在叢集置放群組中執行具備 EFA 功能的執行個體，因為這樣會在單一可用區域的低延遲群組中啟動執行個體。
要確保在擴展叢集執行個體時容量可用，您可以為叢集置放群組建立容量保留。如需詳細資訊，請參閱[搭配使用容量保留與叢集置放群組](cr-cpg.md)。

------
#### [ New console ]

**啟動暫時執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Instances** (執行個體)，接著選擇 **Launch Instances** (啟動執行個體) 來開啟新的啟動執行個體精靈。

1. (*選用*) 在 **Name and tags** (名稱和標籤) 區段中，為執行個體命名，例如，`EFA-instance`。該名稱將指派作為執行個體的資源標籤 (`Name={{EFA-instance}}`)。

1. 在 **Application and OS Images** (應用程式和作業系統映像) 區段中，選取 **My AMIs (我的 AMI)**，接著選取您在前一個步驟中建立的 AMI。

1. 在 **Instance type** (執行個體類型) 區段中，選取 `p3dn.24xlarge` 或者 `p4d.24xlarge`。

1. 在 **Key pair** (金鑰對) 區段中，選取要用於執行個體的金鑰對。

1. 在 **Network settings** (網路設定) 區段，選擇 **Edit** (編輯)，接著執行下列動作：

   1. 對於 **Subnet (子網路)**，請選擇要在其中啟動執行個體的子網路。若您未選取子網路，便無法啟用 EFA 的執行個體。

   1. 針對 **Firewall (security groups)** (防火牆 (安全群組))，選取 **Select existing security group** (選取現有的安全群組)，接著選取您在前一個步驟中建立的安全群組。

   1. 展開**進階設定**區段。

      針對**網路介面 1**，選取**網路卡索引 = 0**、**裝置索引 = 0**，以及**介面類型 = EFA 搭配 ENA**。

      (選用) 如果您使用的是多卡執行個體類型，例如 `p4d.24xlarge` 或 `p5.48xlarge`，則針對所需的每個額外網路介面，選擇**新增網路介面**，針對**網路卡索引**，選擇下一個未使用的索引，然後選擇**裝置索引 = 1**，**介面類型 = EFA eith ENA** 或**僅限 EFA**。

1. (*選用*) 在**儲存**區段中，根據需求設定磁碟區。

1. 在**進階詳細資訊**區段中，針對**叢集置放群組**，選取要在其中啟動執行個體的叢集置放群組。如果您需要建立新的叢集置放群組，請選取**建立新的配置群組**。

1. 在右邊的**摘要**面板，針對**執行個體的數目**，輸入要啟動的具備 EFA 功能的執行個體數量，接著選擇**啟動執行個體**。

------
#### [ Old console ]

**在叢集置放群組中啟動具備 EFA 和 NCCL 功能的執行個體**

1. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇 **Launch Instance (啟動執行個體)**。

1. 在 **Choose an AMI** (選取 AMI) 頁面上，選取 **My AMIs** (我的 AMI)，找出您之前建立的 AMI，然後選取 **Select** (選取)。

1. 在 **Choose an Instance Type** (選取執行個體類型) 頁面上，選取 **p3dn.24xlarge**，然後選取 **Next: Configure Instance Details** (下一步：設定執行個體詳細資訊)。

1. 在 **Configure Instance Details (設定執行個體詳細資訊)** 頁面上，執行下列操作：

   1. 對於 **Number of instances** (執行個體的數目)，輸入要啟動的具備 EFA 和 NCCL 功能的執行個體數。

   1. 對於 **Network** (網路) 和 **Subnet** (子網路)，選取要在其中啟動執行個體的 VPC 和子網路。

   1. 對於 **Placement group (置放群組)**，選取 **Add instance to placement group (將執行個體新增至置放群組)**。

   1. 對於 **Placement group name** (置放群組名稱)，選取 **Add to a new placement group** (新增至新的置放群組)，然後輸入置放群組的描述性名稱。然後為 **Placement group strategy** (置放群組策略) 選取 **cluster** (叢集)。

   1. 對於 **EFA**，選擇 **Enable (啟用)**。

   1. 在 **Network Interfaces** (網路介面) 區段中，針對裝置 **eth0**，選擇 **New network interface** (新網路介面)。您可以選擇性指定一個主要 IPv4 地址，以及一或多個次要 IPv4 地址。如果您在有相關聯 IPv6 CIDR 區塊的執行個體中啟動執行個體，您可以選擇性指定一個主要 IPv6 地址，以及一或多個次要 IPv6 地址。

   1. 選擇 **Next: Add Storage (下一步：新增儲存體)**。

1. 在 **Add Storage** (新增儲存體) 頁面上，除了 AMI 指定的磁碟區 (例如根設備磁碟區)，指定要連接到執行個體的磁碟區。然後選擇 **Next: Add Tags (下一步：新增標籤)**。

1. 在 **Add Tags (新增標籤)** 頁面上，為執行個體指定標籤 (例如使用者易記的名稱)，然後選擇 **Next: Configure Security Group (下一步：設定安全群組)**。

1. 在 **Configure Security Group** (設定安全群組) 頁面上，針對 **Assign a security group** (指派安全群組)，選取 **Select an existing security group** (選取現有安全群組)，然後選取您之前建立的安全群組。

1. 選擇 **Review and Launch** (檢閱和啟動)。

1. 在 **Review Instance Launch (檢閱執行個體啟動)** 頁面上，檢閱設定，然後選擇 **Launch (啟動)**，以選擇金鑰對並啟動執行個體。

------

## 步驟 13：啟用無密碼 SSH
<a name="nccl-start-base-passwordless"></a>

若要讓您的應用程式能夠跨越叢集中的所有執行個體執行，您必須啟用從領導節點到成員節點的無密碼 SSH 存取。領導節點是您在其中執行應用程式的執行個體。叢集中的其餘執行個體為成員節點。

**在叢集的執行個體之間啟用無密碼 SSH**

1. 選取叢集中的一個執行個體作為領導節點，並與它連線。

1. 在領導節點上停用 `strictHostKeyChecking` 並啟用 `ForwardAgent`。使用您偏好的文字編輯器開啟 `~/.ssh/config`，然後新增下列命令。

   ```
   Host *
       ForwardAgent yes
   Host *
       StrictHostKeyChecking no
   ```

1. 產生 RSA 金鑰對。

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

   在 `$HOME/.ssh/` 目錄中建立金鑰對。

1. 變更領導節點上私有金鑰的許可。

   ```
   $ chmod 600 ~/.ssh/id_rsa
   chmod 600 ~/.ssh/config
   ```

1. 使用您偏好的文字編輯器開啟 `~/.ssh/id_rsa.pub` 並複製該金鑰。

1. 對於叢集中的每個成員節點，執行以下操作：

   1. 連線到執行個體。

   1. 使用您偏好的文字編輯器開啟 `~/.ssh/authorized_keys`，然後新增您先前複製的公有金鑰。

1. 若要測試無密碼的 SSH 是否如預期運作，請連線至領導節點並執行下列命令。

   ```
   $ ssh {{member_node_private_ip}}
   ```

   您應該連線至成員節點，而不會提示您輸入金鑰或密碼。