

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 部署加速型工作负载
<a name="auto-accelerated"></a>

本教程演示了 Amazon EKS 自动模式如何简化硬件加速型工作负载的启动。Amazon EKS 自动模式通过自动执行各种关键基础设施组件操作，提供可开箱即用的计算、联网、负载均衡、存储以及身份访问和管理功能，从而简化集群本身以外的操作。

Amazon EKS 自动模式包含某些实例类型所需的驱动程序和设备插件，例如 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>

在此示例中，您将为基于 NVIDIA 的工作负载创建一个节点池，需要 45GB GPU 内存。使用 EKS 自动模式时，您可以使用 Kubernetes 调度约束来定义实例要求。

要部署 Amazon EKS 自动模式 `NodePool` 和示例 `workload`，请检查以下节点池和容器组（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 自动模式节点上。该节点池还设置了一个污点，从而只允许调度具有 Nvidia GPU 容忍度的容器组。

将该节点池和工作负载应用到集群：

```
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` 删除示例部署和节点池，从而终止该节点：

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

## 节点池引用示例
<a name="_example_nodepools_reference"></a>

### 创建 NVIDIA 节点池
<a name="_create_an_nvidia_nodepool"></a>

以下节点池定义了如下要求：
+ 仅启动 `g6e` 和 `g6` 系列的实例
+ 合并空置达到 1 小时的节点
  + 使用 1 小时的 `consolodateAfter` 值，可支持高峰工作负载并减少节点中断。您可以根据工作负载要求微调 `consolidateAfter`。

 **搭载 GPU 实例系列的节点池以及合并功能示例** 

```
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-gpu-name`，而改为使用 `eks.amazonaws.com/instance-family` 来指定实例系列。有关可能影响调度审查的其他已知标签，请参阅[受 EKS 自动模式支持的标签](create-node-pool.md#auto-supported-labels)。

如果您有特定的存储需求，则可以通过在节点池中创建自己的[节点类](create-node-class.md)来引用，从而微调节点的临时存储 `iops`、`size` 和 `throughput`。详细了解[可配置的节点类选项](create-node-class.md)。

 **节点类的存储配置示例** 

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

### 定义 AWS Trainium 和 AWS Inferentia 节点池
<a name="define_an_shared_aws_trainium_and_shared_aws_inferentia_nodepool"></a>

以下节点池设的 `eks.amazonaws.com/instance-category` 集规定只能启动 Inferentia 和 Trainium 系列的实例：

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