本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon EC2 上的適用於 ML 工作負載的 EFA 和 NCCL 入門
NVIDIA Collective Communications Library (NCCL) 是一種標準集體溝通常式程式庫,用於多個 GPU 橫跨單一節點或多個節點。NCCL 可與 EFA、Libfabric 和 MPI 一同使用來支援不同的機器學習工作負載。如需詳細資訊,請參閱 NCCL
下列步驟可協助您透過其中一個支援的基本作業系統,開始搭配使用 Elastic Fabric Adapter 和 AMI。
注意
-
只支援
p3dn.24xlarge
、p4d.24xlarge
和p5.48xlarge
執行個體類型。 -
僅支援 Amazon Linux 2 和 Ubuntu 20.04/22.04 基本 AMI。
-
EFA 僅支援 NCCL 2.4.2 和更新版本。
如需使用 搭配 EFA 和 NCCL 執行機器學習工作負載的詳細資訊 AWS 深度學習 AMIs,請參閱《 AWS 深度學習 AMIs 開發人員指南》中的在 DLAMI 上使用 EFA。
步驟
步驟 1:準備具備 EFA 功能的安全群組
EFA 需要有安全群組來允許往返安全群組自身的所有傳入和傳出流量。下列程序會建立一個安全群組,該安全群組允許所有傳入和傳出流量,並允許來自任何 IPv4 地址的傳入 SSH 流量以進行 SSH 連線。
重要
此安全群組僅供測試之用。對於生產環境,我們建議您建立傳入 SSH 規則,該規則僅允許來自連線 IP 位址的流量,例如電腦的 IP 位址或區域網路中的一系列 IP 位址。
如需其他案例,請參閱不同使用案例的安全群組規則。
建立具備 EFA 功能的安全群組
在 https://console.aws.amazon.com/ec2/
開啟 Amazon EC2 主控台。 -
在導覽窗格中,選擇 Security Groups (安全群組),然後選擇 Create Security Group (建立安全群組)。
-
在 Create Security Group (建立安全群組) 視窗中,執行下列動作:
-
對於 Security group name (安全群組名稱),輸入安全群組的描述性名稱,例如
EFA-enabled security group
。 -
(選用) 對於 Description (描述),輸入安全群組的簡短描述。
-
對於 VPC,選取您打算讓具備 EFA 功能的執行個體在其中啟動的 VPC。
-
選擇 Create Security Group (建立安全群組)。
-
-
選取您建立的安全群組,在 Details (詳細資料) 索引標籤上,複製 Security group ID (安全群組 ID)。
-
在仍然選取安全群組的情況下,依序選取 Actions (動作) 和 Edit inbound rules (編輯傳入規則),然後執行下列動作。
-
選擇新增規則。
-
針對類型,選擇所有流量。
-
若為 Source type (來源類型),選擇 Custom (自訂),然後將您複製的安全群組 ID 貼到欄位中。
-
選擇新增規則。
-
針對 Type (類型),選擇 SSH。
-
針對 Source type (來源類別),選擇 Anywhere-IPv4(隨處 - IPv4)。
-
選擇儲存規則。
-
-
在仍然選取安全群組的情況下,依序選取 Actions (動作) 和 Edit outbound rules (編輯傳出規則),然後執行下列動作。
-
選擇新增規則。
-
針對類型,選擇所有流量。
-
若為 Destination type (目的地類型),選擇 Custom (自訂),然後將您複製的安全群組 ID 貼到欄位中。
-
選擇儲存規則。
-
步驟 2:啟動暫時執行個體
啟動暫時執行個體,以用來安裝和設定 EFA 軟體元件。您可以使用此執行個體來建立具備 EFA 功能的 AMI,再從中啟動具備 EFA 功能的執行個體。
啟動暫時執行個體
在 https://console.aws.amazon.com/ec2/
開啟 Amazon EC2 主控台。 -
在導覽窗格中,選擇 Instances (執行個體),接著選擇 Launch Instances (啟動執行個體) 來開啟新的啟動執行個體精靈。
-
(選用) 在 Name and tags (名稱和標籤) 區段中,為執行個體命名,例如,
EFA-instance
。該名稱將指派作為執行個體的資源標籤 (Name=
)。EFA-instance
-
在 Application and OS Images (應用程式和作業系統映像) 區段中,為其中一個支援的作業系統選取 AMI。僅支援 Amazon Linux 2、Ubuntu 20.04 和 Ubuntu 22.04。
-
在執行個體類型區段中,選取
p3dn.24xlarge
、p4d.24xlarge
或p5.48xlarge
。 -
在 Key pair (金鑰對) 區段中,選取要用於執行個體的金鑰對。
-
在 Network settings (網路設定) 區段,選擇 Edit (編輯),接著執行下列動作:
-
對於 Subnet (子網路),請選擇要在其中啟動執行個體的子網路。若您未選取子網路,便無法啟用 EFA 的執行個體。
-
針對 Firewall (security groups) (防火牆 (安全群組)),選取 Select existing security group (選取現有的安全群組),接著選取您在前一個步驟中建立的安全群組。
-
展開進階設定區段。
針對網路介面 1,選取網路卡索引 = 0、裝置索引 = 0,以及介面類型 = EFA 搭配 ENA。
(選用) 如果您使用的是多卡執行個體類型,例如
p4d.24xlarge
或p5.48xlarge
,則針對所需的每個額外網路介面,選擇新增網路介面,針對網路卡索引,選擇下一個未使用的索引,然後選擇裝置索引 = 1,介面類型 = EFA 搭配 ENA 或僅限 EFA。
-
-
在儲存區段中,根據需求設定磁碟區。
注意
您必須為 Nvidia CUDA 工具組佈建額外的 10 到 20 GitB 儲存空間。如果您沒有佈建足夠的儲存空間,您會在嘗試安裝 Nvidia 驅動程式和 CUDA 工具組時,收到
insufficient disk space
錯誤。 -
在右邊的 Summary (摘要) 面板中,選擇 Launch instance (啟動執行個體)。
步驟 3:安裝 Nvidia GPU 驅動程式、Nvidia CUDA 工具組和 cuDNN
步驟 4:安裝 GDRY
安裝 GDRCopy 以提高 Libfabric 的效能。如需更多關於 GDRCopy 的詳細資訊,請參閱 GDRCopy 儲存庫
步驟 5:安裝 EFA 軟體
安裝執行個體上支援 EFA 所需的啟用 EFA 的核心、EFA 驅動程式、Libfabric、aws-ofi-nccl 外掛程式和 Open MPI 堆疊。
安裝 EFA 軟體
-
連接至您啟動的執行個體。如需詳細資訊,請參閱使用 SSH 連線至您的 Linux 執行個體。
-
下載 EFA 軟體安裝檔案。軟體安裝檔案已封裝成壓縮 tarball (
.tar.gz
) 檔案。若要下載最新穩定版本,請使用下列命令:$
curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.38.0.tar.gz您也可以在之前的命令中以
latest
取代版本號碼,以取得最新版本。 (選用) 驗證 EFA tarball (
.tar.gz
) 檔案的真確性及完整性。我們建議您執行這項操作來確認軟體發布者的身分,並檢查檔案自發行以來並未遭到變更或損毀。如果您不想驗證 tarball 檔案,請略過此步驟。
注意
或者,如果您偏好使用 MD5 或 SHA256 檢查總和來驗證 tarball 檔案,請參閱使用檢查總和驗證 EFA 安裝程式。
-
下載公有 GPG 金鑰並匯入至您的 keyring。
$
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 安裝指令碼,並聯絡 支援。 -
下載簽章檔案並驗證 EFA tarball 檔案的簽章。
$
wget https://efa-installer.amazonaws.com/aws-efa-installer-1.38.0.tar.gz.sig && gpg --verify ./aws-efa-installer-1.38.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.38.0.tar.gz && cd aws-efa-installer -
執行 EFA 軟體安裝指令碼。
注意
從 EFA 1.30.0 開始,根據預設會安裝 Open 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
目錄中。aws-ofi-nccl 外掛程式安裝在/opt/amazon/ofi-nccl
目錄中。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 存放庫
若要安裝 NCCL
-
請前往
/opt
目錄。$
cd /opt -
複製官方的 NCCL 存放庫至執行個體,並導覽至本地複製的存放庫。
$
sudo git clone https://github.com/NVIDIA/nccl.git -b v2.23.4-1 && cd nccl -
建立並安裝 NCCL 並指定 CUDA 安裝目錄。
$
sudo make -j src.build CUDA_HOME=/usr/local/cuda
步驟 7:安裝 NCCL Test
安裝 NCCL test。NCCL test 可讓您確認 NCCL 已正確安裝,並如預期中執行。如需更多關於 NCCL test 的詳細資訊,請參閱 nccl-test 存放庫
若要安裝 NCCL test
-
導覽至您的主目錄。
$
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 test 並指定 MPI、NCCL 和 CUDA 安裝目錄。
$
make MPI=1 MPI_HOME=/opt/amazon/openmpi
NCCL_HOME=/opt/nccl/build
CUDA_HOME=/usr/local/cuda
步驟 8:測試您的 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
- 啟用詳細的除錯輸出。您也可以在測試開始時指定VERSION
來列印只有 NCCL 版本,或WARN
只接收錯誤訊息。
如需更多關於 NCCL 測試引數的詳細資訊,請參閱官方 nccl-test 存放庫中的 NCCL Test 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/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 -
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/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 執行個體上安裝軟體的詳細資訊,請參閱在您的 Linux 2 執行個體上管理軟體。
注意
參考機器學習應用程式的文件,以取得安裝指示。
步驟 10:建立 EFA 和 NCCL 啟用的 AMI
安裝所需的軟體元件之後,您需要建立 AMI,以重複用來啟動具備 EFA 功能的執行個體。
從暫時執行個體建立 AMI
在 https://console.aws.amazon.com/ec2/
開啟 Amazon EC2 主控台。 -
在導覽窗格中,選擇 Instances (執行個體)。
-
選取您建立的暫時執行個體,然後選取 Actions (動作)、Image (映像)、Create image (建立映像)。
-
對於 Create image (建立映像),執行下列動作:
-
對於 Image name (映像名稱),輸入 AMI 的描述性名稱。
-
(選用) 對於 Image description (映像描述),輸入 AMI 的簡短描述。
-
選擇Create image。
-
-
在導覽窗格中,選擇 AMIs。
-
在清單中找出您建立的 AMI。等待狀態從
pending
變為available
,再繼續進行下一個步驟。
步驟 11:終止暫時執行個體
此時,您不再需要您啟動的暫時執行個體。您可以終止執行個體,以停止產生費用。
終止暫時執行個體
在 https://console.aws.amazon.com/ec2/
開啟 Amazon EC2 主控台。 -
在導覽窗格中,選擇 Instances (執行個體)。
-
選取您建立的暫時執行個體,然後選取動作、執行個體狀態、終止執行個體。
-
出現確認提示時,請選擇終止。
步驟 12:在叢集置放群組中啟動 EFA 和具備 NCCL 功能的執行個體
使用具備 EFA 功能的 AMI 和具備 EFA 功能的安全群組,在叢集置放群組中啟動具備 EFA 和 NCCL 功能的執行個體。
注意
-
在叢集置放群組中啟動具備 EFA 的執行個體並非絕對必要。不過,建議在叢集置放群組中執行具備 EFA 功能的執行個體,因為這樣會在單一可用區域的低延遲群組中啟動執行個體。
-
要確保在擴展叢集執行個體時容量可用,您可以為叢集置放群組建立容量保留。如需詳細資訊,請參閱在叢集置放群組建立容量保留。
步驟 13:啟用無密碼 SSH
若要讓您的應用程式能夠跨越叢集中的所有執行個體執行,您必須啟用從領導節點到成員節點的無密碼 SSH 存取。領導節點是您在其中執行應用程式的執行個體。叢集中的其餘執行個體為成員節點。
在叢集的執行個體之間啟用無密碼 SSH
-
選取叢集中的一個執行個體作為領導節點,並與它連線。
-
在領導節點上停用
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
您應該連線至成員節點,而不會提示您輸入金鑰或密碼。