本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon NCCL 上的 ML 工作負載入門 EFA和 EC2
NVIDIA Collective Communications Library (NCCL) 是單一節點或多個節點GPUs中多個 的標準集體通訊常式程式庫。NCCL 可與 EFA、Libfabric 和 搭配使用MPI,以支援各種機器學習工作負載。如需詳細資訊,請參閱 NCCL
下列步驟可協助您開始使用 ,EFA以及AMI針對其中一個支援的作業系統NCCL使用 基礎 。 支援的作業系統
注意
-
只支援
p3dn.24xlarge
、p4d.24xlarge
和p5.48xlarge
執行個體類型。 -
僅AMIs支援 Amazon Linux 2 和 Ubuntu 20.04/22.04 基礎。
-
僅支援 NCCL 2.4.2 及更新版本EFA。
如需使用 EFA和NCCL使用 執行機器學習工作負載的詳細資訊 AWS 深度學習 AMIs,請參閱 開發人員指南 中的EFA在 上使用 DLAMI 。 AWS 深度學習 AMIs
步驟
步驟 1:準備EFA啟用 的安全群組
EFA 需要一個安全群組,允許所有進出安全群組本身的傳入和傳出流量。下列程序會建立安全群組,允許所有進出本身的傳入和傳出流量,並允許來自任何IPv4地址的傳入SSH流量進行SSH連線。
重要
此安全群組僅供測試之用。針對生產環境,建議您建立傳入SSH規則,僅允許來自您連線之 IP 地址的流量,例如電腦的 IP 地址,或本機網路中的 IP 地址範圍。
如需其他案例,請參閱不同使用案例的安全群組規則。
若要建立EFA已啟用 的安全群組
在 開啟 Amazon EC2主控台https://console.aws.amazon.com/ec2/
。 -
在導覽窗格中,選擇 Security Groups (安全群組),然後選擇 Create Security Group (建立安全群組)。
-
在 Create Security Group (建立安全群組) 視窗中,執行下列動作:
-
對於 Security group name (安全群組名稱),輸入安全群組的描述性名稱,例如
EFA-enabled security group
。 -
(選用) 對於 Description (描述),輸入安全群組的簡短描述。
-
針對 VPC,選取您要VPC在其中啟動EFA已啟用 之執行個體的 。
-
選擇 Create Security Group (建立安全群組)。
-
-
選取您建立的安全群組,在 Details (詳細資料) 索引標籤上,複製 Security group ID (安全群組 ID)。
-
在仍然選取安全群組的情況下,依序選取 Actions (動作) 和 Edit inbound rules (編輯傳入規則),然後執行下列動作。
-
選擇新增規則。
-
針對類型,選擇所有流量。
-
若為 Source type (來源類型),選擇 Custom (自訂),然後將您複製的安全群組 ID 貼到欄位中。
-
選擇新增規則。
-
針對類型 ,選擇 SSH。
-
針對來源類型 ,選擇 Anywhere-IPv4。
-
選擇儲存規則。
-
-
在仍然選取安全群組的情況下,依序選取 Actions (動作) 和 Edit outbound rules (編輯傳出規則),然後執行下列動作。
-
選擇新增規則。
-
針對類型,選擇所有流量。
-
若為 Destination type (目的地類型),選擇 Custom (自訂),然後將您複製的安全群組 ID 貼到欄位中。
-
選擇儲存規則。
-
步驟 2:啟動暫時執行個體
啟動暫存執行個體,供您用來安裝和設定EFA軟體元件。您可以使用此執行個體來建立EFA已啟用 的 ,AMI您可以從中啟動已啟用 EFA的執行個體。
啟動暫時執行個體
在 開啟 Amazon EC2主控台https://console.aws.amazon.com/ec2/
。 -
在導覽窗格中,選擇 Instances (執行個體),接著選擇 Launch Instances (啟動執行個體) 來開啟新的啟動執行個體精靈。
-
(選用) 在 Name and tags (名稱和標籤) 區段中,為執行個體命名,例如,
EFA-instance
。該名稱將指派作為執行個體的資源標籤 (Name=
)。EFA-instance
-
在應用程式和作業系統映像區段中,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 (選取現有的安全群組),接著選取您在前一個步驟中建立的安全群組。
-
展開 Advanced network configuration (進階網路組態) 區段,並針對 Elastic Fabric Adapter,選取 Enable (啟用)。
-
-
在 儲存 區段中,根據需求設定磁碟區。
注意
您必須為 Nvidia CUDA Toolkit 佈建額外的 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 軟體
-
連接至您啟動的執行個體。如需詳細資訊,請參閱使用 Connect 到您的 Linux 執行個體 SSH。
-
下載 EFA 軟體安裝檔案。軟體安裝檔案已封裝成壓縮 tarball (
.tar.gz
) 檔案。若要下載最新穩定版本,請使用下列命令:$
curl -O https://efa-installer.amazonaws.com/aws-efa-installer-1.35.0.tar.gz您也可以在之前的命令中以
latest
取代版本號碼,以取得最新版本。 (選用 ) 驗證 tarball EFA (
.tar.gz
) 檔案的真實性和完整性。我們建議您執行這項操作來確認軟體發行者的身分,並檢查檔案自發行以來並未遭到變更或損毀。如果您不想驗證 tarball 檔案,請略過此步驟。
注意
或者,如果您偏好改用 MD5或 總和SHA256檢查碼來驗證 tarball 檔案,請參閱 使用總和檢查碼驗證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 tarball 檔案的簽章。
$
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 開始,預設會同時安裝 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
目錄中,而 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 && cd nccl -
建置和安裝NCCL並指定CUDA安裝目錄。
$
sudo make -j src.build CUDA_HOME=/usr/local/cuda
步驟 7:安裝 aws-ofi-nccl外掛程式
外掛程式會將 aws-ofi-nccl NCCL的連線導向傳輸對應APIs至 Libfabric 的無連線可靠介面。這可讓您在執行 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外掛程式檔案。檔案已封裝成壓縮 tarball (
.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
) 和GPUs要使用的 (-n
)。下列命令會在執行個體本身的 8 GPUs 上執行all_reduce_perf
測試,並指定下列環境變數。-
FI_EFA_USE_DEVICE_RDMA=1
—(p4d.24xlarge
僅限 ) 使用裝置的RDMA功能進行單面和雙面傳輸。 -
NCCL_DEBUG=INFO
- 啟用詳細的除錯輸出。您也可以指定在測試開始時僅VERSION
列印NCCL版本,或指定僅WARN
接收錯誤訊息。
如需NCCL測試引數的詳細資訊,請參閱官方 nccl-tests 儲存庫中的NCCL測試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
日誌NCCL時,確認 EFA 作為基礎提供者處於作用中狀態。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:建立NCCL已啟用 EFA和 的 AMI
安裝必要的軟體元件後,您可以建立可重複使用AMI的 ,以啟動已啟用 EFA的執行個體。
從AMI暫時執行個體建立
在 開啟 Amazon EC2主控台https://console.aws.amazon.com/ec2/
。 -
在導覽窗格中,選擇 Instances (執行個體)。
-
選取您建立的暫時執行個體,然後選取 Actions (動作)、Image (映像)、Create image (建立映像)。
-
對於 Create image (建立映像),執行下列動作:
-
針對映像名稱 ,輸入 的描述性名稱AMI。
-
(選用) 針對影像描述 ,輸入 目的的簡短描述AMI。
-
選擇 Create image (建立映像)。
-
-
在導覽窗格中,選擇 AMIs。
-
找出您在清單中建立的 AMI tht。等待狀態從
pending
變為available
,再繼續進行下一個步驟。
步驟 12:終止暫時執行個體
此時,您不再需要您啟動的暫時執行個體。您可以終止執行個體,以停止產生費用。
終止暫時執行個體
在 開啟 Amazon EC2主控台https://console.aws.amazon.com/ec2/
。 -
在導覽窗格中,選擇 Instances (執行個體)。
-
選取您建立的暫時執行個體,然後選取動作、執行個體狀態、終止執行個體。
-
出現確認提示時,請選擇終止。
步驟 13:在叢集置放群組中啟動EFA和啟用 NCCL的執行個體
使用您先前建立NCCL的已啟用 EFA和已啟用 的安全群組,在叢集置放群組中啟動EFA您的 AMI和EFA已啟用 的執行個體。
注意
-
在叢集置放群組中啟動EFA已啟用 的執行個體並非絕對要求。不過,我們建議您在叢集置放群組中執行EFA已啟用 的執行個體,因為其會在單一可用區域中將執行個體啟動至低延遲群組。
-
要確保在擴展叢集執行個體時容量可用,您可以為集群放置群組建立容量保留。如需詳細資訊,請參閱在叢集置放群組中建立容量保留。
步驟 14:啟用無密碼 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
您應該連線至成員節點,而不會提示您輸入金鑰或密碼。