

# 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 のみがサポートされています。
+ NCCL EFA 以降のみが 2.4.2 でサポートされています。

AWS Deep Learning AMIs を使用して EFA および NCCL で機械学習ワークロードを実行する方法の詳細については、「*AWS Deep Learning 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: GDRCopy をインストールする](#nccl-start-base-gdrcopy)
+ [ステップ 5: EFA ソフトウェアをインストールする](#nccl-start-base-enable)
+ [ステップ 6: NCCL をインストールする](#nccl-start-base-nccl)
+ [ステップ 7: NCCL テストをインストールする](#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 にはセキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。以下の手順ではセキュリティグループを作成します。このセキュリティグループではセキュリティグループ自体とのすべてのインバウンドおよびアウトバウンドのトラフィックと、SSH 接続用の任意の IPv4 アドレスからのインバウンド SSH トラフィックを許可します。

**重要**  
このセキュリティグループはテストのみを目的としています。本番環境ではコンピュータの IP アドレスやローカルネットワークの IP アドレスの範囲など、接続元の IP アドレスからのトラフィックのみを許可するインバウンド SSH ルールを作成することをお勧めします。

その他のシナリオについては[さまざまなユースケースのセキュリティグループのルール](security-group-rules-reference.md)を参照してください。

**EFA 対応のセキュリティグループを作成するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで [**Security Groups**] (セキュリティグループ) を選択して、[**Create security group**] (セキュリティグループの作成) を選択してください。

1. [**Create security group**] (セキュリティグループの作成) ウィンドウで、以下を行います。

   1. [**セキュリティグループ名**] に、`EFA-enabled security group` のような、分かりやすいセキュリティグループ名を入力してください。

   1. (オプション) [**説明**] に、セキュリティグループの簡単な説明を入力してください。

   1. [**VPC**] で、EFA 対応のインスタンスを起動する VPC を選択してください。

   1. **[セキュリティグループの作成]** を選択してください。

1. 作成したセキュリティグループを選択し、**[Details]** (詳細) タブで **[Security group ID]** (セキュリティグループ ID) をコピーします。

1. セキュリティグループが選択された状態で、**[Actions]** (アクション)、**[Edit inbound rules]** (インバウンドルールの編集) の順に選択し、次の手順を実行します。

   1. [**Add rule**] を選択してください。

   1. [**Type**] で、[**All traffic**] を選択してください。

   1. **[Source type]** (送信元タイプ) で、**[Custom]** (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。

   1. [**ルールを追加**] を選択してください。

   1. **[タイプ]** で **SSH]** を選択してください。

   1. **[Source type]** (ソースタイプ) で、**[Anywhere-IPv4]** を選択してください。

   1. **[Save Rules]** (ルールの保存) を選択してください。

1. セキュリティグループが選択された状態で、**[Actions]** (アクション)、**[Edit outbound rules]** (アウトバウンドルールの編集) の順に選択し、次の手順を実行します。

   1. [**Add rule**] を選択してください。

   1. [**Type**] で、[**All traffic**] を選択してください。

   1. **[Destination type]** (送信先タイプ) で、**[Custom]** (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。

   1. **[Save Rules]** (ルールの保存) を選択してください。

## ステップ 2: 一時インスタンスを作成する
<a name="nccl-start-base-temp"></a>

EFA ソフトウェアコンポーネントのインストールおよび設定に使用する一時インスタンスを起動します。このインスタンスを使用して、EFA 対応のインスタンスを起動する EFA 対応の AMI を作成します。

**一時インスタンスを起動するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択し、**[Launch Instances]** (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。

1. (*オプション*) **[Name and tags]** (名前とタグ) セクションで、`EFA-instance` などのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (`Name={{EFA-instance}}`)。

1. **[アプリケーションと OS のイメージ]** セクションで、サポートされるオペレーティングシステムのいずれかに対応する AMI を選択してください。

1. **[インスタンスタイプ]** セクションで、サポートされているインスタンスタイプを選択してください。

1. **[Key pair]** (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。

1. **[Network settings]** (ネットワーク設定) セクションで、**[Edit]** (編集) を選択し、次の操作を行います。

   1. [**サブネット**] で、インスタンスを起動するサブネットを選択してください。
**重要**  
サブネットを選択する必要があります。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。

   1. **[Firewall (security groups)]** (ファイアウォール (セキュリティグループ)) の場合、**[Select existing security group]** (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択してください。

   1. **[高度な設定]** セクションを展開します。

      **ネットワークインターフェイス 1** では**[ネットワークカードインデックス = 0]**、**[デバイスインデックス = 0]**、**[インターフェイスタイプ = EFA と ENA の組み合わせ]** を選択してください。

      (*オプション*) `p4d.24xlarge` または `p5.48xlarge` などのマルチカードインスタンスタイプを、必要な追加のネットワークインターフェイスごとに使用する場合は**[ネットワークインターフェイスの追加]** を選択し、**ネットワークカードインデックス**の場合は次の未使用インデックスを選択してから、**[デバイスインデックス = 1]**、**[インターフェイスタイプ = EFA と ENA の組み合わせ]** または **[EFA のみ]** を選択してください。

1. **[Storage]** (ストレージ) セクションで、必要に応じてボリュームを設定します。
**注記**  
Nvidia CUDA ツールキットには追加の 10 ～ 20 GiB のストレージをプロビジョニングする必要があります。十分な量のストレージをプロビジョニングしないと、Nvidia ドライバーと CUDA ツールキットをインストールしようとしたときに、`insufficient disk space` エラーが発生します。

1. 右側の **[合計mary]** (サマリー) パネルで、**[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` ファイルに `GRUB_CMDLINE_LINUX="rdblacklist=nouveau"` を追加し、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 サービスを開始し、インスタンスの起動時に自動的に起動することを確認します。NVIDIA Fabric Manager はNV Switch Management に必要です。

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

1. インスタンスが起動するたびに CUDA パスが設定されていることを確認します。
   + *bash* シェルの場合、次のステートメントを `/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* シェルの場合、次の文を `/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 カーネルモジュールのバージョンと一致する 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` をインストールする必要があることを意味します。

   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. サービスを開始し、インスタンスの起動時に自動的に起動することを確認します。NVIDIA Fabric Manager はNV Switch Management に必要です。

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

1. インスタンスが起動するたびに CUDA パスが設定されていることを確認します。
   + *bash* シェルの場合、次のステートメントを `/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* シェルの場合、次の文を `/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: GDRCopy をインストールする
<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、および Open MPI スタックをインストールします。

**EFA ソフトウェアをインストールするには**

1. 起動したインスタンスに接続します。詳細については「[SSH を使用した Linux インスタンスへの接続](connect-to-linux-instance.md)」を参照してください。

1. EFA ソフトウェアのインストールファイルをダウンロードします。ソフトウェアのインストールファイルは圧縮された tar (`.tar.gz`) ファイルにパッケージ化されています。次のコマンドを使用して、*安定している*最新バージョンをダウンロードします。

   前述のコマンドのバージョン番号を `latest` に置き換えることで最新バージョンを取得することもできます。

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

1. (*オプション*) EFA tarball (`.tar.gz`) ファイルの認証と完全性を検証します。

   ソフトウェアパブリッシャーの ID を検証し、発行後にファイルの改変や破損がないことを確認するために、これを行うことをお勧めします。tar ファイルを検証しない場合はこの手順をスキップします。
**注記**  
代わりに、MD5 または SHA256 チェックサムを使用して tar ファイルを検証する場合は[チェックサムを使用した EFA インストーラの検証](efa-verify.md)を参照してください。

   1. パブリック GPG キーをダウンロードして、キーリングにインポートします。

      ```
      $ 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 tar ファイルの署名を検証します。

      ```
      $ 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` の代わりに `sudo -E` を使用して環境変数を保持します。

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

   RPM ベースのシステム (Amazon Linux、RHEL、Rocky Linux、SUSE) では、インストーラは `rpm --checksig` を使用して各 RPM を検証します。DEB ベースのシステム (Ubuntu、Debian) では、インストーラは GPG 署名検証を使用して各 DEB を検証します。

   パッケージの検証に失敗すると、インストールは直ちに中止され、壊れたパッケージや悪意のあるパッケージからシステムを保護します。
**注記**  
`--check-signatures` フラグはオプションです。これがないと、インストーラは個々の署名検証を実行しません。

1. EFA ソフトウェアのインストールスクリプトを実行します。
**注記**  
前のオプションステップを完了してパッケージ署名の検証をセットアップした場合は、インストールコマンドに `--check-signatures` を追加して、`sudo` の代わりに `sudo -E` を使用します。例: `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` ディレクトリにインストールされます。**オープン 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 repository](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 テストをインストールする
<a name="nccl-start-base-tests"></a>

NCCL テストをインストールします。NCCL テストではNCCL が適切にインストールされていることを確認し、想定どおりに機能していることを確認できます。NCCL テストに関する詳細については[nccl-tests リポジトリ](https://github.com/NVIDIA/nccl-tests)を参照してください。

**NCCL テストをインストールするには**

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 テストをインストールし、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` – 詳細なデバッグ出力を有効にします。また、テストの開始時に NCCL バージョンのみをプリントするために `VERSION` を指定したり、エラーメッセージのみを受信するために `WARN` を指定したりすることもできます。

   NCCL テスト引数に関する詳細は公式の nccl-tests リポジトリの[NCCL Tests 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>

必要なソフトウェアコンポーネントのインストール後、EFA 対応のインスタンスの起動に再利用できる AMI を作成します。

**一時インスタンスから AMI を作成するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**インスタンス**] を選択してください。

1. 作成した一時インスタンスを選択し、[**アクション**]、[**イメージ**]、[**イメージの作成**] の順に選択してください。

1. [**イメージの作成**] で、次を行います。

   1. [**イメージ名**] に、の分かりやすい AMI 名を入力してください。

   1. (オプション) [**イメージの説明**] に、AMI の簡単な説明を入力してください。

   1. [**イメージを作成**] を選択してください。

1. ナビゲーションペインで [**AMI**] を選択してください。

1. リストで作成した AMI を探します。ステータスが `pending` から `available` に変わるまで待ってから、次のステップに進みます。

## ステップ 11: 一時インスタンスを終了する
<a name="nccl-start-base-terminate"></a>

この時点で、起動した一時インスタンスは不要になります。インスタンスを終了して、料金の発生を停止できます。

**一時インスタンスを終了するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、[**インスタンス**] を選択してください。

1. 作成した一時インスタンスを選択し、[**アクション**]、[**インスタンスの状態**]、[**インスタンスの終了**] の順に選択してください。

1. 確認を求めるメッセージが表示されたら、[**終了**] を選択してください。

## ステップ 12: クラスタープレイスメントグループで EFA および NCCL 対応のインスタンスを作成する
<a name="nccl-start-base-cluster"></a>

前に作成した EFA 対応の AMI と EFA 対応のセキュリティグループを使用して、EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループ内で起動します。

**注記**  
EFA 対応のインスタンスをクラスタープレイスメントグループに起動することは絶対的な要件ではありません。ただし、EFA 対応のインスタンスは 1 つのアベイラビリティーゾーン内の低レイテンシーグループに起動されるため、クラスタープレイスメントグループで実行することをお勧めします。
クラスターのインスタンスをスケールするときにキャパシティを使用できるようにするにはクラスタープレイスメントグループのキャパシティ予約を作成します。詳細については[クラスタープレイスメントグループでのキャパシティ予約の操作](cr-cpg.md) を参照してください。

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

**一時インスタンスを起動するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択し、**[Launch Instances]** (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。

1. (*オプション*) **[Name and tags]** (名前とタグ) セクションで、`EFA-instance` などのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (`Name={{EFA-instance}}`)。

1. **[Application and OS Images]** (アプリケーションと OS イメージ) セクションで、**[My AMI]** (マイ AMI) をクリックし、前のステップで作成した AMI を選択してください。

1. **[Instance type]** (インスタンスタイプ) セクションで、`p3dn.24xlarge` または `p4d.24xlarge` のいずれかを選択してください。

1. **[Key pair]** (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。

1. **[Network settings]** (ネットワーク設定) セクションで、**[Edit]** (編集) を選択し、次の操作を行います。

   1. [**サブネット**] で、インスタンスを起動するサブネットを選択してください。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。

   1. **[Firewall (security groups)]** (ファイアウォール (セキュリティグループ)) の場合、**[Select existing security group]** (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択してください。

   1. **[高度な設定]** セクションを展開します。

      **ネットワークインターフェイス 1 **では**[ネットワークカードインデックス = 0]**、**[デバイスインデックス = 0]**、および**[インターフェイスタイプ = EFA と ENA の組み合わせ]** を選択してください。

      （オプション) `p4d.24xlarge` または `p5.48xlarge` などのマルチカードインスタンスタイプを使用している場合は必要な追加のネットワークインターフェイスごとに**[ネットワークインターフェイスの追加]** を選択し、**ネットワークカードインデックス**の場合は次の未使用インデックスを選択してから、**[デバイスインデックス = 1]**、**[インターフェイスタイプ = ENA を含む EFA]** または **[EFA のみ]** を選択してください。

1. (*オプション*) **[Storage]** (ストレージ) セクションで、必要に応じてボリュームを設定します。

1. **[Advanced details]** (高度な詳細) セクションの **[Placement group name]** (プレイスメントグループ名) で、インスタンスを起動するクラスタープレイスメントグループを選択してください。新しいクラスタープレイスメントグループを作成する必要がある場合は**[Create new placement group]** (新しいプレイスメントグループの作成) を選択してください。

1. 右側の **[合計mary]** (サマリー) パネルで、**[Number of instances]** (インスタンス数) に、起動する EFA 対応のインスタンスの数を入力し、**[Launch Instance]** (インスタンスの起動) を選択してください。

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

**EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループに起動するには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. [**インスタンスの作成**] を選択してください。

1. [**AMI の選択**] ページで、[**マイ AMI**] を選択し、前に作成した AMI を見つけて、[**選択**] をクリックしてください。

1. **[インスタンスタイプの選択]** ページで **[p3dn.24xlarge]** を選択し、**[次へ: インスタンスの詳細の設定]** を選択してください。

1. [**インスタンスの詳細設定**] ページで、以下を行います。

   1. [**インスタンス数**] に、起動する EFA および NCCL 対応のインスタンスの数を入力してください。

   1. [**ネットワーク**] および [**サブネット**] で、インスタンスを起動する VPC およびサブネットを選択してください。

   1. [**プレイスメントグループ**] で、[**インスタンスをプレイスメントグループに追加します**] チェックボックスをオンにします。

   1. [**プレイスメントグループ名**] で、[**新しいプレイスメントグループに追加する**] チェックボックスをオンにし、分かりやすいプレイスメントグループ名を入力してください。次に、[**プレイスメントグループ戦略**] で [**クラスター**] を選択してください。

   1. [**EFA**] で、[**有効化**] を選択してください。

   1. [**ネットワークインターフェイス**] セクションの [**eth0**] で、[**新しいネットワークインターフェイス**] を選択してください。必要に応じて、プライマリ IPv4 アドレスと 1 つ以上のセカンダリ IPv4 アドレスを指定できます。関連付けられている IPv6 CIDR ブロックを持つサブネットにインスタンスを起動する場合は必要に応じて、プライマリ IPv6 アドレスと 1 つ以上のセカンダリ IPv6 アドレスを指定できます。

   1. [**次の手順: ストレージの追加**] を選択してください。

1. [**ストレージの追加**] ページで、AMI が指定するボリューム (ルートデバイスボリュームなど) に加えて、インスタンスにアタッチするボリュームを指定します。次に、[**次の手順: タグの追加**] を選択してください。

1. [**Add Tags**] ページで、ユーザーフレンドリーな名前などを使ってインスタンスのタグを指定し、[**Next: Configure Security Group**] を選択してください。

1. [**セキュリティグループの設定**] ページの [**セキュリティグループの割り当て**] で、[**既存のセキュリティグループの選択**] を選択し、前に作成したセキュリティグループを選択してください。

1. [**Review and Launch**] を選択してください。

1. [**インスタンス作成の確認**] ページで設定を確認し、[**起動**] を選択してキーペアを選択し、インスタンスを起動します。

------

## ステップ 13: パスワードレス SSH を有効にする
<a name="nccl-start-base-passwordless"></a>

クラスター内のすべてのインスタンスでアプリケーションを実行できるようにするにはリーダーノードからメンバーノードへのパスワードなしの SSH アクセスを有効にする必要があります。リーダーノードはアプリケーションを実行するインスタンスです。クラスター内の残りのインスタンスはメンバーノードです。

**クラスター内のインスタンス間でパスワードなしの SSH を有効にするには**

1. クラスター内の 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}}
   ```

   キーまたはパスワードの入力を求められずに、メンバーノードに接続できるはずです。