使用 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。因此,您可以取得現場部署 HPC 叢集的應用程式效能,以及 AWS 雲端的隨需彈性和彈性。將 EFA 與 Amazon EKS 叢集上執行的應用程式整合,可減少完成大規模分散式訓練工作負載的時間,而無需在叢集中新增其他執行個體。如需 EFA 的詳細資訊,請參閱 Elastic Fabric Adapter

具有 EFA 的執行個體類型

AWS EFA Kubernetes Device Plugin 支援所有具有 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 旁路介面的功能,採用 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或更新版本。

下列程序會引導您使用具有 nVidia GPUs 和 EFA 介面的節點來建立 eksctl 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 設定安裝 和 Quick configuration。 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 頁面,您可以請求 做為資源,以在任務規格中使用。

建立節點群組

下列程序可協助您建立具有 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.204.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
      注意

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

  4. 部署 EFA Kubernetes 裝置外掛程式。

    EFA Kubernetes 裝置外掛程式會進行偵測並宣告 EFA 介面為 Kubernetes 的可配置資源。應用程式可以使用 Pod 請求規格vpc.amazonaws.com/efa中的擴充資源類型,就像 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 設定。您可以使用 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-2Mi5210Mi、四個 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 的應用程式。