協助改善此頁面
想要為此使用者指南做出貢獻? 捲動至此頁面底部,然後在 上選取編輯此頁面 GitHub。您的貢獻將幫助我們的使用者指南更適合所有人。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
EKS 使用 在 Amazon 上執行機器學習訓練 Elastic Fabric Adapter
本主題說明如何將 Elastic Fabric Adapter (EFA) 與 整合 Pods 已部署在您的 Amazon EKS叢集中。Elastic Fabric Adapter (EFA) 是 Amazon EC2執行個體的網路介面,可讓您在 上執行需要大規模節點間通訊的應用程式 AWS。其自訂的作業系統略過硬體介面可增強執行個體間通訊的效能,這對於擴展這些應用程式至關重要。透過 EFA,使用訊息傳遞介面 (HPC) 的高效能運算 (MPI) 應用程式和使用 NVIDIA Collective Communications Library () 的Machine Learning (MLNCCL) 應用程式可以擴展到數千個 CPUs或 GPUs。因此,您可以取得具有隨需彈性和 AWS 雲端彈性的內部部署HPC叢集的應用程式效能。EFA 與在 Amazon EKS叢集上執行的應用程式整合可以縮短完成大規模分散式訓練工作負載的時間,而不必將其他執行個體新增至叢集。如需 EFA、Elastic Fabric Adapter
具有 的執行個體類型 EFA
AWS EFA Kubernetes Device Plugin 支援所有具有 的 Amazon EC2執行個體類型EFA。若要查看具有 的所有執行個體類型的清單EFA,請參閱 Amazon EC2使用者指南 中的支援的執行個體類型。不過,為了快速執行 ML 應用程式,我們建議執行個體具有硬體加速晶片,例如 nVidia GPUs除了 之外,還有 、 AWS Inferentia
當您比較執行個體類型以在它們之間進行選擇時,請考慮該執行個體類型可用的EFA網路卡數量,以及加速器卡的數量、 的數量CPU和記憶體數量。EFA 每個網路卡最多可以指派一個。EFA 計數作為網路介面。若要查看每個具有 的執行個體類型EFA有多少可用數量EFA,請參閱 Amazon EC2使用者指南 中的網路卡清單。
必要條件
-
現有的 Amazon EKS叢集。若您尚未擁有叢集,請使用 開始使用 Amazon EKS 指南之一建立一個叢集。您的叢集必須部署在具有至少一個私有子網路的 中VPC,該子網路具有足夠的可用 IP 地址,以部署節點。私有子網路必須具有外部裝置提供的傳出網際網路存取權,例如NAT閘道。
如果計劃使用
eksctl
來建立您的節點群組,eksctl
也會為您建立叢集。 -
在您的裝置或 上安裝和設定的
1.27.160
AWS Command Line Interface (AWS CLI) 版本2.12.3
或更新版本 AWS CloudShell。若要檢查您目前的版本,請使用
。套件管理員aws --version | cut -d / -f2 | cut -d ' ' -f1
yum
,例如apt-get
、 或 Homebrew for macOS 通常是最新版本 後面的幾個版本 AWS CLI。若要安裝最新版本,請參閱使用 安裝、更新和解除安裝 AWS CLI和 快速組態 aws configure (在 AWS Command Line Interface 使用者指南中) 安裝在 中的 AWS CLI 版本 AWS CloudShell 也可能是最新版本後面的幾個版本。若要更新它,請參閱 AWS CloudShell 使用者指南 中的安裝 AWS CLI 到您的主目錄。 -
已在裝置或 AWS CloudShell上安裝
kubectl
命令列工具。版本可與 相同,或最多可以比 更早或更晚的一個次要版本 Kubernetes 叢集的版本。例如,如果您的叢集版本為1.30
,則可以搭配使用kubectl
1.29
、1.30
或1.31
版。若要安裝或升級kubectl
,請參閱 設定 kubectl 和 eksctl。 -
您必須具有 Amazon VPC CNI plugin for Kubernetes 在啟動支援多個 Elastic Fabric Adapters 的工作者節點之前
1.7.10
已安裝 或更新版本,例如p4d
或p5
。如需更新 的詳細資訊 Amazon VPC CNI plugin for Kubernetes 版本,請參閱 IPs 指派給 Pods 使用 Amazon VPC CNI。
重要
EFA 搭配 採用 所需的重要考量 Kubernetes 正在設定和管理 Huge Pages 作為叢集中的資源。如需詳細資訊,請參閱中的管理大型頁面
建立節點群組
下列程序可協助您使用具有EFA介面 和 GPUDirect 的p4d.24xlarge
後端節點群組建立節點群組RDMA,並使用 執行多節點NCCL效能的 NVIDIA Collective Communications Library (NCCL) 測試範例EFAs。此範例可使用 範本,在 Amazon EKS上使用 進行分散式深度學習訓練EFAs。
-
決定您要在其中部署節點的 中EFA,有哪些 Amazon EC2執行個體類型支援 AWS 區域 。
將 取代為您要在其中部署節點群組 AWS 區域 的 。region-code
aws ec2 describe-instance-types --region
region-code
\ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output text部署節點時,您要部署的執行個體類型必須在 AWS 區域 叢集所在的 中可用。
-
判斷您想要部署的執行個體類型所在的哪一個 Availability Zone (可用區域) 為可用。在本教學課程中,會使用
p5.48xlarge
執行個體類型,且必須在輸出中傳回 AWS 區域 您在上一個步驟中指定的 。在生產叢集中部署節點時,
請將 取代為上一個步驟中傳回的任何執行個體類型。p5.48xlarge
aws ec2 describe-instance-type-offerings --region
region-code
\ --location-type availability-zone --filters Name=instance-type,Values=p4d.24xlarge,p5.48xlarge
\ --query 'InstanceTypeOfferings[*].Location' --output text範例輸出如下。
us-west-2a
us-west-2c
us-west-2b
請注意傳回的 Availability Zone (可用區域) 以供稍後步驟使用。當您將節點部署至叢集時,您的 VPC必須有子網路,其 IP 地址位於輸出中傳回的其中一個可用區域中。
-
使用 建立節點群組
eksctl
。先決條件
已在裝置或 AWS CloudShell上安裝版本
0.191.0
或更新版本的eksctl
命令列工具。如需有關安裝或更新eksctl
的指示,請參閱eksctl
文件中的安裝一節。 -
將下列內容複製到名為
的檔案。使用自己的取代efa-cluster.yaml
。您可以使用不同的執行個體取代example values
,但是如果您這樣做,請確保p5.48xlarge
availabilityZones
值是針對步驟 1 中執行個體類型傳回的可用區域。apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name:
my-efa-cluster
region:region-code
version: "1.XX
" iam: withOIDC: true availabilityZones: ["us-west-2a
", "us-west-2c
"] managedNodeGroups: - name:my-efa-ng
instanceType:p5.48xlarge
minSize:1
desiredCapacity:2
maxSize:3
availabilityZones: ["us-west-2a
"] volumeSize: 300 privateNetworking: true efaEnabled: true -
在現有叢集中建立受管節點群組。
eksctl create nodegroup -f
efa-cluster.yaml
如果您沒有現有的叢集,則可以執行以下命令來建立叢集和節點群組。
eksctl create cluster -f
efa-cluster.yaml
注意
由於此範例中使用的執行個體類型具有 GPUs, 會在每個執行個體上為您
eksctl
自動安裝 NVIDIA Kubernetes 裝置外掛程式。
-
-
部署 EFA Kubernetes 裝置外掛程式。
EFA Kubernetes 裝置外掛程式會偵測EFA介面並將其公告為 Kubernetes 的可配置資源。應用程式可以在
vpc.amazonaws.com/efa
中消耗延伸的資源類型 Pod 請求規格與 CPU和 記憶體相同。如需詳細資訊,請參閱中的使用延伸資源Kubernetes 文件中)。請求後,外掛程式會自動將EFA介面指派給 並掛載 Pod。 使用裝置外掛程式可簡化EFA設定,不需要 Pod 在特權模式下執行。 helm repo add eks https://aws.github.io/eks-charts helm install aws-efa-k8s-device-plugin --namespace kube-system eks/aws-efa-k8s-device-plugin
(選用) 測試 的效能 EFA
建議您測試 EFA設定。您可以在 上的aws-samples/awsome-distributed-training
儲存庫中使用 NCCL 測試
-
部署 Kubeflow MPI運算子
對於NCCL測試,您可以套用 Kubeflow MPI運算子。MPI 運算子可讓您輕鬆在 Kubernetes 上執行 Allreduce 型分散式訓練。如需詳細資訊,請參閱上的MPI運算子
GitHub. -
執行多節點NCCL效能測試以驗證 GPUDirectRDMA/EFA
使用 驗證NCCL效能 GPUDirectRDMA 透過 EFA執行標準NCCL效能測試。如需詳細資訊,請參閱 上的官方 NCCL-Tests
儲存庫 GitHub. 完成下列步驟以執行兩個節點 NCCL Performance Test。 在範例中 NCCL 測試任務,每個工作者會請求八個 GPUs、5210Mi 的
hugepages-2Mi
EFAs、四個 和 8000Mi 的記憶體,這實際上表示每個工作者都會消耗p5.48xlarge
執行個體的所有資源。-
建立 MPIJob 資訊清單
將下列項目複製到名為 的檔案
nccl-tests.yaml
:apiVersion: kubeflow.org/v2beta1 kind: MPIJob metadata: name: nccl-tests spec: runPolicy: cleanPodPolicy: Running backoffLimit: 20 slotsPerWorker: 8 mpiReplicaSpecs: Launcher: replicas: 1 template: spec: restartPolicy: OnFailure containers: - image: public.ecr.aws/hpc-cloud/nccl-tests:latest imagePullPolicy: IfNotPresent name: test-nccl-launcher env: - name: PATH value: $PATH:/opt/amazon/efa/bin:/usr/bin - name: LD_LIBRARY_PATH value: /opt/amazon/openmpi/lib:/opt/nccl/build/lib:/opt/amazon/efa/lib:/opt/aws-ofi-nccl/install/lib:/usr/local/nvidia/lib:$LD_LIBRARY_PATH - name: NCCL_DEBUG value: INFO - name: NCCL_BUFFSIZE value: '8388608' - name: NCCL_P2P_NET_CHUNKSIZE value: '524288' - name: NCCL_TUNER_PLUGIN value: /opt/aws-ofi-nccl/install/lib/libnccl-ofi-tuner.so command: - /opt/amazon/openmpi/bin/mpirun - --allow-run-as-root - --tag-output - -np - "16" - -N - "8" - --bind-to - none - -x - PATH - -x - LD_LIBRARY_PATH - -x - NCCL_DEBUG=INFO - -x - NCCL_BUFFSIZE - -x - NCCL_P2P_NET_CHUNKSIZE - -x - NCCL_TUNER_PLUGIN - --mca - pml - ^cm,ucx - --mca - btl - tcp,self - --mca - btl_tcp_if_exclude - lo,docker0,veth_def_agent - /opt/nccl-tests/build/all_reduce_perf - -b - "8" - -e - "16G" - -f - "2" - -g - "1" - -c - "1" - -n - "100" Worker: replicas: 2 template: spec: nodeSelector: node.kubernetes.io/instance-type: "p5.48xlarge" containers: - image: public.ecr.aws/hpc-cloud/nccl-tests:latest imagePullPolicy: IfNotPresent name: nccl-tests-worker volumeMounts: - name: shmem mountPath: /dev/shm resources: limits: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi vpc.amazonaws.com/efa: 32 memory: 32000Mi requests: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi vpc.amazonaws.com/efa: 32 memory: 32000Mi volumes: - name: shmem hostPath: path: /dev/shm
-
套用 NCCL-tests MPIJob
套用資訊清單
MPIJob
來提交 。這將建立兩個p5.48xlarge
Amazon EC2執行個體。kubectl apply -f nccl-tests.yaml
範例輸出如下。
mpijob.kubeflow.org/nccl-tests created
-
確認任務已啟動 Pod
檢視您執行中的 Pods.
kubectl get pods
範例輸出如下。
NAME READY STATUS RESTARTS AGE nccl-tests-launcher-
nbql9
0/1 Init:0/1 0 2m49s nccl-tests-worker-0 1/1 Running 0 2m49s nccl-tests-worker-1 1/1 Running 0 2m49sMPI 運算子會建立啟動器 Pod 和 2 個工作者 Pods (每個節點上一個)。
-
確認任務已成功使用日誌執行
檢視 的日誌
nccl-tests-launcher
Pod。
以輸出的值取代 。nbql9
kubectl logs -f nccl-tests-launcher-
nbql9
-
如果測試成功完成,您可以部署使用 的應用程式 Nvidia Collective Communication Library.