

 **帮助改进此页面** 

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

# 在 Amazon EKS 上管理 Neuron 设备
<a name="device-management-neuron"></a>

 AWS Trainium 和 AWS Inferentia 是由 AWS 专门设计的机器学习芯片。Amazon EKS 支持两种在 EKS 集群中管理 Neuron 设备的机制：*Neuron DRA 驱动程序*和 *Neuron Kubernetes 设备插件*。

对于在运行 Kubernetes 1.34 或更高版本的 EKS 集群上使用 EKS 托管节点组或自行管理的节点组进行的新部署，建议使用 Neuron DRA 驱动程序。Neuron DRA 驱动程序提供拓扑感知分配、连接设备子集调度、逻辑 NeuronCore（LNC）配置以及 UltraServer 多节点分配，无需自定义调度器扩展。

Neuron DRA 驱动程序不支持与 Karpenter 或 EKS 自动模式结合使用。请将 [Neuron 设备插件](#neuron-device-plugin)与 Karpenter 和 EKS 自动模式结合使用。Neuron 设备插件仍然支持与 EKS 托管节点组和自行管理的节点结合使用。

## Neuron DRA 驱动程序与 Neuron 设备插件
<a name="_neuron_dra_driver_vs_neuron_device_plugin"></a>


| 功能 | Neuron DRA 驱动程序 | Neuron 设备插件 | 
| --- | --- | --- | 
| 最低 Kubernetes 版本 | 1.34 | 所有 EKS 支持的 Kubernetes 版本 | 
| EKS 计算 | 托管节点组、自行管理的节点 | EKS 自动模式、Karpenter、托管节点组、自行管理的节点 | 
| EKS 优化型 AMI 支持 | AL2023（Neuron）、Bottlerocket | AL2023（Neuron）、Bottlerocket | 
| 设备发布方式 | 通过 `ResourceSlice` 对象发布丰富属性，包括设备 ID、实例类型、拓扑、驱动程序版本和 EFA 就近性 | 以整数计数形式发布 `aws.amazon.com/neuron` 和 `aws.amazon.com/neuroncore` 扩展资源 | 
| 连接的设备子集 | 使用拓扑约束分配 1、4、8 或 16 个已连接 Neuron 设备的子集 | 需要 [Neuron 调度器扩展](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html)以实现连续设备分配 | 
| LNC 配置 | 通过 `ResourceClaimTemplate` 参数进行每工作负载的逻辑 NeuronCore 配置（LNC=1 或 LNC=2） | 需要在 EC2 启动模板中预配置 | 
| 基于属性的选择 | 使用 CEL 表达式按实例类型、驱动程序版本等属性筛选设备 | 不支持 | 
| 拓扑感知 EFA 分配 | DRA 原生拓扑感知 | 自动拓扑感知（仅限 EKS 优化版 AL2023 AMI） | 

## 安装 Neuron DRA 驱动程序
<a name="neuron-dra-driver"></a>

Neuron DRA 驱动程序将 Neuron 设备作为名称为 `DeviceClass`、标识为 `neuron.aws.com` 的 `ResourceSlice` 对象进行发布。该驱动程序以 DaemonSet 形式运行，并自动发现 Neuron 设备及其拓扑属性。

有关 Neuron DRA 驱动程序的详细信息，请参阅 [Neuron DRA 文档](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html#neuron-dra-driver-attributes-reference)。

### 先决条件
<a name="_prerequisites"></a>
+ 运行 Kubernetes 1.34 或更高版本的 Amazon EKS 集群，使用 EKS 托管节点组或自行管理的节点组。
+ 具有 AWS Trainium 或 Inferentia2 实例类型的节点。
+ 在命令行环境中安装 Helm，有关更多信息，请参阅[安装 Helm 说明](helm.md)。
+  `kubectl` 配置为与您的集群通信，更多信息，请参阅 [安装或更新 `kubectl`](install-kubectl.md#kubectl-install-update)。

### 过程
<a name="_procedure"></a>

**重要**  
请勿在运行 Neuron 设备插件的节点上安装 Neuron DRA 驱动程序。这两种机制不能在同一节点上共存。有关更新，请参阅上游 Kubernetes [KEP–5004](https://github.com/kubernetes/enhancements/issues/5004)。

1. 使用 Helm 安装 Neuron DRA 驱动程序。

   ```
   helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
       --namespace neuron-dra-driver \
       --create-namespace \
       --set "devicePlugin.enabled=false" \
       --set "npd.enabled=false" \
       --set "draDriver.enabled=true"
   ```

   默认情况下，该驱动程序以 DaemonSet 形式部署在 `neuron-dra-driver` 命名空间中，并具有 `DeviceClass` `neuron.aws.com`

1. 验证 DRA 驱动程序 DaemonSet 正在运行。

   ```
   kubectl get ds -n neuron-dra-driver neuron-dra-driver-kubelet-plugin
   ```

   ```
   NAME                              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   neuron-dra-driver-kubelet-plugin  1         1         1       1            1           <none>          60s
   ```

1. 验证 `DeviceClass` 是否已创建：

   ```
   kubectl get deviceclass neuron.aws.com
   ```

   ```
   NAME            AGE
   neuron.aws.com  60s
   ```

1. 验证是否为您的节点发布了 `ResourceSlice` 对象。

   ```
   kubectl get resourceslice
   ```

有关 `ResourceSlice` 可用对象属性的信息，请参阅 [Neuron DRA 文档](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html#neuron-dra-driver-attributes-reference)。

### 在容器组（pod）中请求 Neuron 设备
<a name="_request_neuron_devices_in_a_pod"></a>

要使用 DRA 驱动程序请求 Neuron 设备，请创建一个引用 `neuron.aws.com` `DeviceClass` 的 `ResourceClaimTemplate`，并在您的容器组（pod）规约中引用它。

以下示例请求 `trn2.48xlarge` 实例上的所有 Neuron 设备：

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
---
apiVersion: v1
kind: Pod
metadata:
  name: neuron-workload
spec:
  containers:
  - name: app
    ...
    resources:
      claims:
      - name: neurons
  resourceClaims:
  - name: neurons
    resourceClaimTemplateName: all-neurons
```

### 分配连接的设备子集
<a name="_allocate_connected_device_subsets"></a>

Neuron DRA 驱动程序可以分配连接的 Neuron 设备子集，无需 [Neuron 调度器扩展](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html)。支持的子集大小为 1、4、8 或 16 个设备。使用带有拓扑组 ID 的 `matchAttribute` 约束来确保设备已连接。

以下示例请求 4 个连接的 Neuron 设备：

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: 1x4-connected-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          allocationMode: ExactCount
          count: 4
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
      constraints:
      - requests: ["neurons"]
        matchAttribute: "resource.aws.com/devicegroup4_id"
```

连接子集支持的 `matchAttribute` 值为 `resource.aws.com/devicegroup1_id`、`resource.aws.com/devicegroup4_id`、`resource.aws.com/devicegroup8_id` 和 `resource.aws.com/devicegroup16_id`。`devicegroup` 属性名称中的数字对应于连接拓扑组中的 Neuron 设备数量。例如，`resource.aws.com/devicegroup1_id` 标识单个 Neuron 设备，`resource.aws.com/devicegroup4_id` 标识一个包含 4 部已连接设备的组，而 `resource.aws.com/devicegroup8_id` 和 `resource.aws.com/devicegroup16_id` 分别标识包含 8 部和 16 部已连接设备的组。选择与请求中的设备 `count` 匹配的 `matchAttribute`，以便分配的设备属于同一连接拓扑组。有关这些属性的更多信息，请参阅 [Neuron DRA 驱动程序文档](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html)。

### 配置逻辑 NeuronCore（LNC）
<a name="_configure_logical_neuroncores_lnc"></a>

Neuron DRA 驱动程序通过 `ResourceClaimTemplate` 参数支持每工作负载的逻辑 NeuronCore 配置。这样就无需在 EC2 启动模板中预配置 LNC。

以下示例请求将 LNC 设置为 1 的所有 Neuron 设备：

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons-lnc-1
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
      config:
      - requests: ["neurons"]
        opaque:
          driver: neuron.aws.com
          parameters:
            apiVersion: neuron.aws.com/v1
            kind: NeuronConfig
            logicalNeuronCore: 1
```

### 分配具有对齐的 EFA 接口的神经元设备
<a name="_allocate_neuron_devices_with_aligned_efa_interfaces"></a>

请参阅 [拓扑感知的 EFA 和 GPU/Neuron 设备分配](device-management-efa.md#efa-dra-topology-aware)。

## 安装 Neuron Kubernetes 设备插件
<a name="neuron-device-plugin"></a>

Neuron Kubernetes 设备插件将 Neuron 设备发布为 `aws.amazon.com/neuron` 扩展资源，将 NeuronCore 发布为 `aws.amazon.com/neuroncore` 扩展资源。您需要在容器的资源请求和限制中请求 Neuron 设备。

### 先决条件
<a name="_prerequisites_2"></a>
+ 一个 Amazon EKS 集群。
+ 为 AWS Trainium 或 AWS Inferentia 实例安装了主机级组件的节点。如果使用 EKS AL2023 加速型 AMI 或 EKS Bottlerocket AMI，则已包含这些组件。
+ 在命令行环境中安装 Helm，有关更多信息，请参阅[安装 Helm 说明](helm.md)。
+  `kubectl` 配置为与您的集群通信，更多信息，请参阅 [安装或更新 `kubectl`](install-kubectl.md#kubectl-install-update)。

### 过程
<a name="_procedure_2"></a>

1. 使用 Helm 安装 Neuron Kubernetes 设备插件。

   ```
   helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
       --set "npd.enabled=false"
   ```

1. 验证 Neuron 设备插件 DaemonSet 是否正在运行。

   ```
   kubectl get ds -n kube-system neuron-device-plugin
   ```

   ```
   NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   neuron-device-plugin   1         1         1       1            1           <none>          60s
   ```

1. 验证节点是否具有可分配的 Neuron 设备。

   ```
   kubectl get nodes "-o=custom-columns=NAME:.metadata.name,NeuronDevice:.status.allocatable.aws\.amazon\.com/neuron,NeuronCore:.status.allocatable.aws\.amazon\.com/neuroncore"
   ```

   ```
   NAME                                           NeuronDevice   NeuronCore
   ip-192-168-47-173.us-west-2.compute.internal   1              2
   ```

### 使用测试容器组（pod）验证 Neuron 设备
<a name="_verify_neuron_devices_with_a_test_pod"></a>

您可以通过在测试容器组（pod）中运行 `neuron-ls` 工具来验证 Neuron 设备是否可访问。

1. 使用以下内容创建名为 `neuron-ls.yaml` 的文件。此清单会启动安装了 `neuron-ls` 工具的 [Neuron Monitor](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/neuron-monitor-user-guide.html) 容器。

   ```
   apiVersion: v1
   kind: Pod
   metadata:
     name: neuron-ls
   spec:
     restartPolicy: Never
     containers:
     - name: neuron-container
       image: public.ecr.aws/g4h4h0b5/neuron-monitor:1.0.0
       command: ["/bin/sh"]
       args: ["-c", "neuron-ls"]
       resources:
         limits:
           aws.amazon.com/neuron: 1
         requests:
           aws.amazon.com/neuron: 1
     tolerations:
     - key: "aws.amazon.com/neuron"
       operator: "Exists"
       effect: "NoSchedule"
   ```

1. 运用该清单。

   ```
   kubectl apply -f neuron-ls.yaml
   ```

1. 容器组（pod）运行完成后，查看其日志。

   ```
   kubectl logs neuron-ls
   ```

   示例输出如下。

   ```
   instance-type: inf2.xlarge
   instance-id: ...
   +--------+--------+--------+---------+
   | NEURON | NEURON | NEURON |   PCI   |
   | DEVICE | CORES  | MEMORY |   BDF   |
   +--------+--------+--------+---------+
   | 0      | 2      | 32 GB  | 00:1f.0 |
   +--------+--------+--------+---------+
   ```

**注意**  
当使用 Neuron 设备插件时，在具有多个 Neuron 设备（如 `trn2.48xlarge`）的实例上进行连续设备分配需要 [Neuron Kubernetes 调度器扩展](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html)。Neuron DRA 驱动程序通过拓扑约束自动处理此问题。

有关将 Neuron 设备与 Amazon EKS 结合使用的更多信息，请参阅[在 EKS 上运行的 Neuron 文档](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/kubernetes-getting-started.html)。