

 **帮助改进此页面** 

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

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

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

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

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


| 功能 | Neuron DRA 驱动程序 | Neuron 设备插件 | 
| --- | --- | --- | 
|  最低 Kubernetes 版本  |  1.34  |  所有 EKS 支持的 Kubernetes 版本  | 
|  Karpenter 和 EKS Auto Mode   |  不支持  |  支持  | 
|  EKS 优化型 AMI 支持  |  AL2023  |  AL2023、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 表达式按实例类型、驱动程序版本等属性筛选设备  |  不支持  | 

## 安装 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)。

目前不支持将 Neuron DRA 驱动程序与 Bottlerocket 结合使用。

### 先决条件
<a name="_prerequisites"></a>
+ 一个运行 Kubernetes 1.34 或更高版本的 Amazon EKS 集群。
+ 具有 Amazon 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`。

### 配置逻辑 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
```

## 安装 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 集群。
+ 为 Amazon Trainium 或 Amazon 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
     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)。