

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# Amazon EKS で Neuron デバイスを管理する
<a name="device-management-neuron"></a>

 AWS Trainium と AWS Inferentia は、AWS によって設計された専用の機械学習チップです。Amazon EKS は、EKS クラスターで Neuron デバイスを管理できるように 2 つのメカニズムをサポートしています。*Neuron DRA ドライバー*と *Neuron Kubernetes デバイスプラグイン*です。

Kubernetes バージョン 1.34 以降を実行している EKS クラスターで新たにデプロイする場合は、Neuron DRA ドライバーを使用することをお勧めします。Neuron DRA ドライバーは、トポロジ認識割り当て、コネクテッドデバイスサブセットスケジューリング、Logical 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 自動モード | サポート外 | サポート | 
| EKS 最適化 AMI のサポート | AL2023 | AL2023、Bottlerocket | 
| デバイスアドバタイズ | デバイス ID、インスタンスタイプ、トポロジ、ドライバーバージョン、EFA ローカリティなど、`ResourceSlice` オブジェクトによる豊富な属性 | `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` パラメータによるワークロードごとの Logical NeuronCore 設定 (LNC=1 または LNC=2) | EC2 起動テンプレートで事前設定が必要 | 
| 属性ベースの選択 | CEL 式を使用してインスタンスタイプやドライバーバージョンといった属性でデバイスをフィルタリングする | サポートされていません | 

## Neuron DRA ドライバーをインストールする
<a name="neuron-dra-driver"></a>

Neuron DRA ドライバーは、`DeviceClass` 名が `neuron.aws.com` である `ResourceSlice` オブジェクトとして Neuron デバイスをアドバタイズします。DaemonSet として実行されたこのドライバーは、Neuron デバイスとそのトポロジ属性を自動的に検出します。

Neuron DRA ドライバーの詳細については、[Neuron DRA のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html#neuron-dra-driver-attributes-reference)を参照してください。

Bottlerocket で Neuron DRA ドライバーを使用する機能は、現時点ではサポートされていません。

### 前提条件
<a name="_prerequisites"></a>
+ Amazon EKS クラスターで Kubernetes バージョン 1.34 以降が動作していること。
+ ノードのインスタンスタイプが AWS Trainium または Inferentia2 であること。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](helm.md)」を参照してください。
+  クラスターと通信するように `kubectl` が設定されていること。詳細については、「[`kubectl` をインストールまたは更新する](install-kubectl.md#kubectl-install-update)」を参照してください。

### 手順
<a name="_procedure"></a>

**重要**  
Neuron デバイスプラグインが実行されているノードに、Neuron DRA ドライバーをインストールしないでください。2 つのメカニズムを同じノードに共存させることはできません。最新の情報については、アップストリーム 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"
   ```

   ドライバーは、デフォルトで `neuron-dra-driver` 名前空間に DaemonSet としてデプロイされ、その際に `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)を参照してください。

### ポッドで Neuron デバイスをリクエストする
<a name="_request_neuron_devices_in_a_pod"></a>

DRA ドライバーを使用して Neuron デバイスをリクエストするには、`neuron.aws.com` `DeviceClass` を参照する `ResourceClaimTemplate` を作成し、それをポッド仕様で参照します。

次の例では、`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 台のデバイスです。`matchAttribute` 制約とトポロジグループ ID を使用して、デバイスが接続されていることを確認します。

次の例では、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` です。

### Logical NeuronCores (LNC) を設定する
<a name="_configure_logical_neuroncores_lnc"></a>

Neuron DRA ドライバーにより、`ResourceClaimTemplate` パラメータを使用してワークロードごとに Logical 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` としてアドバタイズし、NeuronCores を `aws.amazon.com/neuroncore` 拡張リソースとしてアドバタイズします。コンテナリソースのリクエストや制限の際に Neuron デバイスをリクエストします。

### 前提条件
<a name="_prerequisites_2"></a>
+ Amazon EKS クラスター。
+ ノードに、ホストレベルのコンポーネントが AWS Trainium または AWSInferentia インスタンス用にインストールされていること。こうしたコンポーネントは、EKS AL2023 高速 AMI または EKS Bottlerocket AMI を使用している場合に含まれています。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](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. DaemonSet という Neuron デバイスプラグインが実行されていることを確認します。

   ```
   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
   ```

### テストポッドを使用して Neuron デバイスを確認する
<a name="_verify_neuron_devices_with_a_test_pod"></a>

Neuron デバイスがアクセス可能であることを確認するには、テストポッドで `neuron-ls` ツールを実行します。

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. ポッドの実行が終了したら、そのログを表示します。

   ```
   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 ドライバーは、トポロジ制約を利用してこれを自動的に処理します。

Amazon EKS で Neuron デバイスを使用する方法の詳細については、[EKS 上で実行するための Neuron のドキュメント](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/kubernetes-getting-started.html)を参照してください。