將 Elastic Fabric Adapter 新增至 EKS 叢集以進行 ML 訓練 - Amazon EKS

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

將 Elastic Fabric Adapter 新增至 EKS 叢集以進行 ML 訓練

本主題說明如何將 Elastic Fabric Adapter (EFA) 與 整合 Pods 部署在您的 Amazon EKS 叢集。Elastic Fabric Adapter (EFA) 是 Amazon EC2 執行個體的網路介面,可讓您執行需要大規模高階節點間通訊的應用程式 AWS。其自訂的作業系統略過硬體介面可增強執行個體間通訊的效能,這對於擴展這些應用程式至關重要。透過 EFA,使用訊息傳遞介面 (MPI) 的高效能運算 (HPC) 應用程式和使用 NVIDIA Collective Communications Library (NCCL) 的Machine Learning (ML) 應用程式可以擴展到數千個 CPUs 或 GPUs。因此,您可以取得內部部署 HPC 叢集的應用程式效能,以及 AWS 雲端的隨需彈性和彈性。將 EFA 與在 Amazon EKS 叢集上執行的應用程式整合,可減少完成大規模分散式訓練工作負載的時間,而不必將其他執行個體新增至叢集。如需 EFA、Elastic Fabric Adapter 的詳細資訊。

具有 EFA 的執行個體類型

AWS EFA Kubernetes 裝置外掛程式支援所有具有 EFA 的 Amazon EC2 執行個體類型。若要查看具有 EFA 的所有執行個體類型的清單,請參閱 Amazon EC2 使用者指南中的支援的執行個體類型。不過,為了快速執行 ML 應用程式,我們建議執行個體具有硬體加速晶片,例如 nVidia 除了 GPUs 之外,還有 EFA、AWS Inferentia 晶片或 AWS Trainium 晶片。若要查看具有硬體加速晶片和 EFA 的執行個體類型清單,請參閱 Amazon EC2 使用者指南中的加速運算

當您比較執行個體類型以在它們之間進行選擇時,請考慮該執行個體類型可用的 EFA 網路卡數量,以及加速器卡數量、CPU 數量和記憶體數量。每個網路卡最多可指派一個 EFA。EFA 會視為網路介面。若要查看每個具有 EFA 的執行個體類型可使用多少個 EFA,請參閱 Amazon EC2 使用者指南中的網路卡清單。

EFA 和僅限 EFA 介面

Elastic Fabric Adapter (EFA) 是一種網路介面,結合了彈性網路轉接器 (ENA) AWS 和作業系統旁路介面的功能,採用可擴展可靠資料包 (SRD) 通訊協定。EFA 功能允許應用程式直接與硬體通訊,以進行低延遲傳輸。您可以選擇只使用純 EFA 介面存取 Word 功能,限制與相同可用區域中介面的通訊。 EFA

若要建立可以具有純 EFA 介面的節點,您必須使用自訂 EC2 啟動範本,並將 InterfaceType設定為 efa-only。在自訂啟動範本中,您無法將網路卡設定為純 0 EFA 介面,因為這是 EC2 執行個體的主要網路卡和網路介面。對於純 CNIVPC 介面,您必須具有 EFA 版本 1.18.5 或更新版本。如果您使用的是 Amazon Linux 2,則僅限 EfA 介面的 ami 版本必須是 v20240928或更新版本。

下列程序會引導您建立具有 節點eksctl的 EKS 叢集 nVidia GPUs 和 EFA 介面。您無法使用 eksctl 建立節點和使用純 EFA 介面的節點群組。

必要條件

  • 現有的 Amazon EKS 叢集。如果您沒有現有的叢集,請使用 建立叢集Amazon EKS 入門。您的叢集必須部署在具有至少一個私有子網路,且具有足夠可用 IP 地址以部署節點的 VPC 中。私有子網路必須具有外部裝置提供的傳出網際網路存取權,例如 NAT 閘道。

    如果計劃使用 eksctl 來建立您的節點群組,eksctl 也會為您建立叢集。

  • 在您的裝置 or AWS CloudShell 上安裝和設定的 AWS 命令列介面 (AWS CLI) 版本 1.27.160 2.12.3或更新版本。若要檢查您目前的版本,請使用 aws --version | cut -d / -f2 | cut -d ' ' -f1。套件管理員apt-get,例如 yum、 或 Homebrew for macOS 通常是最新版本 AWS CLI 後面的幾個版本。若要安裝最新版本,請參閱 AWS 命令列介面使用者指南中的使用 aws 設定安裝 和 快速組態。 https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config安裝在 in AWS CLI 中的 AWS CloudShell 版本也可能是最新版本後面的幾個版本。若要更新它,請參閱 AWS CLI 使用者指南中的將 Word 安裝到您的主目錄 AWS CloudShell

  • kubectl 命令列工具安裝在您的裝置或 AWS CloudShell 上。版本可以與 相同,也可以比 更早或更晚的一個次要版本相同 Kubernetes 叢集的版本。例如,如果您的叢集版本為 1.29,則可以搭配使用 kubectl 1.281.291.30 版。若要安裝或升級 kubectl,請參閱 設定 kubectl 和 eksctl

  • 您必須具有 Amazon VPC CNI plugin for Kubernetes 在啟動支援多個彈性 Fabric Adapters 的工作者節點之前1.7.10,已安裝 或更新版本,例如 p4dp5。如需更新 的詳細資訊 Amazon VPC CNI plugin for Kubernetes 版本,請參閱 Amazon VPC CNI

