Amazon EC2 の ML ワークロードに対して EFA と NCCL の使用を開始する - Amazon Elastic Compute Cloud

Amazon EC2 の ML ワークロードに対して EFA と NCCL の使用を開始する

NVIDIA Collective Communications Library (NCCL) は、単一のノードまたは複数のノードの複数の GPU のための集合的な標準コミュニケーションルーチンのライブラリです。NCCL は、各種の機械学習のワークロードをサポートするために、EFA、Libfabric、MPI と共に使用できます。詳細については、NCCL のウェブサイトを参照してください。

次の手順で、いずれかのサポートされているオペレーティングシステムのベース AMI を使用して EFA および NCCL を開始することができます。

注記
  • p3dn.24xlargep4d.24xlarge および p5.48xlarge インスタンスタイプのみがサポートされています。

  • Amazon Linux 2 および Ubuntu 20.04/22.04 ベースの AMI のみがサポートされています。

  • NCCL EFA 以降のみが 2.4.2 でサポートされています。

  • AWS Deep Learning AMIs を使用して EFA および NCCL で機械学習ワークロードを実行する方法の詳細については、「AWS Deep Learning AMIs デベロッパーガイド」の「DLAMI での EFA の使用」を参照してください。

ステップ 1: EFA 対応のセキュリティグループを準備する

EFA には、セキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。以下の手順では、セキュリティグループを作成します。このセキュリティグループでは、セキュリティグループ自体とのすべてのインバウンドおよびアウトバウンドのトラフィックと、SSH 接続用の任意の IPv4 アドレスからのインバウンド SSH トラフィックを許可します。

重要

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

その他のシナリオについては、さまざまなユースケースのセキュリティグループのルールを参照してください。

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. [タイプ]SSH] を選択します。

    6. [Source type] (ソースタイプ) で、[Anywhere-IPv4] を選択します。

    7. [Save Rules] (ルールの保存) を選択します。

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

    1. [Add rule] を選択します。

    2. [Type] で、[All traffic] を選択します。

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

    4. [Save Rules] (ルールの保存) を選択します。

ステップ 2: 一時インスタンスを作成する

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

一時インスタンスを起動するには
  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] (アプリケーションと OS イメージ) セクションで、サポートされるオペレーティングシステムを選択します。Amazon Linux 2、Ubuntu 20.04、および Ubuntu 22.04 のみがサポートされています。

  5. [インスタンスタイプ] セクションで、p3dn.24xlargep4d.24xlarge または p5.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 ファイルに 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
  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 のみ) 以下の手順は、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
      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.24xlarge および p5.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.24xlarge および p5.48xlarge のみ) NVIDIA Fabric Manager サービスを開始し、インスタンスの起動時に自動的に起動することを確認します。NVIDIA Fabric Manager は、NV Switch Management に必要です。

    $ sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
  9. インスタンスが起動するたびに 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
  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.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
  6. インスタンスを再起動して、そのインスタンスに再接続します。

  7. (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 をインストールする必要があることを意味します。

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

      $ sudo systemctl start nvidia-fabricmanager && sudo systemctl enable nvidia-fabricmanager
  8. インスタンスが起動するたびに 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
  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 ソフトウェアのインストールファイルをダウンロードします。ソフトウェアのインストールファイルは、圧縮された tar (.tar.gz) ファイルにパッケージ化されています。次のコマンドを使用して、安定している最新バージョンをダウンロードします。

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

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

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

    ソフトウェア発行元の ID を検証し、発行後にファイルの改変や破損がないことを確認するために、これを行うことをお勧めします。tar ファイルを検証しない場合は、この手順をスキップします。

    注記

    代わりに、MD5 または SHA256 チェックサムを使用して tar ファイルを検証する場合は、チェックサムを使用した 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 tar ファイルの署名を検証します。

      $ 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 からは、オープン 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.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 repositoryを参照してください。

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 を、Llibfabric の接続がなく信頼性の高いインターフェイスにマップします。これにより、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 プラグインファイルをダウンロードします。ファイルは、圧縮された tar (.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 – 詳細なデバッグ出力を有効にします。また、テストの開始時に NCCL バージョンのみをプリントするために VERSION を指定したり、エラーメッセージのみを受信するために WARN を指定したりすることもできます。

    NCCL テスト引数に関する詳細は、公式の nccl-tests リポジトリのNCCL Tests READMEを参照してください。

    • 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
  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 インスタンスへのソフトウェアのインストールの詳細については、「Amazon Linux 2 インスタンスでのソフトウェアの管理」を参照してください。

注記

インストール手順については、機械学習アプリケーションのドキュメントを参照してください。

ステップ 11: EFA および NCCL 対応 AMI を作成する

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

一時インスタンスから AMI を作成するには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。

  3. 作成した一時インスタンスを選択し、[アクション]、[イメージ]、[イメージの作成] の順に選択します。

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

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

    2. (オプション) [イメージの説明] に、AMI の簡単な説明を入力します。

    3. [イメージを作成] を選択します。

  5. ナビゲーションペインで [AMIs] を選択します。

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

ステップ 12: 一時インスタンスを終了する

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

一時インスタンスを終了するには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。

  3. 作成した一時インスタンスを選択し、[アクション]、[インスタンスの状態]、[インスタンスの終了] の順に選択します。

  4. 確認を求めるメッセージが表示されたら、[終了] を選択します。

ステップ 13: クラスタープレイスメントグループに EFA および NCCL 対応インスタンスを起動する

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

注記
  • EFA 対応のインスタンスをクラスターのプレイスメントグループに起動することは絶対的な要件ではありません。ただし、EFA 対応のインスタンスは、1 つのアベイラビリティーゾーン内の低レイテンシーグループに起動されるため、クラスタープレイスメントグループで実行することをお勧めします。

  • クラスターのインスタンスをスケールするときにキャパシティを使用できるようにするには、クラスタープレイスメントグループのキャパシティ予約を作成します。詳細については、クラスタープレイスメントグループでキャパシティ予約を作成する を参照してください。

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] (アプリケーションと OS イメージ) セクションで、[My AMIs] (マイ AMI) をクリックし、前のステップで作成した AMI を選択します。

  5. [Instance type] (インスタンスタイプ) セクションで、p3dn.24xlarge または p4d.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] (高度な詳細) セクションの [Placement group name] (プレイスメントグループ名) で、インスタンスを起動するクラスタープレイスメントグループを選択します。新しいクラスタープレイスメントグループを作成する必要がある場合は、[Create new placement group] (新しいプレイスメントグループの作成) を選択します。

  10. 右側の [Summary] (サマリー) パネルで、[Number of instances] (インスタンス数) に、起動する EFA 対応のインスタンスの数を入力し、[Launch Instance] (インスタンスの起動) を選択します。

Old console
EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループに起動するには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. [インスタンスの作成] を選択します。

  3. [AMI の選択] ページで、[マイ AMI] を選択し、前に作成した AMI を見つけて、[選択] をクリックします。

  4. [インスタンスタイプの選択] ページで [p3dn.24xlarge] を選択し、[次へ: インスタンスの詳細の設定] を選択します。

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

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

    2. [ネットワーク] および [サブネット] で、インスタンスを起動する VPC およびサブネットを選択します。

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

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

    5. [EFA] で、[有効化] を選択します。

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

    7. [次の手順: ストレージの追加] を選択します。

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

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

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

  9. [Review and Launch] を選択します。

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

ステップ 14: パスワードレス SSH を有効にする

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

クラスター内のインスタンス間でパスワードなしの SSH を有効にするには
  1. クラスター内の 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

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