

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Elastic Fabric Adapter を使用した分散トレーニング
<a name="tutorial-efa"></a>

[Elastic Fabric Adapter](https://aws.amazon.com/hpc/efa/) (EFA) は、ハイパフォーマンスコンピューティング (HPC) アプリケーションを高速化するために DLAMI インスタンスにアタッチできるネットワークデバイスです。EFA を使用すると、 AWS クラウドが提供するスケーラビリティ、柔軟性、伸縮性で、オンプレミス HPC クラスターのアプリケーションパフォーマンスを実現できます。

以下のトピックでは、EFA と DLAMI の使用を開始する方法について説明します。

**注記**  
この [Base GPU DLAMI リスト](appendix-ami-release-notes.md#appendix-ami-release-notes-base)からお使いの DLAMI を選択してください。

**Topics**
+ [EFA を使用した AWS Deep Learning AMIs インスタンスの起動](tutorial-efa-launching.md)
+ [DLAMI での EFA の使用](tutorial-efa-using.md)

# EFA を使用した AWS Deep Learning AMIs インスタンスの起動
<a name="tutorial-efa-launching"></a>

最新版 Base DLAMI は EFA と共に使用する準備ができており、GPU インスタンス用の必要なドライバー、カーネルモジュール、Libfabric、OpenMPI および [NCCL OFI プラグイン](https://github.com/aws/aws-ofi-nccl/tree/aws)が付属しています。

サポートされている Base DLAMI の CUDA バージョンは、[リリースノート](appendix-ami-release-notes.md#appendix-ami-release-notes-base)で確認できます。

注記:
+ EFA 上の `mpirun` を使用して NCCL アプリケーションを実行する際、EFA がサポートされているインストレーションへの完全なパスを以下のように指定する必要があります。

  ```
  /opt/amazon/openmpi/bin/mpirun <command>  
  ```
+ アプリケーションで EFA を使用するには、[DLAMI での EFA の使用](tutorial-efa-using.md) に示すように、`mpirun` コマンドに `FI_PROVIDER="efa"` を追加します。

**Topics**
+ [EFA 対応のセキュリティグループを準備する](#tutorial-efa-security-group)
+ [インスタンスの起動](#tutorial-efa-launch)
+ [EFA 添付ファイルの確認](#tutorial-efa-verify-attachment)

## EFA 対応のセキュリティグループを準備する
<a name="tutorial-efa-security-group"></a>

EFA には、セキュリティグループ自体とのインバウンドおよびアウトバウンドのトラフィックをすべて許可するセキュリティグループが必要です。詳細については、「[EFA のドキュメント](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)」を参照してください。

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

1. ナビゲーションペインで [**セキュリティグループ**] を選択して、[**セキュリティグループの作成**] を選択します。

1. [**セキュリティグループの作成**] ウィンドウで、以下を行います。
   + [**セキュリティグループ名**] に、`EFA-enabled security group` のような、分かりやすいセキュリティグループ名を入力してください。
   + (オプション) [**説明**] に、セキュリティグループの簡単な説明を入力してください。
   + [**VPC**] で、EFA 対応のインスタンスを起動する VPC を選択します。
   + **[作成]** を選択します。

1. 作成したセキュリティグループを選択し、[**説明**] タブで [**グループ ID**] をコピーします。

1. **[Inbound]** (インバウンド) タブおよび **[Outbound]** (アウトバウンド) タブで、次の手順を実行します。
   + **[編集]** を選択します。
   + [**Type**] で、[**All traffic**] を選択します。
   + **[ソース]** で **[カスタム]** を選択します。
   + コピーしたセキュリティグループ ID をフィールドに貼り付けます。
   + **[保存]** を選択します。

1. 「[Linux インスタンスのインバウンドトラフィックの承認](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html)」を参照するインバウンドトラフィックを有効にします。このステップを抜かすと、DLAMI インスタンスと通信できなくなります。

## インスタンスの起動
<a name="tutorial-efa-launch"></a>

の EFA AWS Deep Learning AMIs は現在、次のインスタンスタイプとオペレーティングシステムでサポートされています。
+  P3dn: Amazon Linux 2、Ubuntu 20.04
+  P4d、P4de: Amazon Linux 2、Amazon Linux 2023、Ubuntu 20.04、Ubuntu 22.04
+  P5、P5e、P5en: Amazon Linux 2、Amazon Linux 2023、Ubuntu 20.04、Ubuntu 22.04

以下のセクションでは、EFA 対応の DLAMI インスタンスを起動する方法について説明します。EFA 対応のインスタンスの起動の詳細については、[クラスタープレイスメントグループで EFA 対応のインスタンスを起動する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-instances)を参照してください。

1. Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

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

1. **AMI を選択**ページで、[DLAMI リリースノートページ](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes)にある、サポートされている DLAMI を選択します。

1. **[Choose an Instance Type]** (インスタンスタイプの選択) ページで、次のいずれかのサポート対象のインスタンスタイプを選択し、**[Next: Configure Instance Details]** (次の手順: インスタンスの詳細の設定) を選択します。サポートされているインスタンスのリストについては、[EFA と MPI の開始方法](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html)のリンクを参照してください。

1. [**Configure Instance Details**] ページで以下の操作を実行します。
   + [**インスタンス数**] に、起動する EFA 対応のインスタンスの数を入力します。
   + [**ネットワーク**] および [**サブネット**] で、インスタンスを起動する VPC およびサブネットを選択します。
   + [オプション] **[プレイスメントグループ]** で、**[プレイスメントグループにインスタンスを追加]** を選択します。最適なパフォーマンスを得るには、プレイスメントグループ内でインスタンスを起動します。
   + [オプション] **[プレイスメントグループ名]** で、**[新しいプレイスメントグループに追加]** を選択し、プレイスメントグループの分かりやすい名前を入力して、**[プレイスメントグループ戦略]** で **[クラスター]** を選択します。
   + 必ず、このページで **[Elastic Fabric Adapter]** を有効にしてください。このオプションが無効になっている場合は、選択したインスタンスタイプに対応するサブネットに変更します。
   + [**ネットワークインターフェイス**] セクションの [**eth0**] で、[**新しいネットワークインターフェイス**] を選択してください。必要に応じて、プライマリ IPv4 アドレスと 1 つ以上のセカンダリ IPv4 アドレスを指定できます。関連付けられている IPv6 CIDR ブロックを持つサブネットにインスタンスを起動する場合は、必要に応じて、プライマリ IPv6 アドレスと 1 つ以上のセカンダリ IPv6 アドレスを指定することができます。
   + [**次の手順: ストレージの追加**] を選択します。

1. [**ストレージの追加**] ページで、AMI で指定されたボリュームに加えてインスタンスにアタッチするボリューム (例: ルートデバイスのボリューム) を指定し、[**Next: Add Tags (次へ: タグの追加)**] を選択します。

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

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

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

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

## EFA 添付ファイルの確認
<a name="tutorial-efa-verify-attachment"></a>

### コンソールから
<a name="tutorial-efa-verify-attachment-console"></a>

インスタンスを起動したら、 AWS コンソールでインスタンスの詳細を確認します。これを行うには、EC2 コンソールでインスタンスを選択し、ページ下のペインにある [Description (説明)] タブを確認します。[Network Interfaces: eth0 (ネットワークインターフェイス: eth0)] というパラメータを探し、eth0 をクリックするとポップアップが開きます。[Elastic Fabric Adapter] が有効になっていることを確認します。

EFA が有効になっていない場合は、次のいずれかの方法でこれを修正できます。
+ EC2 インスタンスを終了し、同じ手順で新しいインスタンスを起動します。EFA が添付されていることを確認します。
+ 既存のインスタンスに EFA を添付します。

  1. EC2 コンソールで、[Network Interfaces (ネットワークインターフェイス)] に移動します。

  1. [Create a Network Interface (ネットワークインターフェイスを作成)] をクリックします。

  1. インスタンスが入っている同じサブネットを選択します。

  1. 必ず、[Elastic Fabric Adapter] を有効にし、[Create] (作成) をクリックします。

  1. [EC2 Instances (EC2 インスタンス)] タブに戻り、インスタンスを選択します。

  1. [Actions: Instance State] (アクション: インスタンスの状態) に移動し、EFA にアタッチする前にインスタンスを停止します。

  1. [Actions (アクション)] から、[Networking: Attach Network Interface (ネットワーキング: ネットワークインタフェイスの接続)] を選択します。

  1. 先ほど作成したインターフェイスを選択し、[Attach (接続)] をクリックします。

  1. インスタンスを再起動します。

### インスタンスから
<a name="tutorial-efa-verify-attachment-instance"></a>

DLAMI にすでに、次のテストスクリプトが存在します。これを実行して、カーネルモジュールが正しくロードされていることを確認します。

```
$ fi_info -p efa
```

出力は以下のようになります。

```
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-rdm
    version: 2.0
    type: FI_EP_RDM
    protocol: FI_PROTO_EFA
provider: efa
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 2.0
    type: FI_EP_DGRAM
    protocol: FI_PROTO_EFA
provider: efa;ofi_rxd
    fabric: EFA-fe80::e5:56ff:fe34:56a8
    domain: efa_0-dgrm
    version: 1.0
    type: FI_EP_RDM
    protocol: FI_PROTO_RXD
```

### セキュリティグループ構成の確認
<a name="tutorial-efa-verify-attachment-security"></a>

DLAMI にすでに、次のテストスクリプトが存在します。これを実行して、作成したセキュリティグループが正しく設定されていることを確認します。

```
$ cd /opt/amazon/efa/test/ 
$ ./efa_test.sh
```

出力は以下のようになります。

```
Starting server...
Starting client...
bytes   #sent   #ack     total       time     MB/sec    usec/xfer   Mxfers/sec
64      10      =10      1.2k        0.02s      0.06    1123.55       0.00
256     10      =10      5k          0.00s     17.66      14.50       0.07
1k      10      =10      20k         0.00s     67.81      15.10       0.07
4k      10      =10      80k         0.00s    237.45      17.25       0.06
64k     10      =10      1.2m        0.00s    921.10      71.15       0.01
1m      10      =10      20m         0.01s   2122.41     494.05       0.00
```

応答しなかったり完了しない場合は、セキュリティグループに正しいインバウンド/アウトバウンドルールが設定されていることを確認します。

# DLAMI での EFA の使用
<a name="tutorial-efa-using"></a>

次の項では、EFA を使用して、 AWS Deep Learning AMIsでマルチノードアプリケーションを実行する方法について説明します。

## EFA でマルチノードアプリケーションを実行
<a name="tutorial-efa-using-multi-node"></a>

ノードのクラスター全体でアプリケーションを実行するには、次の構成が必要です。

**Topics**
+ [パスワードレス SSH の有効化](#tutorial-efa-using-multi-node-ssh)
+ [Hosts ファイルの作成](#tutorial-efa-using-multi-node-hosts)
+ [NCCL テスト](#tutorial-efa-using-2node)

### パスワードレス SSH の有効化
<a name="tutorial-efa-using-multi-node-ssh"></a>

クラスター内の 1 つのノードをリーダーノードとして選択します。残りのノードはメンバーノードと呼ばれます。

1. リーダーノードで、RSA キーペアを生成します。

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

1. リーダーノードのプライベートキーの許可を変更します。

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

1. パブリックキー `~/.ssh/id_rsa.pub` をコピーし、クラスター内のメンバーノードの `~/.ssh/authorized_keys` に追加します。

1. これで、プライベート IP を使用して、リーダーノードからメンバーノードに直接ログインできるようになります。

   ```
   ssh <member private ip>
   ```

1. strictHostKeyChecking を無効にし、リーダーノードの \$1/.ssh/config ファイルに以下を追加することで、リーダーノードでエージェント転送を有効化します。

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

1. Amazon Linux 2 インスタンスでは、リーダーノードで次のコマンドを実行して、設定ファイルへの正しいアクセス許可を付与します。

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

### Hosts ファイルの作成
<a name="tutorial-efa-using-multi-node-hosts"></a>

リーダーノードで、クラスター内のノードを識別する Hosts ファイルを作成します。Hosts ファイルには、クラスター内の各ノードのエントリが必要です。〜/hosts ファイルを作成し、次のようにプライベート IP を使用して各ノードを追加します。

```
localhost slots=8
<private ip of node 1> slots=8
<private ip of node 2> slots=8
```

### NCCL テスト
<a name="tutorial-efa-using-2node"></a>

**注記**  
これらのテストは、EFA のバージョン 1.38.0 および OFI NCCL プラグイン 1.13.2 を使用して実行されています。

 以下は、複数のコンピューティングノードで機能とパフォーマンスの両方をテストするために Nvidia が提供する NCCL テストのサブセットです 

 **サポートされているインスタンス: P3dn、P4、P5、P5e、P5en** 

#### パフォーマンステスト
<a name="tutorial-efa-using-multinode"></a>

##### P4d.24xlarge でのマルチノード NCCL パフォーマンステスト
<a name="tutorial-efa-using-multi-node-performance"></a>

EFA で NCCL パフォーマンステストを確認するには、公式の [NCCL-Tests Repo](https://github.com/NVIDIA/nccl-tests.git) で実施可能な標準 NCCL パフォーマンステストを実施します。DLAMI には、CUDA XX.X 用に構築されたこのテストが付属しています。EFA を使用して独自のスクリプトを実行することもできます。

独自のスクリプトを作成する場合は、次のガイダンスを参照してください。
+ EFA で NCCL アプリケーションを実行中に、例に示すように、mpirun への完全なパスを使用します。
+ クラスター内のインスタンスの数と GPU の数に基づいて、パラメータ np と N を変更します。
+ NCCL\$1DEBUG=INFO フラグを追加し、ログの EFA使用状況が、[Selected Provider is EFA] になっていることを確認します。
+  検証用に解析するトレーニングログの場所を設定します。

  ```
  TRAINING_LOG="testEFA_$(date +"%N").log"
  ```

いずれかのメンバーノードでコマンド `watch nvidia-smi` を使用し、GPU の使用状況を監視します。次の `watch nvidia-smi` コマンドは汎用 CUDA xx.x バージョン用のコマンドで、インスタンスのオペレーティングシステムによって異なります。スクリプト内の CUDA バージョンを置き換えることで、Amazon EC2 インスタンスで使用可能な任意の CUDA バージョンに対するコマンドを実行できます。
+ Amazon Linux 2、Amazon Linux 2023:

  ```
   $ /opt/amazon/openmpi/bin/mpirun -n 16 -N 8 \
  -x NCCL_DEBUG=INFO --mca pml ^cm \
  -x LD_LIBRARY_PATH=/usr/local/cuda-xx.x/efa/lib:/usr/local/cuda-xx.x/lib:/usr/local/cuda-xx.x/lib64:/usr/local/cuda-xx.x:/opt/amazon/efa/lib64:/opt/amazon/openmpi/lib64:$LD_LIBRARY_PATH \
  --hostfile hosts --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
  /usr/local/cuda-xx.x/efa/test-cuda-xx.x/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100 | tee ${TRAINING_LOG}
  ```
+ Ubuntu 20.04、Ubuntu 20.04:

  ```
  $ /opt/amazon/openmpi/bin/mpirun -n 16 -N 8 \
  -x NCCL_DEBUG=INFO --mca pml ^cm \
  -x LD_LIBRARY_PATH=/usr/local/cuda-xx.x/efa/lib:/usr/local/cuda-xx.x/lib:/usr/local/cuda-xx.x/lib64:/usr/local/cuda-xx.x:/opt/amazon/efa/lib:/opt/amazon/openmpi/lib:$LD_LIBRARY_PATH \
  --hostfile hosts --mca btl tcp,self --mca btl_tcp_if_exclude lo,docker0 --bind-to none \
  /usr/local/cuda-xx.x/efa/test-cuda-xx.x/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100 | tee ${TRAINING_LOG}
  ```

出力は次のようになります。

```
# nThread 1 nGpus 1 minBytes 8 maxBytes 1073741824 step: 2(factor) warmup iters: 5 iters: 100 agg iters: 1 validation: 1 graph: 0
#
# Using devices
#  Rank  0 Group  0 Pid  33378 on ip-172-31-42-25 device  0 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  1 Group  0 Pid  33379 on ip-172-31-42-25 device  1 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  2 Group  0 Pid  33380 on ip-172-31-42-25 device  2 [0x20] NVIDIA A100-SXM4-40GB
#  Rank  3 Group  0 Pid  33381 on ip-172-31-42-25 device  3 [0x20] NVIDIA A100-SXM4-40GB
#  Rank  4 Group  0 Pid  33382 on ip-172-31-42-25 device  4 [0x90] NVIDIA A100-SXM4-40GB
#  Rank  5 Group  0 Pid  33383 on ip-172-31-42-25 device  5 [0x90] NVIDIA A100-SXM4-40GB
#  Rank  6 Group  0 Pid  33384 on ip-172-31-42-25 device  6 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank  7 Group  0 Pid  33385 on ip-172-31-42-25 device  7 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank  8 Group  0 Pid  30378 on ip-172-31-43-8 device  0 [0x10] NVIDIA A100-SXM4-40GB
#  Rank  9 Group  0 Pid  30379 on ip-172-31-43-8 device  1 [0x10] NVIDIA A100-SXM4-40GB
#  Rank 10 Group  0 Pid  30380 on ip-172-31-43-8 device  2 [0x20] NVIDIA A100-SXM4-40GB
#  Rank 11 Group  0 Pid  30381 on ip-172-31-43-8 device  3 [0x20] NVIDIA A100-SXM4-40GB
#  Rank 12 Group  0 Pid  30382 on ip-172-31-43-8 device  4 [0x90] NVIDIA A100-SXM4-40GB
#  Rank 13 Group  0 Pid  30383 on ip-172-31-43-8 device  5 [0x90] NVIDIA A100-SXM4-40GB
#  Rank 14 Group  0 Pid  30384 on ip-172-31-43-8 device  6 [0xa0] NVIDIA A100-SXM4-40GB
#  Rank 15 Group  0 Pid  30385 on ip-172-31-43-8 device  7 [0xa0] NVIDIA A100-SXM4-40GB
ip-172-31-42-25:33385:33385 [7] NCCL INFO cudaDriverVersion 12060
ip-172-31-43-8:30383:30383 [5] NCCL INFO Bootstrap : Using ens32:172.31.43.8
ip-172-31-43-8:30383:30383 [5] NCCL INFO NCCL version 2.23.4+cuda12.5
...
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Initializing aws-ofi-nccl 1.13.2-aws
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Using Libfabric version 1.22
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Using CUDA driver version 12060 with runtime 12050
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Configuring AWS-specific options
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting provider_filter to efa
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting FI_EFA_FORK_SAFE environment variable to 1
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting NCCL_NVLSTREE_MAX_CHUNKSIZE to 512KiB
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Setting NCCL_NVLS_CHUNKSIZE to 512KiB
ip-172-31-42-25:33384:33451 [6] NCCL INFO NET/OFI Running on p4d.24xlarge platform, Setting NCCL_TOPO_FILE environment variable to /opt/amazon/ofi-nccl/share/aws-ofi-nccl/xml/p4d-24xl-topo.xml
...
-----------------------------some output truncated-----------------------------------
#                                                              out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
#        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)       
           8             2     float     sum      -1    180.3    0.00    0.00      0    179.3    0.00    0.00      0
          16             4     float     sum      -1    178.1    0.00    0.00      0    177.6    0.00    0.00      0
          32             8     float     sum      -1    178.5    0.00    0.00      0    177.9    0.00    0.00      0
          64            16     float     sum      -1    178.8    0.00    0.00      0    178.7    0.00    0.00      0
         128            32     float     sum      -1    178.2    0.00    0.00      0    177.8    0.00    0.00      0
         256            64     float     sum      -1    178.6    0.00    0.00      0    178.8    0.00    0.00      0
         512           128     float     sum      -1    177.2    0.00    0.01      0    177.1    0.00    0.01      0
        1024           256     float     sum      -1    179.2    0.01    0.01      0    179.3    0.01    0.01      0
        2048           512     float     sum      -1    181.3    0.01    0.02      0    181.2    0.01    0.02      0
        4096          1024     float     sum      -1    184.2    0.02    0.04      0    183.9    0.02    0.04      0
        8192          2048     float     sum      -1    191.2    0.04    0.08      0    190.6    0.04    0.08      0
       16384          4096     float     sum      -1    202.5    0.08    0.15      0    202.3    0.08    0.15      0
       32768          8192     float     sum      -1    233.0    0.14    0.26      0    232.1    0.14    0.26      0
       65536         16384     float     sum      -1    238.6    0.27    0.51      0    235.1    0.28    0.52      0
      131072         32768     float     sum      -1    237.2    0.55    1.04      0    236.8    0.55    1.04      0
      262144         65536     float     sum      -1    248.3    1.06    1.98      0    247.0    1.06    1.99      0
      524288        131072     float     sum      -1    309.2    1.70    3.18      0    307.7    1.70    3.20      0
     1048576        262144     float     sum      -1    408.7    2.57    4.81      0    404.3    2.59    4.86      0
     2097152        524288     float     sum      -1    613.5    3.42    6.41      0    607.9    3.45    6.47      0
     4194304       1048576     float     sum      -1    924.5    4.54    8.51      0    914.8    4.58    8.60      0
     8388608       2097152     float     sum      -1   1059.5    7.92   14.85      0   1054.3    7.96   14.92      0
    16777216       4194304     float     sum      -1   1269.9   13.21   24.77      0   1272.0   13.19   24.73      0
    33554432       8388608     float     sum      -1   1642.7   20.43   38.30      0   1636.7   20.50   38.44      0
    67108864      16777216     float     sum      -1   2446.7   27.43   51.43      0   2445.8   27.44   51.45      0
   134217728      33554432     float     sum      -1   4143.6   32.39   60.73      0   4142.4   32.40   60.75      0
   268435456      67108864     float     sum      -1   7351.9   36.51   68.46      0   7346.7   36.54   68.51      0
   536870912     134217728     float     sum      -1    13717   39.14   73.39      0    13703   39.18   73.46      0
  1073741824     268435456     float     sum      -1    26416   40.65   76.21      0    26420   40.64   76.20      0
...
# Out of bounds values : 0 OK
# Avg bus bandwidth    : 15.5514
```

#### 検証テスト
<a name="tutorial-efa-validation"></a>

EFA テストが有効な結果を返したことを検証するには、次のテストを使用して確認します。
+ EC2 インスタンスメタデータを使用してインスタンスタイプを取得します。

  ```
  TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
  INSTANCE_TYPE=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/instance-type)
  ```
+ [パフォーマンステスト](#tutorial-efa-using-multinode) を実行します。
+  以下のパラメータを設定します。

  ```
  CUDA_VERSION
  CUDA_RUNTIME_VERSION
  NCCL_VERSION
  ```
+  結果を次のように検証します。

  ```
  RETURN_VAL=`echo $?`
  if [ ${RETURN_VAL} -eq 0 ]; then
  
      # [0] NCCL INFO NET/OFI Initializing aws-ofi-nccl 1.13.2-aws
      # [0] NCCL INFO NET/OFI Using CUDA driver version 12060 with runtime 12010
  
      # cudaDriverVersion 12060  --> This is max supported cuda version by nvidia driver
      # NCCL version 2.23.4+cuda12.5 --> This is NCCL version compiled with cuda version
  
      # Validation of logs
      grep "NET/OFI Configuring AWS-specific options" ${TRAINING_LOG} || { echo "AWS-specific options text not found"; exit 1; } 
      grep "busbw" ${TRAINING_LOG} || { echo "busbw text not found"; exit 1; } 
      grep "Avg bus bandwidth " ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; } 
      grep "NCCL version $NCCL_VERSION" ${TRAINING_LOG} || { echo "Text not found: NCCL version $NCCL_VERSION"; exit 1; }
      if [[ ${INSTANCE_TYPE} == "p4d.24xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Text not found: NET/Libfabric/0/GDRDMA"; exit 1; }  
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Selected Provider is efa text not found"; exit 1; }   
      elif [[ ${INSTANCE_TYPE} == "p4de.24xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p5.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 32 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; } 
      elif [[ ${INSTANCE_TYPE} == "p5e.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 32 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p5en.48xlarge" ]]; then
          grep "NET/Libfabric/0/GDRDMA" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
          grep "NET/OFI Selected Provider is efa (found 16 nics)" ${TRAINING_LOG} || { echo "Avg bus bandwidth text not found"; exit 1; }
      elif [[ ${INSTANCE_TYPE} == "p3dn.24xlarge" ]]; then
          grep "NET/OFI Selected Provider is efa (found 4 nics)" ${TRAINING_LOG} || { echo "Selected Provider is efa text not found"; exit 1; }  
      fi
      echo "***************************** check_efa_nccl_all_reduce passed for cuda version ${CUDA_VERSION} *****************************"
  else
      echo "***************************** check_efa_nccl_all_reduce failed for cuda version ${CUDA_VERSION} *****************************"
  fi
  ```
+ ベンチマークデータにアクセスするには、マルチノード all\$1reduce テストからテーブル出力の最終行を解析します。

  ```
  benchmark=$(sudo cat ${TRAINING_LOG} | grep '1073741824' | tail -n1 | awk -F " " '{{print $12}}' | sed 's/ //' | sed  's/  5e-07//')
  if [[ -z "${benchmark}" ]]; then
    echo "benchmark variable is empty"
    exit 1
  fi
  
  echo "Benchmark throughput: ${benchmark}"
  ```