協助改進此頁面
若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。
部署加速工作負載
本教學課程示範 Amazon EKS 自動模式如何簡化加速工作負載的啟動流程。Amazon EKS 自動模式不僅限於叢集本身,還透過自動化關鍵基礎結構元件來簡化操作,這些元件預設提供運算、聯網、負載平衡、儲存和身分存取管理功能。
Amazon EKS 自動模式包含特定執行個體類型所需的驅動程式和裝置外掛程式,例如 NVIDIA 和 AWS Neuron 驅動程式。您無需安裝或更新這些元件。
EKS 自動模式會自動管理這些加速器的驅動程式:
注意
EKS 自動模式包含 Kubernetes 專用 NVIDIA 裝置外掛程式。此外掛程式會自動執行,且在您的叢集中不會顯示為常駐程式集。
其他聯網支援:
Amazon EKS 自動模式消除了加速器驅動程式和裝置外掛程式管理的繁瑣工作。
您還可以透過將叢集縮減至零來節省成本。您可以設定 EKS 自動模式,在沒有工作負載執行時終止執行個體。這對基於批次的推斷工作負載很有用。
以下提供一個範例,說明如何使用 Amazon EKS 自動模式啟動加速工作負載。
先決條件
-
一個已設定 Amazon EKS 自動模式的 Kubernetes 叢集。
-
當啟用
general-purpose或system受管節點集區時,所建立的預設defaultEKS 節點類別。
步驟 1:部署 GPU 工作負載
在此範例中,您將為需要 45GB GPU 記憶體的 NVIDIA 基礎工作負載建立一個 NodePool。透過 EKS 自動模式,您可使用 Kubernetes 排程限制來定義您的執行個體需求。
要部署 Amazon EKS 自動模式的 NodePool 和範例 workload,請檢閱以下的 NodePool 和 Pod 定義,並分別儲存為 nodepool-gpu.yaml 和 pod.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 定義:
-
只啟動
g6e和g6系列的執行個體 -
節點閒置 1 小時後進行合併
-
consolodateAfter1 小時的值可支援突增的工作負載,並減少節點波動。您可根據工作負載需求調整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 中參考,來調整節點的臨時儲存 iops、size 和 throughput。深入了解可設定的 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