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

協助改善此頁面

想要為此使用者指南做出貢獻? 捲動至此頁面底部,然後在 上選取編輯此頁面 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 晶片或 AWS Trainium晶片EFA。若要查看具有硬體加速晶片和 的執行個體類型清單EFA,請參閱 Amazon EC2使用者指南 中的加速運算

當您比較執行個體類型以在它們之間進行選擇時,請考慮該執行個體類型可用的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.291.301.31 版。若要安裝或升級 kubectl,請參閱 設定 kubectl 和 eksctl

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

重要

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

建立節點群組

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

  1. 決定您要在其中部署節點的 中EFA,有哪些 Amazon EC2執行個體類型支援 AWS 區域 。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

    先決條件

    已在裝置或 AWS CloudShell上安裝版本 0.191.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設定。您可以在 上的aws-samples/awsome-distributed-training儲存庫中使用 NCCL 測試 GitHub。NCCL 測試會使用 Nvidia Collective Communication Library 評估網路的效能。下列步驟會在 Amazon 上提交NCCL測試EKS。

  1. 部署 Kubeflow MPI運算子

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

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

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

    完成下列步驟以執行兩個節點 NCCL Performance Test。 在範例中 NCCL 測試任務,每個工作者會請求八個 GPUs、5210Mi 的 hugepages-2MiEFAs、四個 和 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 運算子會建立啟動器 Pod 和 2 個工作者 Pods (每個節點上一個)。

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

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

      kubectl logs -f nccl-tests-launcher-nbql9

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