Amazon EC2 の ML ワークロードに対して EFA と NCCL の使用を開始する
NVIDIA Collective Communications Library (NCCL) は、単一のノードまたは複数のノードの複数の GPU のための集合的な標準コミュニケーションルーチンのライブラリです。NCCL は、各種の機械学習のワークロードをサポートするために、EFA、Libfabric、MPI と共に使用できます。詳細については、NCCL
次の手順で、いずれかのサポートされているオペレーティングシステムのベース AMI を使用して EFA および NCCL を開始することができます。
注記
-
p3dn.24xlarge
、p4d.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 対応のセキュリティグループを準備する
- ステップ 2: 一時インスタンスを作成する
- ステップ 3: Nvidia GPU ドライバー、Nvidia CUDA ツールキットおよび cuDNN をインストールする
- ステップ 4: GDRCopy をインストールする
- ステップ 5: EFA ソフトウェアをインストールする
- ステップ 6: NCCL をインストールする
- ステップ 7: aws-ofi-nccl プラグインをインストールする
- ステップ 8: NCCL テストをインストールする
- ステップ 9: EFA と NCCL の設定をテストする
- ステップ 10: 機械学習アプリケーションをインストールする
- ステップ 11: EFA および NCCL 対応 AMI を作成する
- ステップ 12: 一時インスタンスを終了する
- ステップ 13: クラスタープレイスメントグループに EFA および NCCL 対応インスタンスを起動する
- ステップ 14: パスワードレス SSH を有効にする
ステップ 1: EFA 対応のセキュリティグループを準備する
EFA には、セキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。以下の手順では、セキュリティグループを作成します。このセキュリティグループでは、セキュリティグループ自体とのすべてのインバウンドおよびアウトバウンドのトラフィックと、SSH 接続用の任意の IPv4 アドレスからのインバウンド SSH トラフィックを許可します。
重要
このセキュリティグループは、テストのみを目的としています。本番環境では、コンピュータの IP アドレスやローカルネットワークの IP アドレスの範囲など、接続元の IP アドレスからのトラフィックのみを許可するインバウンド SSH ルールを作成することをお勧めします。
その他のシナリオについては、さまざまなユースケースのセキュリティグループのルールを参照してください。
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
-
[Application and OS Images] (アプリケーションと OS イメージ) セクションで、サポートされるオペレーティングシステムを選択します。Amazon Linux 2、Ubuntu 20.04、および Ubuntu 22.04 のみがサポートされています。
-
[インスタンスタイプ] セクションで、
p3dn.24xlarge
、p4d.24xlarge
またはp5.48xlarge
のいずれかを選択します。 -
[Key pair] (キーペア) セクションで、インスタンスに使用するキーペアを選択します。
-
[Network settings] (ネットワーク設定) セクションで、[Edit] (編集) を選択し、次の操作を行います。
-
[サブネット] で、インスタンスを起動するサブネットを選択します。サブネットを選択しない場合、EFA のインスタンスを有効にすることはできません。
-
[Firewall (security groups)] (ファイアウォール (セキュリティグループ)) の場合、[Select existing security group] (既存のセキュリティグループの選択) を選択し、前のステップで作成したセキュリティグループを選択します。
-
[Advanced network configuration] (高度なネットワーク設定) セクションを展開し、[Elastic Fabric Adapter] の [Enable] (有効) を選択します。
-
-
[Storage] (ストレージ) セクションで、必要に応じてボリュームを設定します。
注記
Nvidia CUDA ツールキットには、追加の 10 ~ 20 GiB のストレージをプロビジョニングする必要があります。十分な量のストレージをプロビジョニングしないと、Nvidia ドライバーと CUDA ツールキットをインストールしようとしたときに、
insufficient disk space
エラーが発生します。 -
右側の [Summary] (サマリー) パネルで、[Launch instance] (インスタンスの起動) を選択します。
ステップ 3: Nvidia GPU ドライバー、Nvidia CUDA ツールキットおよび cuDNN をインストールする
ステップ 4: GDRCopy をインストールする
GDRCopy をインストールして Libfabric のパフォーマンスを向上させます。GDRCopy の詳細については、「GDRCopy レポジトリ
ステップ 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.35.0.tar.gz前述のコマンドのバージョン番号を
latest
に置き換えることで最新バージョンを取得することもできます。 (オプション) EFA tarball (
.tar.gz
) ファイルの認証と完全性を検証します。ソフトウェア発行元の ID を検証し、発行後にファイルの改変や破損がないことを確認するために、これを行うことをお勧めします。tar ファイルを検証しない場合は、この手順をスキップします。
注記
代わりに、MD5 または SHA256 チェックサムを使用して tar ファイルを検証する場合は、チェックサムを使用した EFA インストーラの検証を参照してください。
-
パブリック GPG キーをダウンロードして、キーリングにインポートします。
$
wget https://efa-installer.amazonaws.com/aws-efa-installer.key && gpg --import aws-efa-installer.keyコマンドはキーの値を返します。次の手順で必要になるため、キーの値を書きとめておきます。
-
GPG キーのフィンガープリントを検証します。次のコマンドを実行し、前のステップで作成したキーの値を指定します。
$
gpg --fingerprintkey_value
コマンドは、
4E90 91BC BB97 A96B 26B1 5E59 A054 80B1 DD2D 3CCC
と同じフィンガープリントを返します。フィンガープリントが一致しない場合は、EFA インストールスクリプトを実行せず、AWS Support にお問い合わせください。 -
署名ファイルをダウンロードし、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 にお問い合わせください。
-
-
圧縮された
.tar.gz
ファイルからファイルを展開し、展開されたディレクトリに移動します。$
tar -xf aws-efa-installer-1.35.0.tar.gz && cd aws-efa-installer -
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=openmpi4Libfabric は、
/opt/amazon/efa
ディレクトリにインストールされているのに対し、Open MPI は/opt/amazon/openmpi
ディレクトリにインストールされています。 -
EFA インストーラーでインスタンスの再起動を求めるメッセージが表示された場合は、再起動してからインスタンスに再接続します。それ以外の場合は、インスタンスからログアウトし、再度ログインしてインストールを完了します。
-
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 をインストールするには
-
/opt
ディレクトリに移動します。$
cd /opt -
公式の NCCL リポジトリをインスタンスにクローンし、ローカルのクローンされたリポジトリに移動します。
$
sudo git clone https://github.com/NVIDIA/nccl.git && cd nccl -
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 プラグインをインストールするには
-
ホームディレクトリに移動します。
$
cd $HOME -
必要なユーティリティをインストールします。
-
Amazon Linux 2
$
sudo yum install hwloc-devel -
Ubuntu
$
sudo apt-get install libhwloc-dev
-
-
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 -
圧縮された .tar.gz ファイルからファイルを展開し、展開されたディレクトリに移動します。
$
tar -xf aws-ofi-nccl-1.11.0-aws.tar.gz && cd aws-ofi-nccl-1.11.0-aws -
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 -
Open MPI ディレクトリを
PATH
変数に追加します。$
export PATH=/opt/amazon/openmpi/bin/:$PATH -
aws-ofi-nccl プラグインをインストールします。
$
make && sudo make install
ステップ 8: 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 2
$
export LD_LIBRARY_PATH=/opt/amazon/efa/lib64
:$LD_LIBRARY_PATH -
Ubuntu
$
export LD_LIBRARY_PATH=/opt/amazon/efa/lib
:$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
ステップ 9: EFA と NCCL の設定をテストする
テストを実行し、EFA と NCCL に一時インスタンスが適切に設定されていることを確認します。
EFA と NCCL 設定をテストするには
-
テストを実行するホストを指定するホストファイルを作成します。以下のコマンドは、インスタンス自体へのリファレンスを含む
my-hosts
と呼ばれるホストファイルを作成します。 -
テストを実行し、ホストファイル (
--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
-
-
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 を作成するには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/
) を開きます。 -
ナビゲーションペインで、[インスタンス] を選択します。
-
作成した一時インスタンスを選択し、[アクション]、[イメージ]、[イメージの作成] の順に選択します。
-
[イメージの作成] で、次を行います。
-
[イメージ名] に、の分かりやすい AMI 名を入力します。
-
(オプション) [イメージの説明] に、AMI の簡単な説明を入力します。
-
[イメージを作成] を選択します。
-
-
ナビゲーションペインで [AMIs] を選択します。
-
リストで作成した AMI を探します。ステータスが
pending
からavailable
に変わるまで待ってから、次のステップに進みます。
ステップ 12: 一時インスタンスを終了する
この時点で、起動した一時インスタンスは不要になります。インスタンスを終了して、料金の発生を停止できます。
一時インスタンスを終了するには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/
) を開きます。 -
ナビゲーションペインで、[インスタンス] を選択します。
-
作成した一時インスタンスを選択し、[アクション]、[インスタンスの状態]、[インスタンスの終了] の順に選択します。
-
確認を求めるメッセージが表示されたら、[終了] を選択します。
ステップ 13: クラスタープレイスメントグループに EFA および NCCL 対応インスタンスを起動する
前に作成した EFA 対応の AMI と EFA 対応のセキュリティグループを使用して、EFA および NCCL 対応のインスタンスをクラスタープレイスメントグループ内で起動します。
注記
-
EFA 対応のインスタンスをクラスターのプレイスメントグループに起動することは絶対的な要件ではありません。ただし、EFA 対応のインスタンスは、1 つのアベイラビリティーゾーン内の低レイテンシーグループに起動されるため、クラスタープレイスメントグループで実行することをお勧めします。
-
クラスターのインスタンスをスケールするときにキャパシティを使用できるようにするには、クラスタープレイスメントグループのキャパシティ予約を作成します。詳細については、クラスタープレイスメントグループでキャパシティ予約を作成する を参照してください。
ステップ 14: パスワードレス SSH を有効にする
クラスター内のすべてのインスタンスでアプリケーションを実行できるようにするには、リーダーノードからメンバーノードへのパスワードなしの 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 が正常に機能していることをテストするには、リーダーノードに接続して、次のコマンドを実行します。
$
sshmember_node_private_ip
キーまたはパスワードの入力を求められずに、メンバーノードに接続できるはずです。