重要

搭配 使用 EFA 所需的重要考量 Kubernetes 正在設定和管理 Huge Pages 作為叢集中的資源。如需詳細資訊,請參閱中的管理大型頁面 Kubernetes 文件中)。具有 EC2 驅動程式的 Amazon EFA 執行個體已安裝預先配置的 5128 2MiB Huge Pages,您可以請求 作為資源來取用您的任務規格。

建立節點群組

下列程序可協助您建立具有 EFA 介面和 GPUDirect 的p4d.24xlarge後端節點群組的節點群組RDMA,並使用 NCCL 執行多節點 NCCL 效能的 NVIDIA Collective Communications Library (EFAs) 測試範例。此範例可使用 範本,在 Amazon EKS 上使用 EFAs 進行分散式深度學習訓練。

  1. 決定您要在其中部署節點的 AWS 區域中,有哪些支援 EFA 的 Amazon EC2 執行個體類型可供使用。Replace (取代) region-code 您想要部署節點群組 AWS 的區域。

    aws ec2 describe-instance-types --region region-code \ --filters Name=network-info.efa-supported,Values=true \ --query "InstanceTypes[*].[InstanceType]" --output text

    部署節點時,您要部署的執行個體類型必須在叢集所在的 AWS 區域中可用。

  2. 判斷您想要部署的執行個體類型所在的哪一個 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 地址。

  3. 使用 建立節點群組eksctl。您需要在裝置 or AWS CloudShell 上安裝 版0.194.0或更新版本的eksctl命令列工具。如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的安裝一節。

    1. 將下列內容複製到名為 的檔案 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
    2. 在現有叢集中建立受管節點群組。

      eksctl create nodegroup -f efa-cluster.yaml

      如果您沒有現有的叢集,您可以執行下列命令來建立叢集和節點群組。

      eksctl create cluster -f efa-cluster.yaml
      注意

      由於此範例中使用的執行個體類型具有 GPUs, eksctl會自動為您在每個執行個體上安裝 NVIDIA Kubernetes 裝置外掛程式。

  4. 部署 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 設定。您可以使用 onNCCL 儲存庫中的 Word 測試aws-samples/awsome-distributed-training GitHubNCCL Tests 使用 Nvidia Collective Communication Library 評估網路的效能。下列步驟會在 Amazon NCCL 上提交 EKS 測試。

  1. 部署 Kubeflow MPI 運算子:

    對於 NCCL 測試,您可以套用 Kubeflow MPI 運算子。MPI Operator 可讓您在 Kubernetes 上輕鬆執行 Allreduce 型分散式訓練。如需詳細資訊,請參閱 上的 MPI Operator GitHub.

  2. 執行多節點 NCCL 效能測試以驗證 GPUDirectRDMA/EFA:

    使用 驗證 NCCL 效能 GPUDirectRDMA 透過 EFA,執行標準 NCCL 效能測試。如需詳細資訊,請參閱 上的官方 NCCL-Tests 儲存庫 GitHub.

    完成下列步驟以執行兩個節點 NCCL Performance Test。 在 範例中 NCCL 測試任務,每個工作者請求八個 GPUs、5210Mi 的 hugepages-2Mi、四個 EFAs 和 8000Mi 的記憶體,這實際上意味著每個工作者都會消耗p5.48xlarge執行個體的所有資源。

    1. 建立 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
    2. 套用 NCCL-tests MPIJob字:

      套用資訊清單MPIJob來提交 。這將建立兩個 p5.48xlarge Amazon EC2 執行個體。

      kubectl apply -f nccl-tests.yaml

      範例輸出如下。

      mpijob.kubeflow.org/nccl-tests created
    3. 確認任務已啟動 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 2m49s

      MPI Operator 會建立啟動器 Pod 和 2 個工作者 Pods (每個節點一個)。

    4. 使用 日誌確認任務已成功執行:

      檢視 的日誌 nccl-tests-launcher Pod。 取代 nbql9 輸出中的 值。

      kubectl logs -f nccl-tests-launcher-nbql9

如果測試成功完成,您可以部署使用 的應用程式 Nvidia Collective Communication Library.