部署加速工作負載 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

部署加速工作負載

本教學課程示範 Amazon EKS 自動模式如何簡化加速工作負載的啟動流程。Amazon EKS 自動模式不僅限於叢集本身,還透過自動化關鍵基礎結構元件來簡化操作,這些元件預設提供運算、聯網、負載平衡、儲存和身分存取管理功能。

Amazon EKS 自動模式包含特定執行個體類型所需的驅動程式和裝置外掛程式,例如 NVIDIA 和 AWS Neuron 驅動程式。您無需安裝或更新這些元件。

EKS 自動模式會自動管理這些加速器的驅動程式:

注意

EKS 自動模式包含 Kubernetes 專用 NVIDIA 裝置外掛程式。此外掛程式會自動執行,且在您的叢集中不會顯示為常駐程式集。

其他聯網支援:

Amazon EKS 自動模式消除了加速器驅動程式和裝置外掛程式管理的繁瑣工作。

您還可以透過將叢集縮減至零來節省成本。您可以設定 EKS 自動模式,在沒有工作負載執行時終止執行個體。這對基於批次的推斷工作負載很有用。

以下提供一個範例,說明如何使用 Amazon EKS 自動模式啟動加速工作負載。

先決條件

  • 一個已設定 Amazon EKS 自動模式的 Kubernetes 叢集。

  • 當啟用 general-purposesystem 受管節點集區時,所建立的預設 default EKS 節點類別。

步驟 1:部署 GPU 工作負載

在此範例中,您將為需要 45GB GPU 記憶體的 NVIDIA 基礎工作負載建立一個 NodePool。透過 EKS 自動模式,您可使用 Kubernetes 排程限制來定義您的執行個體需求。

要部署 Amazon EKS 自動模式的 NodePool 和範例 workload,請檢閱以下的 NodePool 和 Pod 定義,並分別儲存為 nodepool-gpu.yamlpod.yaml

nodepool-gpu.yaml

apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: disruption: budgets: - nodes: 10% consolidateAfter: 1h consolidationPolicy: WhenEmpty template: metadata: {} spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "karpenter.sh/capacity-type" operator: In values: ["on-demand"] - key: "kubernetes.io/arch" operator: In values: ["amd64"] - key: "eks.amazonaws.com/instance-family" operator: In values: - g6e - g6 taints: - key: nvidia.com/gpu effect: NoSchedule terminationGracePeriod: 24h0m0s

pod.yaml

apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: nodeSelector: eks.amazonaws.com/compute-type: auto restartPolicy: OnFailure containers: - name: nvidia-smi image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal args: - "nvidia-smi" resources: requests: memory: "30Gi" cpu: "3500m" nvidia.com/gpu: 1 limits: memory: "30Gi" nvidia.com/gpu: 1 tolerations: - key: nvidia.com/gpu effect: NoSchedule operator: Exists

請注意,eks.amazonaws.com/compute-type: auto 選擇器要求工作負載必須部署在 Amazon EKS 自動模式節點上。NodePool 還設定了一個污點,只允許排程具有 NVIDIA GPU 容忍度的 Pod。

將 NodePool 和工作負載套用至您的叢集。

kubectl apply -f nodepool-gpu.yaml kubectl apply -f pod.yaml

您應該會看到下列輸出:

nodepool.karpenter.sh/gpu configured created pod/nvidia-smi created

等待幾秒鐘,並檢查叢集中的節點。您現在應該會看到在 Amazon EKS 自動叢集中佈建了一個新節點:

> kubectl get nodes NAME TYPE CAPACITY ZONE NODE READY AGE gpu-dnknr g6e.2xlarge on-demand us-west-2b i-02315c7d7643cdee6 True 76s

步驟 2:驗證

您會看見 Amazon EKS 自動模式啟動了一個 g6e.2xlarge 而非 g6.2xlarge,這是因為根據以下的 Kubernetes 排程限制,工作負載需要一個配備 l40s GPU 的執行個體:

... nodeSelector: eks.amazonaws.com/instance-gpu-name: l40s ... requests: memory: "30Gi" cpu: "3500m" nvidia.com/gpu: 1 limits: memory: "30Gi" nvidia.com/gpu: 1

現在,執行以下命令查看容器日誌:

kubectl logs nvidia-smi

輸出範例:

+---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA L40S On | 00000000:30:00.0 Off | 0 | | N/A 27C P8 23W / 350W | 0MiB / 46068MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+

您會看到容器已偵測到其正在具有 NVIDIA GPU 的執行個體上執行,且您無需安裝任何裝置驅動程式,因為這由 Amazon EKS 自動模式管理。

步驟 3:清理

若要移除所有建立的物件,請使用 kubectl 刪除範例部署和 NodePool,以便終止節點:

kubectl delete -f nodepool-gpu.yaml
kubectl delete -f pod.yaml

NodePools 範例參考

建立 NVIDIA NodePool

以下 NodePool 定義:

  • 只啟動 g6eg6 系列的執行個體

  • 節點閒置 1 小時後進行合併

    • consolodateAfter 1 小時的值可支援突增的工作負載,並減少節點波動。您可根據工作負載需求調整 consolidateAfter

具有 GPU 執行個體系列和合併功能的範例 NodePool

apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: gpu spec: disruption: budgets: - nodes: 10% consolidateAfter: 1h consolidationPolicy: WhenEmpty template: metadata: {} spec: nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: default requirements: - key: "karpenter.sh/capacity-type" operator: In values: ["on-demand"] - key: "kubernetes.io/arch" operator: In values: ["amd64"] - key: "eks.amazonaws.com/instance-family" operator: In values: - g6e - g6 terminationGracePeriod: 24h0m0s

您可使用 eks.amazonaws.com/instance-family 來指定執行個體系列,而非設定 eks.amazonaws.com/instance-gpu-name。如需其他影響排程的知名標籤,請參閱 EKS 自動模式支援的標籤

若您有特定的儲存需求,可以透過建立自己的 NodeClass 並在 NodePool 中參考,來調整節點的臨時儲存 iopssizethroughput。深入了解可設定的 NodeClass 選項

NodeClass 的儲存組態範例

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: gpu spec: ephemeralStorage: iops: 3000 size: 80Gi throughput: 125

定義 AWS Trainium 與 AWS Inferentia NodePool

以下 NodePool 設定了 eks.amazonaws.com/instance-category,表示僅啟動 Inferentia 與 Trainium 系列的執行個體:

        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values:
            - inf
            - trn