使用 Elastic Fabric Adapter 在 Amazon EKS 上執行機器學習訓練 - Amazon EKS

協助改善此頁面

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

若要提供此使用者指南,請選擇位於每個頁面右窗格中的在 GitHub 上編輯此頁面連結。

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

使用 Elastic Fabric Adapter 在 Amazon EKS 上執行機器學習訓練

本主題說明如何將 Elastic Fabric Adapter (EFA) 與 Amazon EKS 叢集中部署的 Pod 整合。Elastic Fabric Adapter (EFA) 是 Amazon EC2 執行個體的網路介面,可讓您在 AWS上大規模執行需要高層級節點間通訊的應用程式。其自訂的作業系統略過硬體介面可增強執行個體間通訊的效能,這對於擴展這些應用程式至關重要。藉由 EFA,使用訊息傳遞介面 (MPI) 的高效能運算 (HPC) 應用程式和使用 NVIDIA 集體通訊程式庫 (NCCL) 的機器學習 (ML) 應用程式可擴展到數千個 CPU 或 GPU。因此,您可以使用 AWS 雲端的隨需彈性和彈性,獲得現場部署 HPC 叢集的應用程式效能。將 EFA 與 Amazon EKS 叢集上執行的應用程式整合,可減少完成大規模分散式訓練工作負載的時間,而無需在叢集中新增其他執行個體。如需 EFA 的詳細資訊,請參閱 Elastic Fabric Adapter

具有 EFA 的執行個體類型

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

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

僅 EFA 和 EFA 介面

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

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

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

先決條件

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

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

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

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

  • 在啟動支援多個 Elastic Fabric Adapters 的工作者節點之前,您必須安裝適用於 Kubernetes 版本 1.7.10 或更新版本的 Amazon VPC CNI 外掛程式,例如 p4dp5。如需更新 Kubernetes 版本 Amazon VPC CNI 外掛程式的詳細資訊,請參閱 使用 Amazon VPC CNI 將 IPs 指派給 Pod

重要

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

建立節點群組

下列程序可協助您建立具有 EFA 介面和 GPUDirect RDMA 之 p4d.24xlarge 支援的節點群組,並針對使用 EFA 的多節點 NCCL 效能執行範例 NVIDIA 集體通訊程式庫 (NCCL) 測試。此範例可用於使用 EFA 在 Amazon EKS 上進行分散式深度學習訓練的範本。

  1. 決定您要在其中部署節點的 AWS 區域中可使用哪些支援 EFA 的 Amazon EC2 執行個體類型。將 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 必須在輸出中傳回的其中一個 Availability Zone (可用區域) 中具有可用 IP 位址的子網路。

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

    1. 將下列內容複製到名為 efa-cluster.yaml 的檔案。使用自己的取代範例值。您可以將 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,因此在使用 Amazon Linux 2 時, eksctl會自動在每個執行個體上安裝 NVIDIA Kubernetes 裝置外掛程式。Bottlerocket 不需要這麼做,因為 NVIDIA 裝置外掛程式內建於 Bottlerocket 的 EKS NVIDIA 變體中。在節點群組組態trueefaEnabled將 設定為 時, eksctl 也會自動在節點上部署 EFA 裝置外掛程式。

搭配 EFA 使用 Bottlerocket

Bottlerocket AMI 1.28.0 版及更新版本包含 EFA 的官方支援。若要將 Bottlerocket 用於已啟用 EFA 的節點,請在您的組態amiFamily: Bottlerocket中指定 。如果您需要使用自訂 AMI ID,您必須使用標準 nodeGroups 而非 managedNodeGroups

以下是範例組態:

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-efa-bottlerocket-cluster region: region-code version: "1.XX" iam: withOIDC: true availabilityZones: ["us-west-2a", "us-west-2c"] managedNodeGroups: - name: my-efa-bottlerocket-ng instanceType: p5.48xlarge minSize: 1 desiredCapacity: 2 maxSize: 3 availabilityZones: ["us-west-2a"] volumeSize: 300 privateNetworking: true efaEnabled: true amiFamily: Bottlerocket bottlerocket: enableAdminContainer: true settings: kernel: sysctl: "vm.nr_hugepages": "3000" # Configures 3000 * 2Mi = 6000Mi hugepages

上面的 vm.nr_hugepages sysctl 設定會設定 2Mi 個巨型分頁的數量。在此範例中,3000 表示 3000 * 2Mi = 6000Mi 的巨型分頁。

驗證 EFA 裝置外掛程式安裝

當您使用 建立節點群組時efaEnabled: trueeksctl會自動為您部署 EFA Kubernetes 裝置外掛程式。您可以驗證裝置外掛程式是否已安裝並正常運作:

  1. 檢查 DaemonSet 狀態:

    kubectl get daemonsets -n kube-system

    輸出範例:

    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE aws-efa-k8s-device-plugin-daemonset 2 2 2 2 2 <none> 6m16s ...

    在這裡,EFA 裝置外掛程式 DaemonSet 正在兩個節點上執行。兩者都已就緒且可用。

  2. 接著,驗證 DaemonSet 建立的 Pod:

    kubectl get pods -n kube-system -l name=aws-efa-k8s-device-plugin

    輸出範例:

    NAME READY STATUS RESTARTS AGE aws-efa-k8s-device-plugin-daemonset-d68bs 1/1 Running 0 6m16s aws-efa-k8s-device-plugin-daemonset-w4l8t 1/1 Running 0 6m16s

    EFA 裝置外掛程式 Pod 處於執行中狀態,確認外掛程式已成功部署並運作。

  3. 驗證資源註冊:

    您可以透過描述節點來確認vpc.amazonaws.com/efa資源已向 kubelet 註冊:

    kubectl describe nodes

    如果 EFA 資源已正確註冊,您會在節點的容量和可配置資源下看到它。例如:

    Capacity: ... vpc.amazonaws.com/efa: 4 Allocatable: ... vpc.amazonaws.com/efa: 4

    此輸出會確認節點可辨識 EFA 資源,使其可供請求它的 Pod 使用。

(選用) 測試 EFA 的效能

我們建議您測試 EFA 設定。您可以使用 GitHub 上儲存aws-samples/awsome-distributed-training庫中的 NCCL 測試NCCL Tests 使用 Nvidia Collective Communication Library 評估網路的效能。下列步驟會在 Amazon EKS 上提交 NCCL 測試。

  1. 部署 Kubeflow MPI 運算子:

    對於 NCCL 測試,您可以套用 Kubeflow MPI 運算子。MPI 運算子可以很容易地在 Kubernetes 上執行 Allreduce 式分散式訓練。如需詳細資訊,請參閱 GitHub 上的 MPI 運算子

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

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

    請完成以下步驟,以執行雙節點 NCCL 效能測試。在 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 測試 MPIJob:

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

      kubectl apply -f nccl-tests.yaml

      範例輸出如下。

      mpijob.kubeflow.org/nccl-tests created
    3. 確認任務已啟動 Pod:

      檢視您執行中的 Pod。

      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 個工作者 Pod (每個節點一個)。

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

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

      kubectl logs -f nccl-tests-launcher-nbql9

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