

 **協助改進此頁面** 

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

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

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

# 部署加速工作負載
<a name="auto-accelerated"></a>

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

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

EKS 自動模式會自動管理這些加速器的驅動程式：
+  [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 
+  [AWS Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 
+  [Amazon EC2 加速執行個體上的 NVIDIA GPU](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html) 

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

其他聯網支援：
+  [Elastic Fabric Adapter (EFA)](https://aws.amazon.com/hpc/efa/) 

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

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

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

## 先決條件
<a name="_prerequisites"></a>
+ 一個已設定 Amazon EKS 自動模式的 Kubernetes 叢集。
+ 當啟用 `general-purpose` 或 `system` 受管節點集區時，所建立的預設 `default` EKS 節點類別。

## 步驟 1：部署 GPU 工作負載
<a name="_step_1_deploy_a_gpu_workload"></a>

在此範例中，您將為需要 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：驗證
<a name="_step_2_validate"></a>

您會看見 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：清理
<a name="_step_3_clean_up"></a>

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

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

## NodePools 範例參考
<a name="_example_nodepools_reference"></a>

### 建立 NVIDIA NodePool
<a name="_create_an_nvidia_nodepool"></a>

以下 NodePool 定義：
+ 只啟動 `g6e` 和 `g6` 系列的執行個體
+ 節點閒置 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 自動模式支援的標籤](create-node-pool.md#auto-supported-labels)。

若您有特定的儲存需求，可以透過建立自己的 [NodeClass](create-node-class.md) 並在 NodePool 中參考，來調整節點的臨時儲存 `iops`、`size` 和 `throughput`。深入了解[可設定的 NodeClass 選項](create-node-class.md)。

 **NodeClass 的儲存組態範例** 

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

### 定義 AWS Trainium 和 AWS Inferentia NodePool
<a name="define_an_shared_aws_trainium_and_shared_aws_inferentia_nodepool"></a>

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

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