Amazon EC2 の ML ワークロードに対して EFA と NCCL の使用を開始する
NVIDIA Collective Communications Library (NCCL) は単一のノードまたは複数のノードの複数の GPU のための集合的な標準コミュニケーションルーチンのライブラリです。NCCL は、さまざまな機械学習のワークロードをサポートするために EFA、Libfabric、および MPI と併用できます。詳細についてはNCCL のウェブサイトを参照してください。
要件
-
サポートされるインスタンスタイプには、EFA がサポートする P シリーズおよび G シリーズのインスタンスタイプが含まれます。詳細については、「Amazon EC2 の高速コンピューティングインスタンスの仕様」を参照してください。
-
サポートされるベース AMI: Amazon Linux 2023、Ubuntu 26.04、Ubuntu 24.04、Ubuntu 22.04、Debian 12、RHEL 10。
-
EFA は NCCL 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 を機能させるには、自己参照のインバウンドルールとアウトバウンドルール (セキュリティグループ自体を送信元および送信先とするすべてのトラフィックを許可) が不可欠です。これらのルールがない場合は、インスタンス間の EFA トラフィックがブロックされ、NCCL 通信が失敗します。
その他のシナリオについてはさまざまなユースケースのセキュリティグループのルールを参照してください。
EFA 対応のセキュリティグループを作成するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。
-
ナビゲーションペインで [Security Groups] (セキュリティグループ) を選択して、[Create security group] (セキュリティグループの作成) を選択してください。
-
[Create security group] (セキュリティグループの作成) ウィンドウで、以下を行います。
-
[セキュリティグループ名] に、EFA-enabled security
group のような、分かりやすいセキュリティグループ名を入力してください。
-
(オプション) [説明] に、セキュリティグループの簡単な説明を入力してください。
-
[VPC] で、EFA 対応のインスタンスを起動する VPC を選択してください。
-
[セキュリティグループの作成] を選択してください。
-
作成したセキュリティグループを選択し、[Details] (詳細) タブで [Security group ID] (セキュリティグループ ID) をコピーします。
-
セキュリティグループが選択された状態で、[Actions] (アクション)、[Edit inbound rules] (インバウンドルールの編集) の順に選択し、次の手順を実行します。
-
[Add rule] を選択してください。
-
[Type] で、[All traffic] を選択してください。
-
[Source type] (送信元タイプ) で、[Custom] (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。
-
[ルールを追加] を選択してください。
-
[タイプ] で SSH] を選択してください。
-
[Source type] (ソースタイプ) で、[Anywhere-IPv4] を選択してください。
-
[Save Rules] (ルールの保存) を選択してください。
-
セキュリティグループが選択された状態で、[Actions] (アクション)、[Edit outbound rules] (アウトバウンドルールの編集) の順に選択し、次の手順を実行します。
-
[Add rule] を選択してください。
-
[Type] で、[All traffic] を選択してください。
-
[Destination type] (送信先タイプ) で、[Custom] (カスタム) を選択し、コピーしたセキュリティグループ ID をフィールドに貼り付けます。
-
[Save Rules] (ルールの保存) を選択してください。
ステップ 2: 一時インスタンスを作成する
EFA ソフトウェアコンポーネントのインストールおよび設定に使用する一時インスタンスを起動します。このインスタンスを使用して、EFA 対応のインスタンスを起動する EFA 対応の AMI を作成します。
一時インスタンスを起動するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。
-
ナビゲーションペインで、[Instances] (インスタンス) を選択し、[Launch Instances] (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。
-
(オプション) [Name and tags] (名前とタグ) セクションで、EFA-instance などのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (Name=EFA-instance)。
-
[アプリケーションと OS のイメージ] セクションで、サポートされるオペレーティングシステムのいずれかに対応する AMI を選択してください。
-
[インスタンスタイプ] セクションで、サポートされているインスタンスタイプを選択してください。
-
[Key pair] (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。
-
[Network settings] (ネットワーク設定) セクションで、[Edit] (編集) を選択し、次の操作を行います。
-
[サブネット] で、インスタンスを起動するサブネットを選択してください。
サブネットを選択する必要があります。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。
-
[Firewall (security groups)] (ファイアウォール (セキュリティグループ)) の場合、[Select existing security group] (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択してください。
-
[高度な設定] セクションを展開します。
ネットワークインターフェイス 1 では[ネットワークカードインデックス = 0]、[デバイスインデックス = 0]、および[インターフェイスタイプ = EFA と ENA の組み合わせ] を選択してください。
(オプション) マルチカードインスタンスタイプを使用している場合は、必要な追加のネットワークインターフェイスごとに [ネットワークインターフェイスを追加] を選択し、[ネットワークカードインデックス] で次の未使用インデックスを選択してから、[デバイスインデックス = 1] および [インターフェイスタイプ = EFA と ENA の組み合わせ] または [EFA のみ] を選択してください。
-
[Storage] (ストレージ) セクションで、必要に応じてボリュームを設定します。
NVIDIA CUDA ツールキットには 10~20 GiB のストレージを追加でプロビジョニングする必要があります。十分な量のストレージをプロビジョニングしない場合、NVIDIA ドライバーと CUDA ツールキットをインストールしようとするときに insufficient disk
space エラーが発生します。
-
右側の [合計mary] (サマリー) パネルで、[Launch instance] (インスタンスの起動) を選択してください。
ステップ 3: NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、cuDNN をインストールする
- Amazon Linux 2023
-
NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、cuDNN をインストールする
-
すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。
$ sudo dnf upgrade -y && sudo reboot
インスタンスの再起動後に、再接続します。
-
NVIDIA GPU ドライバーと NVIDIA CUDA ツールキットをインストールするために必要なユーティリティをインストールします。
$ sudo dnf groupinstall 'Development Tools' -y && sudo dnf install -y dkms kernel-devel-$(uname -r) kernel-headers-$(uname -r)
-
nouveau オープンソースドライバーを無効にします。
-
必要なユーティリティ、および現在実行しているカーネルのバージョン用のカーネルヘッダーパッケージをインストールします。
$ sudo yum install -y wget kernel-devel-$(uname -r) kernel-headers-$(uname -r)
-
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
-
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
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
CUDA ネットワークリポジトリを追加します。
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
-
NVIDIA GPU ドライバーをダウンロードしてインストールします。
$ wget https://us.download.nvidia.com/tesla/580.167.08/NVIDIA-Linux-x86_64-580.167.08.run \
&& sudo sh NVIDIA-Linux-x86_64-580.167.08.run -m kernel-open --no-drm --disable-nouveau --dkms --silent
-
NVIDIA CUDA ツールキットと cuDNN をインストールします。
$ sudo dnf install -y cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-devel-cuda-13
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
(P シリーズのマルチ GPU インスタンスなど、NVSwitch を使用するインスタンス) NVIDIA Fabric Manager をインストールして起動します。G シリーズインスタンスは NVSwitch を使用しないため、Fabric Manager は必要ありません。
$ sudo dnf install -y https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/nvidia-fabricmanager-580.167.08-1.el8.x86_64.rpm \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
-
インスタンスが起動するたびに 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
-
以下のコマンドを実行して、NVIDIA GPU ドライバーが機能することを確認します。
$ nvidia-smi -q | head
このコマンドは NVIDIA GPU、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキットに関する情報を返します。
- Ubuntu 26.04, Ubuntu 24.04, and Ubuntu 22.04
-
NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、cuDNN をインストールする
-
すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。
$ sudo apt-get update && sudo apt-get upgrade -y
-
NVIDIA GPU ドライバーと NVIDIA CUDA ツールキットをインストールするために必要なユーティリティをインストールします。
$ sudo apt-get update && sudo apt-get install build-essential -y
-
NVIDIA GPU ドライバーを使用するには、最初に nouveau オープンソースドライバーを無効にする必要があります。
-
必要なユーティリティ、および現在実行しているカーネルのバージョン用のカーネルヘッダーパッケージをインストールします。
$ sudo apt-get install -y gcc make linux-headers-$(uname -r)
-
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
-
任意のテキストエディタを使用して /etc/default/grub ファイルを開き、以下を追加します。
GRUB_CMDLINE_LINUX="rdblacklist=nouveau"
-
GRUB 設定を再構築します。
$ sudo update-grub
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
CUDA リポジトリを追加し、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、および cuDNN をインストールします。
-
Ubuntu 26.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2604/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo add-apt-repository -y 'deb [trusted=yes] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2604/x86_64 /' \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open cuda-toolkit-13-3 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
-
Ubuntu 24.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo add-apt-repository -y 'deb [trusted=yes] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 /' \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open-580 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
-
Ubuntu 22.04
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo DEBIAN_FRONTEND=noninteractive add-apt-repository -y "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /" \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open-580 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
(P シリーズのマルチ GPU インスタンスなど、NVSwitch を使用するインスタンス) NVIDIA Fabric Manager をインストールして起動します。G シリーズインスタンスは NVSwitch を使用しないため、Fabric Manager は必要ありません。
-
Ubuntu 26.04
$ sudo apt-get install -y nvidia-fabricmanager \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
-
Ubuntu 24.04 と Ubuntu 22.04
$ sudo apt-get install -y nvidia-fabricmanager-580 \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
-
インスタンスが起動するたびに 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
-
以下のコマンドを実行して、NVIDIA GPU ドライバーが機能することを確認します。
$ nvidia-smi -q | head
このコマンドは NVIDIA GPU、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキットに関する情報を返します。
- Debian 12
-
NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、cuDNN をインストールする
-
NVIDIA GPU ドライバーと NVIDIA CUDA ツールキットをインストールするために必要なユーティリティをインストールします。
$ sudo apt-get install -y build-essential gcc make linux-headers-$(uname -r) dkms
-
nouveau オープンソースドライバーを無効にします。
$ sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="rdblacklist=nouveau"/' /etc/default/grub && sudo update-grub
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
CUDA リポジトリを追加し、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、および cuDNN をインストールします。
$ wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/cuda-keyring_1.1-1_all.deb \
&& sudo dpkg -i cuda-keyring_1.1-1_all.deb \
&& sudo DEBIAN_FRONTEND=noninteractive add-apt-repository -y "deb https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/ /" \
&& sudo apt-get update
$ sudo apt-get install -y nvidia-open cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-dev-cuda-13
-
NVIDIA UVM カーネルモジュールを設定します。
$ uvm_ko=$(find /lib/modules/$(uname -r) -name 'nvidia*uvm*.ko*' 2>/dev/null | head -1) && if [ -n "$uvm_ko" ]; then real=$(basename "$uvm_ko"); real=${real%.ko*}; echo "$real" | sudo tee /etc/modules-load.d/nvidia-uvm.conf; if [ "$real" != "nvidia-uvm" ]; then echo "alias nvidia-uvm $real" | sudo tee /etc/modprobe.d/nvidia-uvm.conf; fi; sudo modprobe "$real" || true; fi && sudo modprobe nvidia
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
(P シリーズのマルチ GPU インスタンスなど、NVSwitch を使用するインスタンス) NVIDIA Fabric Manager をインストールして起動します。G シリーズインスタンスは NVSwitch を使用しないため、Fabric Manager は必要ありません。
-
NVIDIA カーネルモジュールのバージョンを確認します。
$ cat /proc/driver/nvidia/version | grep "Kernel Module"
以下は出力の例です。
NVRM version: NVIDIA UNIX x86_64 Kernel Module 610.43.02 ...
上記の例では、メジャーバージョン 610 のカーネルモジュールをインストールしました。
-
前のステップで特定したメジャーバージョンを使用して NVIDIA Fabric Manager をインストールします。
$ sudo apt-get install -y nvidia-fabricmanager-major_version_number \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
-
インスタンスが起動するたびに 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
-
以下のコマンドを実行して、NVIDIA GPU ドライバーが機能することを確認します。
$ nvidia-smi -q | head
このコマンドは NVIDIA GPU、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキットに関する情報を返します。
- RHEL 10
-
NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、cuDNN をインストールする
-
すべてのソフトウェアパッケージが最新の状態であることを確認するため、インスタンスでソフトウェアの更新を実行します。
$ sudo dnf upgrade -y && sudo reboot
インスタンスの再起動後に、再接続します。
-
NVIDIA GPU ドライバーと NVIDIA CUDA ツールキットをインストールするために必要なユーティリティをインストールします。
$ sudo dnf groupinstall 'Development Tools' -y \
&& sudo dnf install -y dkms kernel-devel-$(uname -r) \
&& sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-10.noarch.rpm
-
nouveau オープンソースドライバーを無効にします。
-
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
-
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
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
CUDA リポジトリを追加し、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキット、および cuDNN をインストールします。
$ sudo yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/cuda-rhel10.repo \
&& sudo dnf install -y nvidia-open-580.167.08 cuda-toolkit-13-0 libcudnn9-cuda-13 libcudnn9-devel-cuda-13
-
インスタンスを再起動して、そのインスタンスに再接続します。
-
(P シリーズのマルチ GPU インスタンスなど、NVSwitch を使用するインスタンス) NVIDIA Fabric Manager をインストールして起動します。G シリーズインスタンスは NVSwitch を使用しないため、Fabric Manager は必要ありません。
$ sudo dnf install -y https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/nvidia-fabricmanager-580.167.08-1.x86_64.rpm \
&& sudo systemctl enable nvidia-fabricmanager && sudo systemctl start nvidia-fabricmanager
-
インスタンスが起動するたびに 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
-
以下のコマンドを実行して、NVIDIA GPU ドライバーが機能することを確認します。
$ nvidia-smi -q | head
このコマンドは NVIDIA GPU、NVIDIA GPU ドライバー、NVIDIA CUDA ツールキットに関する情報を返します。
ステップ 4: GDRCopy をインストールする
GDRCopy をインストールして Libfabric のパフォーマンスを向上させます。GDRCopy の詳細については「GDRCopy レポジトリ」を参照してください。
- Amazon Linux 2023
-
GDRCopy をインストールするには
-
必要な依存ファイルをインストールします。
$ sudo yum -y install dkms rpm-build make check check-devel
-
GDRCopy パッケージをダウンロードして解凍します。
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
-
GDRCopy RPM パッケージを構築します。
$ CUDA=/usr/local/cuda ./build-rpm-packages.sh
-
GDRCopy RPM パッケージをインストールします。
$ sudo rpm -Uvh gdrcopy-kmod-2.5.2*dkms*.rpm \
&& sudo rpm -Uvh gdrcopy-2.5.2*.rpm \
&& sudo rpm -Uvh gdrcopy-devel-2.5.2*.rpm
- Ubuntu 26.04, Ubuntu 24.04, and Ubuntu 22.04
-
GDRCopy をインストールするには
-
必要な依存ファイルをインストールします。
$ sudo apt-get install -y build-essential devscripts debhelper fakeroot pkg-config dkms
Ubuntu 22.04 では、次の追加の依存関係もインストールします。
$ sudo apt-get install -y check libsubunit-dev
-
GDRCopy パッケージをダウンロードして解凍し、パッケージを構築します。
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz \
&& cd gdrcopy-2.5.2/packages \
&& CUDA=/usr/local/cuda ./build-deb-packages.sh
-
GDRCopy DEB パッケージをインストールします。
$ sudo dpkg -i gdrdrv-dkms_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i libgdrapi_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i gdrcopy-tests_2.5.2-1_amd64.*.deb \
&& sudo dpkg -i gdrcopy_2.5.2-1_amd64.*.deb
- Debian 12
-
GDRCopy をインストールするには
-
必要な依存ファイルをインストールします。
$ sudo apt-get install -y build-essential devscripts debhelper fakeroot pkg-config dkms
-
GDRCopy パッケージをダウンロードして解凍します。
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
-
Debian バージョンパッチを適用し、パッケージを構築します。
$ sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-lib/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-tests/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' dkms/debian/changelog \
&& sed -i 's/(2.5.2)/(2.5.2-1)/g' debian-meta/changelog \
&& sed -i 's/FULL_VERSION="${VERSION}"/FULL_VERSION="${VERSION}-${DEBIAN_VERSION}"/g' build-deb-packages.sh
$ CUDA=/usr/local/cuda ./build-deb-packages.sh
-
GDRCopy DEB パッケージをインストールします。
$ sudo dpkg -i gdrdrv-dkms_2.5.2*.deb \
&& sudo dpkg -i libgdrapi_2.5.2*.deb \
&& sudo dpkg -i gdrcopy-tests_2.5.2*.deb \
&& sudo dpkg -i gdrcopy_2.5.2*.deb
- RHEL 10
-
GDRCopy をインストールするには
-
必要な依存ファイルをインストールします。
$ sudo yum -y install dkms rpm-build make check check-devel
-
GDRCopy パッケージをダウンロードして解凍します。
$ wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.2.tar.gz \
&& tar xf v2.5.2.tar.gz && cd gdrcopy-2.5.2/packages
-
GDRCopy RPM パッケージを構築します。
$ CUDA=/usr/local/cuda ./build-rpm-packages.sh
-
GDRCopy RPM パッケージをインストールします。
$ sudo rpm -Uvh gdrcopy-kmod-2.5.2*dkms*.rpm \
&& sudo rpm -Uvh gdrcopy-2.5.2*.rpm \
&& sudo rpm -Uvh gdrcopy-devel-2.5.2*.rpm
ステップ 5: EFA ソフトウェアをインストールする
一時インスタンスで EFA をサポートするために必要な EFA 対応のカーネル、EFA ドライバー、Libfabric、および Open MPI スタックをインストールします。
EFA ソフトウェアをインストールするには
-
起動したインスタンスに接続します。詳細については、「SSH を使用した Linux インスタンスへの接続」を参照してください。
-
EFA ソフトウェアのインストールファイルをダウンロードします。ソフトウェアのインストールファイルは圧縮された tar (.tar.gz) ファイルとして提供されます。次のコマンドを使用して、安定している最新バージョンをダウンロードします。
$ curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.50.0.tar.gz
前述のコマンドのバージョン番号を latest に置き換えることで最新バージョンを取得することもできます。
(オプション) EFA tarball (.tar.gz) ファイルの認証と完全性を検証します。
ソフトウェアパブリッシャーの ID を検証し、発行後にファイルの改変や破損がないことを確認するために、これを行うことをお勧めします。tar ファイルを検証しない場合はこの手順をスキップします。
-
パブリック GPG キーをダウンロードして、キーリングにインポートします。
$ wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.key
コマンドはキーの値を返します。次の手順で必要になるため、キーの値を書きとめておきます。
-
GPG キーのフィンガープリントを検証します。次のコマンドを実行し、前のステップで作成したキーの値を指定します。
$ gpg --fingerprint key_value
コマンドは4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC と同じフィンガープリントを返します。フィンガープリントが一致しない場合はEFA インストールスクリプトを実行せず、サポート にお問い合わせください。
-
署名ファイルをダウンロードし、EFA tar ファイルの署名を検証します。
$ wget https://efa-installer.amazonaws.com/aws-efa-installer-1.50.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.50.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 インストールスクリプトを実行せず、サポート にお問い合わせください。
-
圧縮された .tar.gz ファイルからファイルを展開し、展開されたディレクトリに移動します。
$ tar -xf aws-efa-installer-1.50.0.tar.gz && cd aws-efa-installer
(オプション) インストール中に個々のパッケージ署名を検証します。
EFA インストーラ 1.48.0 以降では、インストーラには GPG 署名の個々の RPM および DEB パッケージが含まれています。インストール中に個々のパッケージの信頼性と整合性を検証するには、--check-signatures フラグを使用します。このフラグを有効にすると、まず、インストーラはすべてのパッケージ署名を検証し、すべてのパッケージが検証に合格した場合にのみインストールを続行します。パッケージが検証に失敗すると、インストーラは何もインストールせずにすぐに終了します。
-
GPG 公開鍵をダウンロードします。
$ wget https://efa-installer.amazonaws.com/aws-efa-installer.key
-
キーパスをエクスポートします。次に、次のステップで、インストールコマンドに --check-signatures を追加し、sudo の代わりに sudo -E を使用して環境変数を保持します。
$ export EFA_INSTALLER_KEY=$(pwd)/aws-efa-installer.key
RPM ベースのシステム (Amazon Linux 2023、RHEL、Rocky Linux、SUSE) では、インストーラが rpm --checksig を使用して各 RPM を検証します。DEB ベースのシステム (Ubuntu、Debian) では、インストーラは GPG 署名検証を使用して各 DEB を検証します。パッケージのいずれかで検証が失敗した場合は、インストールが直ちに中止されます。
--check-signatures フラグはオプションです。これがないと、インストーラは個々の署名検証を実行しません。
-
EFA ソフトウェアのインストールスクリプトを実行します。
前のオプションステップを完了してパッケージ署名の検証をセットアップした場合は、インストールコマンドに --check-signatures を追加して、sudo の代わりに sudo -E を使用します。例: sudo -E ./efa_installer.sh -y --mpi=openmpi5 --check-signatures。
EFA 1.30.0 からは Open MPI 4.1 と Open MPI 5 の両方がデフォルトでインストールされます。Open MPI 4.1 が必要な場合を除き、Open MPI 5 のみをインストールすることをお勧めします。以下のコマンドは Open MPI 5 のみをインストールします。Open MPI 4.1 と Open MPI 5 をインストールする場合は --mpi=openmpi5 を削除してください。
$ sudo ./efa_installer.sh -y --mpi=openmpi5
Libfabric は /opt/amazon/efa ディレクトリにインストールされます。aws-ofi-nccl プラグインは /opt/amazon/ofi-nccl ディレクトリにインストールされます。オープン MPI は /opt/amazon/openmpi ディレクトリにインストールされます。
-
EFA インストーラーでインスタンスの再起動を求めるメッセージが表示された場合は再起動してからインスタンスに再接続します。それ以外の場合はインスタンスからログアウトし、再度ログインしてインストールを完了します。
-
EFA ソフトウェアが正常にインストールされたことを確認します。
$ fi_info -p efa -t FI_EP_RDM
コマンドによって、Libfabric の EFA インターフェイスに関する情報が返ります。
ステップ 6: NCCL をインストールする
NCCL をインストールします。NCCL に関する詳細についてはNCCL repositoryを参照してください。
NCCL をインストールするには
-
/opt ディレクトリに移動します。
$ cd /opt
-
公式の NCCL リポジトリをインスタンスにクローンし、ローカルのクローンされたリポジトリに移動します。
$ sudo git clone https://github.com/NVIDIA/nccl.git -b v2.30.4-1 && cd nccl
-
NCCL を構築およびインストールし、CUDA インストールディレクトリを指定します。
$ sudo make -j src.build CUDA_HOME=/usr/local/cuda-13
ステップ 7: NCCL テストをインストールする
NCCL テストをインストールします。NCCL テストではNCCL が適切にインストールされていることを確認し、想定どおりに機能していることを確認できます。NCCL テストに関する詳細についてはnccl-tests リポジトリを参照してください。
NCCL テストをインストールするには
-
ホームディレクトリに移動します。
$ cd $HOME
-
公式の nccl-tests リポジトリをインスタンスにクローンし、ローカルのクローンされたリポジトリに移動します。
$ git clone https://github.com/NVIDIA/nccl-tests.git && cd nccl-tests
-
Libfabric ディレクトリを LD_LIBRARY_PATH 変数に追加します。
-
Amazon Linux 2023
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
-
Ubuntu と Debian
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib:$LD_LIBRARY_PATH
-
RHEL 10
$ export LD_LIBRARY_PATH=/opt/amazon/efa/lib64:$LD_LIBRARY_PATH
-
NCCL テストをインストールし、MPI、NCCL、CUDA インストールディレクトリを指定します。
$ make MPI=1 MPI_HOME=/opt/amazon/openmpi NCCL_HOME=/opt/nccl/build CUDA_HOME=/usr/local/cuda-13
ステップ 8: EFA と NCCL の設定をテストする
テストを実行し、EFA と NCCL に一時インスタンスが適切に設定されていることを確認します。
EFA と NCCL 設定をテストするには
-
テストを実行するホストを指定するホストファイルを作成します。以下のコマンドはインスタンス自体へのリファレンスを含む 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
-
NCCL テストを実行します。次のコマンドは、インスタンスごとに GPU が 8 個あることを前提としています。-n と -N の値は、インスタンスタイプに基づいて調整してください。
$ /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
-
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: 機械学習アプリケーションをインストールする
機械学習アプリケーションを一時インスタンスにインストールします。インストール手順はそれぞれの機械学習アプリケーションによって異なります。お使いの Linux インスタンスへのソフトウェアインストールの詳細については、「Amazon Linux 2023 ユーザーガイド」の「OS 更新の管理」を参照してください。
インストール手順については機械学習アプリケーションのドキュメントを参照してください。
ステップ 10: EFA および NCCL 対応 AMI を作成する
必要なソフトウェアコンポーネントのインストール後、EFA 対応のインスタンスの起動に再利用できる AMI を作成します。
一時インスタンスから AMI を作成するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。
-
ナビゲーションペインで、[インスタンス] を選択してください。
-
作成した一時インスタンスを選択し、[アクション]、[イメージ]、[イメージの作成] の順に選択してください。
-
[イメージの作成] で、次を行います。
-
[イメージ名] に、の分かりやすい AMI 名を入力してください。
-
(オプション) [イメージの説明] に、AMI の簡単な説明を入力してください。
-
[イメージを作成] を選択してください。
-
ナビゲーションペインで [AMI] を選択してください。
-
リストで作成した AMI を探します。ステータスが pending から available に変わるまで待ってから、次のステップに進みます。
ステップ 11: 一時インスタンスを終了する
この時点で、起動した一時インスタンスは不要になります。インスタンスを終了して、料金の発生を停止できます。
ステップ 12: クラスタープレイスメントグループで EFA および NCCL 対応のインスタンスを作成する
前に作成した EFA 対応の AMI と EFA 対応のセキュリティグループを使用して、EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループ内で起動します。
-
EFA 対応のインスタンスをクラスタープレイスメントグループに起動することは絶対的な要件ではありません。ただし、EFA 対応のインスタンスは 1 つのアベイラビリティーゾーン内の低レイテンシーグループに起動されるため、クラスタープレイスメントグループで実行することをお勧めします。
-
クラスターのインスタンスをスケールするときにキャパシティを使用できるようにするにはクラスタープレイスメントグループのキャパシティ予約を作成します。詳細については、「プレイスメントグループにキャパシティ予約を使用する」を参照してください。
- New console
-
一時インスタンスを起動するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。
-
ナビゲーションペインで、[Instances] (インスタンス) を選択し、[Launch Instances] (インスタンスの起動) を選択して、新しいインスタンス起動ウィザードを開きます。
-
(オプション) [Name and tags] (名前とタグ) セクションで、EFA-instance などのインスタンス名を指定します。指定した名前はリソースタグとしてインスタンスに割り当てられます (Name=EFA-instance)。
-
[Application and OS Images] (アプリケーションと OS イメージ) セクションで、[My AMI] (マイ AMI) をクリックし、前のステップで作成した AMI を選択してください。
-
[Instance type] (インスタンスタイプ) セクションで、p3dn.24xlarge または p4d.24xlarge のいずれかを選択してください。
-
[Key pair] (キーペア) セクションで、インスタンスに使用するキーペアを選択してください。
-
[Network settings] (ネットワーク設定) セクションで、[Edit] (編集) を選択し、次の操作を行います。
-
[サブネット] で、インスタンスを起動するサブネットを選択してください。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。
-
[Firewall (security groups)] (ファイアウォール (セキュリティグループ)) の場合、[Select existing security group] (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択してください。
-
[高度な設定] セクションを展開します。
ネットワークインターフェイス 1 では[ネットワークカードインデックス = 0]、[デバイスインデックス = 0]、および[インターフェイスタイプ = EFA と ENA の組み合わせ] を選択してください。
(オプション) p4d.24xlarge または p5.48xlarge などのマルチカードインスタンスタイプを使用している場合は必要な追加のネットワークインターフェイスごとに[ネットワークインターフェイスの追加] を選択し、ネットワークカードインデックスの場合は次の未使用インデックスを選択してから、[デバイスインデックス = 1]、[インターフェイスタイプ = ENA を含む EFA] または [EFA のみ] を選択してください。
-
(オプション) [Storage] (ストレージ) セクションで、必要に応じてボリュームを設定します。
-
[Advanced details] (高度な詳細) セクションの [Placement group name] (プレイスメントグループ名) で、インスタンスを起動するクラスタープレイスメントグループを選択してください。新しいクラスタープレイスメントグループを作成する必要がある場合は[Create new placement group] (新しいプレイスメントグループの作成) を選択してください。
-
右側の [合計mary] (サマリー) パネルで、[Number of instances] (インスタンス数) に、起動する EFA 対応のインスタンスの数を入力し、[Launch Instance] (インスタンスの起動) を選択してください。
- Old console
-
EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループに起動するには
Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。
-
[インスタンスの作成] を選択してください。
-
[AMI の選択] ページで、[マイ AMI] を選択し、前に作成した AMI を見つけて、[選択] をクリックしてください。
-
[インスタンスタイプの選択] ページで [p3dn.24xlarge] を選択し、[次へ: インスタンスの詳細の設定] を選択してください。
-
[インスタンスの詳細設定] ページで、以下の操作を実行します。
-
[インスタンス数] に、起動する EFA および NCCL 対応のインスタンスの数を入力してください。
-
[ネットワーク] および [サブネット] で、インスタンスを起動する VPC およびサブネットを選択してください。
-
[プレイスメントグループ] で、[インスタンスをプレイスメントグループに追加します] チェックボックスをオンにします。
-
[プレイスメントグループ名] で、[新しいプレイスメントグループに追加する] チェックボックスをオンにし、分かりやすいプレイスメントグループ名を入力してください。次に、[プレイスメントグループ戦略] で [クラスター] を選択してください。
-
[EFA] で、[有効化] を選択してください。
-
[ネットワークインターフェイス] セクションの [eth0] で、[新しいネットワークインターフェイス] を選択してください。必要に応じて、プライマリ IPv4 アドレスと 1 つ以上のセカンダリ IPv4 アドレスを指定できます。関連付けられている IPv6 CIDR ブロックを持つサブネットにインスタンスを起動する場合は必要に応じて、プライマリ IPv6 アドレスと 1 つ以上のセカンダリ IPv6 アドレスを指定できます。
-
[次の手順: ストレージの追加] を選択してください。
-
[ストレージの追加] ページで、AMI で指定されたボリューム (ルートデバイスボリュームなど) に加えてインスタンスにアタッチするボリュームを指定します。次に、[次の手順: タグの追加] を選択してください。
-
[Add Tags] ページで、ユーザーフレンドリーな名前などを使ってインスタンスのタグを指定し、[Next: Configure Security Group] を選択してください。
-
[セキュリティグループの設定] ページの [セキュリティグループの割り当て] で、[既存のセキュリティグループの選択] を選択し、前に作成したセキュリティグループを選択してください。
-
[Review and Launch] を選択してください。
-
[インスタンス作成の確認] ページで設定を確認し、[起動] を選択してキーペアを選択し、インスタンスを起動します。
ステップ 13: パスワードレス SSH を有効にする
デフォルトの SSH ユーザーはオペレーティングシステムに応じて異なり、Ubuntu では ubuntu、Debian では admin、Amazon Linux および RHEL では ec2-user になります。
クラスター内のすべてのインスタンスでアプリケーションを実行できるようにするにはリーダーノードからメンバーノードへのパスワードなしの SSH アクセスを有効にする必要があります。リーダーノードはアプリケーションを実行するインスタンスです。クラスター内の残りのインスタンスはメンバーノードです。
クラスター内のインスタンス間でパスワードなしの SSH を有効にするには
-
クラスター内の 1 つのインスタンスをリーダーノードとして選択し、それに接続します。
-
リーダーノード上で strictHostKeyChecking を無効にし ForwardAgent を有効にします。任意のテキストエディタを使用して ~/.ssh/config ファイルを開き、以下を追加します。
Host *
ForwardAgent yes
Host *
StrictHostKeyChecking no
-
RSA キーペアを生成します。
$ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
キーペアは$HOME/.ssh/ ディレクトリで作成されます。
-
リーダーノードのプライベートキーの許可を変更します。
$ chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/config
-
任意のテキストエディタで ~/.ssh/id_rsa.pub を開き、キーをコピーします。
-
クラスター内の各メンバーノードについて、次の操作を行います。
-
インスタンスに接続します。
-
任意のテキストエディタで ~/.ssh/authorized_keys を開き、前にコピーしたパブリックキーを追加します。
-
パスワードレス SSH が正常に機能していることをテストするにはリーダーノードに接続して、次のコマンドを実行します。
$ ssh member_node_private_ip
キーまたはパスワードの入力を求められずに、メンバーノードに接続できるはずです。