

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Elastic Fabric Adapter 的分散式訓練
<a name="tutorial-efa"></a>

[Elastic Fabric Adapter](https://aws.amazon.com/hpc/efa/) (EFA) 是一種網路裝置，您可以連接到 DLAMI 執行個體，以加速高效能運算 (HPC) 應用程式。EFA 可讓您透過 AWS 雲端提供的可擴展性、彈性和彈性，實現現場部署 HPC 叢集的應用程式效能。

下列主題說明如何開始使用 EFA 搭配 DLAMI。

**注意**  
從此[基本 GPU DLAMI 清單中選擇您的 DLAMI](appendix-ami-release-notes.md#appendix-ami-release-notes-base)

**Topics**
+ [使用 EFA 啟動 AWS 深度學習 AMIs 執行個體](tutorial-efa-launching.md)
+ [在 DLAMI 上使用 EFA](tutorial-efa-using.md)

# 使用 EFA 啟動 AWS 深度學習 AMIs 執行個體
<a name="tutorial-efa-launching"></a>

最新的 Base DLAMI 已準備好與 EFA 搭配使用，並隨附 GPU 執行個體所需的驅動程式、核心模組、libfabric、Openmpi 和 [NCCL OFI 外掛程式](https://github.com/aws/aws-ofi-nccl/tree/aws)。

您可以在版本[備註中找到基礎 DLAMI 支援的 CUDA 版本](appendix-ami-release-notes.md#appendix-ami-release-notes-base)。

請注意：
+ 在 EFA `mpirun`上使用 執行 NCCL 應用程式時，您必須將 EFA 支援安裝的完整路徑指定為：

  ```
  /opt/amazon/openmpi/bin/mpirun <command>  
  ```
+ 若要讓您的應用程式能夠使用 EFA，請新增 `FI_PROVIDER="efa"` 至 `mpirun` 命令，如 [在 DLAMI 上使用 EFA](tutorial-efa-using.md) 中所示。

**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. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇 **Security Groups** (安全群組)，然後選擇 **Create Security Group** (建立安全群組)。

1. 在 **Create Security Group** (建立安全群組) 視窗中，執行下列動作：
   + 對於 **Security group name** (安全群組名稱)，輸入安全群組的描述性名稱，例如 `EFA-enabled security group`。
   + (選用) 對於 **Description** (描述)，輸入安全群組的簡短描述。
   + 對於 **VPC**，選取您打算讓具備 EFA 功能的執行個體在其中啟動的 VPC。
   + 選擇**建立**。

1. 選取您建立的安全群組，在 **Description** (描述) 索引標籤上，複製 **Group ID** (群組 ID)。

1. 在**傳入**和**傳出**索引標籤上，執行下列動作：
   + 選擇 **Edit** (編輯)。
   + 針對 **Type (類型)**，選擇 **All traffic (所有流量)**。
   + 對於 **Source (資源)**，選擇 **Custom (自訂)**。
   + 將您複製的安全群組 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 深度學習 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. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇**啟動執行個體**。

1. 在**選擇 AMI** 頁面上，選取 DLAMI [版本備註頁面上找到的支援 DLAMI](https://docs.aws.amazon.com/dlami/latest/devguide/appendix-ami-release-notes) 

1. 在**選擇執行個體類型**頁面上，選取下列其中一個支援的執行個體類型，然後選擇**下一步：設定執行個體詳細資訊。**如需支援的執行個體清單，請參閱此連結：[開始使用 EFA 和 MPI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html) 

1. 在 **Configure Instance Details (設定執行個體詳細資訊)** 頁面上，執行下列操作：
   + 對於 **Number of instances (執行個體的數目)**，輸入要啟動的具備 EFA 功能的執行個體數。
   + 對於 **Network (網路)** 和 **Subnet (子網)**，選取要在其中啟動執行個體的 VPC 和子網。
   + 【選用】 針對**置放群組**，選取**將執行個體新增至置放群組**。為獲得最佳效能，請在置放群組內啟動執行個體。
   + 【選用】 對於**置放群組名稱**，選取**新增至新的置放群組**，輸入置放群組的描述性名稱，然後對於**置放群組策略**，選取**叢集**。
   + 請務必在此頁面上啟用**「彈性布料轉接器」**。如果停用此選項，請將子網路變更為支援您所選執行個體類型的子網路。
   + 在 **Network Interfaces** (網路介面) 區段中，針對裝置 **eth0**，選擇 **New network interface** (新網路介面)。您可以選擇性指定一個主要 IPv4 地址，以及一或多個次要 IPv4 地址。如果您在有相關聯 IPv6 CIDR 區塊的子網中啟動執行個體，您可以選擇性指定一個主要 IPv6 地址，以及一或多個次要 IPv6 地址。
   + 選擇 **Next: Add Storage (下一步：新增儲存體)**。

1. 在 **Add Storage (新增儲存體)** 頁面上，除了 AMI 指定的磁碟區 (例如根設備磁碟區)，指定要連接到執行個體的磁碟區，然後選擇 **Next: Add Tags (下一步：新增標籤)**。

1. 在 **Add Tags (新增標籤)** 頁面上，為執行個體指定標籤 (例如使用者易記的名稱)，然後選擇 **Next: Configure Security Group (下一步：設定安全群組)**。

1. 在**設定安全群組**頁面上，針對**指派安全群組**，選取**選取現有的安全群組**，然後選取您先前建立的安全群組**。**

1. 選擇 **Review and Launch** (檢閱和啟動)。

1. 在 **Review Instance Launch (檢閱執行個體啟動)** 頁面上，檢閱設定，然後選擇 **Launch (啟動)**，以選擇金鑰對並啟動執行個體。

## 驗證 EFA 附件
<a name="tutorial-efa-verify-attachment"></a>

### 從主控台
<a name="tutorial-efa-verify-attachment-console"></a>

啟動執行個體之後，請在 AWS 主控台中檢查執行個體詳細資訊。若要執行此操作，在 EC2 主控台中選取執行個體，然後查看頁面下方窗格中的 [Description (描述)] 索引標籤。尋找參數 “網路界面：eth0”，然後按一下 eth0 開啟一個彈出式畫面。確定已啟用「Elastic Fabric Adapter」。

如果未啟用 EFA，您可以透過下列任一方式修正此問題：
+ 終止 EC2 執行個體並按照相同的步驟啟動新的執行個體。確定已連接 EFA。
+ 將 EFA 連接至現有執行個體。

  1. 在 EC2 主控台中，移至 [Network Interfaces (網路界面)]。

  1. 按一下 [Create a Network Interface (建立網路界面)]。

  1. 選取您的執行個體所在的相同子網路。

  1. 請務必啟用「彈性布料轉接器」，然後按一下建立。

  1. 返回 [EC2 Instances (EC2 執行個體)] 索引標籤並選取您的執行個體。

  1. 前往動作：執行個體狀態，並在連接 EFA 之前停止執行個體。

  1. 從 [Actions (動作)] 中，選取 [Networking: Attach Network Interface (聯網：連接網路界面)]。

  1. 選擇您剛建立的界面，然後按一下連接。

  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 深度學習 AMIs。

## 使用 EFA 執行多節點應用程式
<a name="tutorial-efa-using-multi-node"></a>

若要跨節點叢集執行應用程式，需要下列組態

**Topics**
+ [啟用無密碼 SSH](#tutorial-efa-using-multi-node-ssh)
+ [建立主機檔案](#tutorial-efa-using-multi-node-hosts)
+ [NCCL 測試](#tutorial-efa-using-2node)

### 啟用無密碼 SSH
<a name="tutorial-efa-using-multi-node-ssh"></a>

在叢集中選取一個節點做為領導節點。其餘的節點稱為成員節點。

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. 在領導節點上的 \$1/.ssh/config 檔案中加入以下內容，以停用 strictHostKeyChecking 並啟用領導節點上的代理程式轉送：

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

1. 在 Amazon Linux 2 執行個體上，在領導節點上執行下列命令，以提供組態檔案的正確許可：

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

### 建立主機檔案
<a name="tutorial-efa-using-multi-node-hosts"></a>

在領導節點上，建立主機檔案以識別叢集中的節點。主機檔案對於叢集中每個節點都必須有項目。建立一個檔案 \$1/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 儲存庫上可用的標準 NCCL](https://github.com/NVIDIA/nccl-tests.git) 效能測試。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}"
  ```