

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

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

# Amazon EKS で NVIDIA DRA ドライバーまたはデバイスプラグインを使用する
<a name="device-management-nvidia-dra-device-plugin"></a>

Amazon EKS は、EKS クラスターで NVIDIA GPU デバイスを管理できるように 2 つのメカニズムをサポートしています。*GPU 用 NVIDIA DRA ドライバー*と *NVIDIA Kubernetes デバイスプラグイン*です。

Karpenter、EKS マネージドノードグループ、またはセルフマネージドノードで [[静的キャパシティのプロビジョニング]](https://karpenter.sh/docs/concepts/nodepools/#static-nodepool) を使用する場合は、Kubernetes バージョン 1.34 以降の新しいデプロイに NVIDIA DRA ドライバーを使用することをお勧めします。NVIDIA DRA ドライバーは、現在 EKS Auto Mode ではサポートされていません。動的キャパシティのプロビジョニングを使用する場合は、EKS Auto Mode または Karpenter で [NVIDIA デバイスプラグイン](#eks-nvidia-device-plugin)を使用します。NVIDIA デバイスプラグインは、EKS マネージドノードグループとセルフマネージドノードでも引き続きサポートされます。

マルチインスタンス GPU (MIG) やタイムスライシングなどの GPU 共有機能を使用している場合は、DRA ドライバーで静的設定を使用するか、NVIDIA デバイスプラグインを使用することをお勧めします。NVIDIA DRA ドライバーでは、動的 MIG とタイムスライシングはアルファ状態です。最新の更新については、GitHub の [NVIDIA DRA ドライバーリリース](https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/releases)を参照してください。

## NVIDIA DRA ドライバーと NVIDIA デバイスプラグインの比較
<a name="eks-nvidia-dra-vs-plugin"></a>


| 機能 | NVIDIA DRA ドライバー | NVIDIA デバイスプラグイン | 
| --- | --- | --- | 
| 最小限必要な Kubernetes バージョン | 1.34 | EKS でサポートされているすべての Kubernetes バージョン | 
| EKS コンピューティング | Karpenter (静的キャパシティのみ)、マネージドノードグループ、セルフマネージドノード | EKS オートモード、Karpenter、マネージドノードグループ、セルフマネージドノード | 
| EKS 最適化 AMI | AL2023 (NVIDIA)、Bottlerocket | AL2023 (NVIDIA)、Bottlerocket | 
| デバイスアドバタイズ | GPU モデル、メモリ、ドライバーバージョン、トポロジーなど、`ResourceSlice` オブジェクトによる豊富な属性 | `nvidia.com/gpu` 拡張リソースの整数カウント | 
| GPU 共有 | (アルファ) 動的 MIG、MPS、タイムスライシング | (GA) 静的 MIG、MPS、タイムスライシング | 
| ComputeDomains | 安全なマルチノード GPU 通信を実現できるように、`ComputeDomain` リソースを介してマルチノード NVLink (MNNVL) を管理する | サポートされていません | 
| 属性ベースの選択 | CEL 式を使用してモデルやメモリといった属性で GPU をフィルタリングする | サポートされていません | 
| トポロジー認識 EFA 割り当て | DRA ネイティブトポロジー認識 | 自動トポロジー認識 (EKS 最適化 AL2023 AMI のみ) | 

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

GPU 用 NVIDIA DRA ドライバーは、GPU と ComputeDomains という 2 つのタイプのリソースを管理します。また、`gpu-kubelet-plugin` と `compute-domain-kubelet-plugin` という 2 つの DRA kubelet プラグインを実行します。それぞれ、インストール中に個別に有効または無効にできます。このガイドでは、GPU の割り当てに焦点を当てます。ComputeDomains の使用方法については、「[Amazon EKS で P6e-GB200 UltraServer を使用する](ml-eks-nvidia-ultraserver.md)」を参照してください。

### 前提条件
<a name="_prerequisites"></a>
+ Amazon EKS クラスターで Kubernetes バージョン 1.34 以降を実行していて、Karpenter、EKS マネージドノードグループ、またはセルフマネージドノードグループによって静的キャパシティがプロビジョニングされていること。
+ ノードのインスタンスタイプが NVIDIA GPU であること (`P` や `G` インスタンスなど)。
+ ノードに NVIDIA GPU 用のホストレベルのコンポーネントがインストールされていること。EKS 最適化 AL2023 または Bottlerocket NVIDIA AMI を使用する場合には、ホストレベルの NVIDIA ドライバー、CUDA ユーザーモードドライバー、コンテナツールキットがプリインストールされていること。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](helm.md)」を参照してください。
+  クラスターと通信するように `kubectl` が設定されていること。詳細については、「[`kubectl` をインストールまたは更新する](install-kubectl.md#kubectl-install-update)」を参照してください。

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

**重要**  
GPU デバイスの管理に NVIDIA DRA ドライバーを使用する場合、同じノードに NVIDIA デバイスプラグインと一緒にデプロイしないでください。これを行うと、基盤となるデバイスが同じノード上の複数のポッドにサイレントオーバーサブスクライブされる可能性があります。

**Bottlerocket で組み込み NVIDIA デバイスプラグインを無効にする**  
EKS 最適化 Bottlerocket NVIDIA バリアントには NVIDIA デバイスプラグインが含まれており、デフォルトで有効になっています。DRA ドライバーは、同じノードのデバイスプラグインと一緒に実行することはできません。DRA ドライバーを使用する前に、Bottlerocket GPU ノードの組み込みデバイスプラグインを無効にします。Bottlerocket ノードのユーザーデータで `settings.kubelet-device-plugins.nvidia.enabled` を `false` に設定します。  

```
[settings.kubelet-device-plugins.nvidia]
enabled = false
```
`settings.kubelet-device-plugins.nvidia.enabled` 設定は Bottlerocket バージョン 1.63.0 以降で使用できます。以前のバージョンでは、組み込み NVIDIA デバイスプラグインを無効にすることはできません。詳細については、GitHub の「[bottlerocket-os/bottlerocket pull request \#4856](https://github.com/bottlerocket-os/bottlerocket/pull/4856)」を参照してください。

1. NVIDIA DRA ドライバーを Kubernetes SIG OCI レジストリから直接インストールします。利用可能なバージョンを検索するには、GitHub の「[NVIDIA DRA ドライバーリリース](https://github.com/kubernetes-sigs/dra-driver-nvidia-gpu/releases)」を参照してください。

   ```
   helm install dra-driver-nvidia-gpu \
       oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu \
       --version {{0.4.1}} \
       --create-namespace \
       --namespace nvidia \
       --set resources.computeDomains.enabled=false \
       --set gpuResourcesEnabledOverride=true
   ```

   詳細な設定オプションについては、Kubernetes SIG ウェブサイトの「[NVIDIA DRA ドライバーの Helm チャート値](https://dra-driver-nvidia-gpu.sigs.k8s.io/docs/reference/helm-values/)」を参照してください。特定のチャートバージョンで使用できる値を表示するには、`helm show values oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu --version 0.4.1` を実行します。

1. (オプション) DRA ドライバーでタイムスライシングを使用するには、前のステップの `helm install` コマンドに `TimeSlicingSettings` 機能ゲートを追加します。これは、デフォルトで無効になっているアルファ機能です。詳細については、「[NVIDIA DRA ドライバーで GPU タイムスライシングを使用する](device-management-nvidia-time-slicing.md#eks-time-slicing-dra)」を参照してください。

   ```
   --set featureGates.TimeSlicingSettings=true
   ```

1. (オプション) DRA ドライバーで動的 MIG を使用するには、前のステップの `helm install` コマンドに `DynamicMIG` 機能ゲートを追加します。これは、デフォルトで無効になっているアルファ機能です。`DynamicMIG` 機能ゲートを `PassthroughSupport`、`NVMLDeviceHealthCheck`、または `MPSSupport` 機能ゲートと組み合わせることはできません。詳細については、「[NVIDIA DRA ドライバーで MIG を使用する](device-management-nvidia-mig.md#eks-mig-dra-driver)」を参照してください。

   ```
   --set featureGates.DynamicMIG=true
   ```

1. DRA ドライバーポッドが実行中であることを確認します。

   ```
   kubectl get pods -n nvidia
   ```

1. `DeviceClass` オブジェクトが作成されたことを確認します。

   ```
   kubectl get deviceclass
   ```

   ```
   NAME            AGE
   gpu.nvidia.com  60s
   ```

1. `ResourceSlice` オブジェクトが GPU ノードに公開されることを確認します。

   ```
   kubectl get resourceslice
   ```

   DRA ドライバーを使用して NVIDIA GPU をリクエストするには、`gpu.nvidia.com` `DeviceClass` を参照する `ResourceClaimTemplate` を作成し、それをポッド仕様で参照します。次の例では、GPU を 1 つだけリクエストしています。トポロジーに沿った EFA インターフェイスを備えた NVIDIA GPU を割り当てる手順については、「[EFA と GPU/Neuron デバイスのトポロジー認識割り当て](device-management-efa.md#efa-dra-topology-aware)」を参照してください。

   ```
   apiVersion: resource.k8s.io/v1
   kind: ResourceClaimTemplate
   metadata:
     name: single-gpu
   spec:
     spec:
       devices:
         requests:
         - name: gpu
           exactly:
             deviceClassName: gpu.nvidia.com
             count: 1
   ---
   apiVersion: v1
   kind: Pod
   metadata:
     name: gpu-workload
   spec:
     containers:
     - name: gpu-demo
       image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
       command: ["/bin/sh", "-c"]
       args: ["nvidia-smi && tail -f /dev/null"]
       resources:
         claims:
         - name: gpu
     resourceClaims:
     - name: gpu
       resourceClaimTemplateName: single-gpu
     tolerations:
     - key: "nvidia.com/gpu"
       operator: "Exists"
       effect: "NoSchedule"
   ```

## NVIDIA Kubernetes デバイスプラグインをインストールする
<a name="eks-nvidia-device-plugin"></a>

NVIDIA Kubernetes デバイスプラグインは、NVIDIA GPU を `nvidia.com/gpu` 拡張リソースとしてアドバタイズします。コンテナリソースのリクエストや制限の際に GPU をリクエストします。

### 前提条件
<a name="_prerequisites_2"></a>
+ Amazon EKS クラスター。
+ ノードのインスタンスタイプが NVIDIA GPU であること (`P` や `G` インスタンスなど)。
+ ノードのインスタンスタイプが NVIDIA GPU であり、EKS 最適化 AL2023 NVIDIA AMI を使用していること。EKS 最適化 Bottlerocket AMI には NVIDIA デバイスプラグインが含まれています。別途インストールする必要はありません。
+ ノードに NVIDIA GPU 用のホストレベルのコンポーネントがインストールされていること。EKS 最適化 AL2023 または Bottlerocket NVIDIA AMI を使用する場合には、ホストレベルの NVIDIA ドライバー、CUDA ユーザーモードドライバー、コンテナツールキットがプリインストールされていること。
+ コマンドライン環境に Helm がインストールされていること。詳細については、「[Setup Helm instructions](helm.md)」を参照してください。
+  クラスターと通信するように `kubectl` が設定されていること。詳細については、「[`kubectl` をインストールまたは更新する](install-kubectl.md#kubectl-install-update)」を参照してください。

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

1. NVIDIA デバイスプラグインの Helm チャートリポジトリを追加します。

   ```
   helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
   ```

1. ローカル Helm リポジトリを更新します。

   ```
   helm repo update
   ```

1. NVIDIA Kubernetes デバイスプラグインをインストールします。

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --create-namespace \
       --namespace nvidia
   ```
**オプション: GPU Feature Discovery (GFD) を有効にする**  
デバイスプラグインは `nvidia.com/gpu` 拡張リソースをアドバタイズし、GPU Pod を独自にスケジュールします。EKS 最適化 AL2023 NVIDIA AMI では、`nvidia.com/gpu.present=true` ノードラベルは `nodeadm` による起動時に既に適用されているため、GPU Feature Discovery (GFD) は基本的な GPU スケジューリングには必要ありません。  
`nvidia.com/gpu.product`、`nvidia.com/gpu.memory`、`nvidia.com/gpu.count`、MIG プロファイルラベル、ドライバー/CUDA バージョンなど、詳細な GPU 属性でノードにラベルを付けたい場合は、`--set gfd.enabled=true` で GFD を有効にします。これらのラベルを使用すると、`nodeSelector` またはノードアフィニティを使用して特定の GPU タイプをターゲットにできます (例えば、ワークロードを A10G GPU または特定の MIG プロファイルにのみスケジュールするなど)。タイムスライシングや MIG などの GPU 共有設定もこれらのラベルを使用します。属性ベースのノード選択や GPU 共有が必要ない場合は、フラグを省略できます。  

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --create-namespace \
       --namespace nvidia \
       --set gfd.enabled=true
   ```
**ワークロードが GDRCopy を使用している場合に GDRCopy を有効にする**  
 `k8s-device-plugin` v0.19.0 から v0.19.2 では、GDRCopy および MOFED 機能がデフォルトで有効になっていました。このデフォルトの有効化は `k8s-device-plugin` v0.19.3 で元に戻されました。元に戻した結果、Pod 仕様の `NVIDIA_GDRCOPY=enabled` 環境変数で GDRCopy (`gdrdrv`) をコンテナごとに有効にできなくなり、その変数は無視されるようになりました。  
ワークロードが GDRCopy (GPUDirect RDMA コピー) を使用している場合は、`gdrcopyEnabled=true` を設定して、インストール時にデバイスプラグインで有効にする必要があります。  

   ```
   helm upgrade --install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gdrcopyEnabled=true
   ```
(前述のように、GPU Feature Discovery ラベルも必要な場合は、`--set gfd.enabled=true` も追加します。)  
GitHub の [NVIDIA GPU Operator](https://github.com/NVIDIA/gpu-operator) を通じて NVIDIA デバイスプラグインを管理する場合、`gdrdrv` カーネルモジュールがノードにロードされると、オペレーターは動的に `GDRCOPY_ENABLED=true` を設定します。  
詳細については、GitHub の「[NVIDIA k8s-device-plugin の問題 \#1692](https://github.com/NVIDIA/k8s-device-plugin/issues/1692)」を参照してください。
**注記**  
GitHub の [NVIDIA GPU Operator](https://github.com/NVIDIA/gpu-operator) を使用して NVIDIA Kubernetes デバイスプラグインをインストールおよび管理することもできます。これにより、GPU のプロビジョニングに必要なすべての NVIDIA ソフトウェアコンポーネントの管理が自動化されます。

1. DaemonSet という NVIDIA デバイスプラグインが実行されていることを確認します。

   ```
   kubectl get ds -n nvidia nvdp-nvidia-device-plugin
   ```

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

1. ノードを調べて割り当て可能な GPU があることを確認します。

   ```
   kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
   ```

   出力例は次のとおりです。

   ```
   NAME                                           GPU
   ip-192-168-11-225.us-west-2.compute.internal   1
   ip-192-168-24-96.us-west-2.compute.internal    1
   ```

### ポッド内で NVIDIA GPU をリクエストする
<a name="_request_nvidia_gpus_in_a_pod"></a>

デバイスプラグインを使用して NVIDIA GPU をリクエストするには、コンテナリソースのリクエストと制限で `nvidia.com/gpu` リソースを指定します。

```
apiVersion: v1
kind: Pod
metadata:
  name: nvidia-smi
spec:
  restartPolicy: OnFailure
  containers:
  - name: gpu-demo
    image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
    command: ["/bin/sh", "-c"]
    args: ["nvidia-smi && tail -f /dev/null"]
    resources:
      limits:
        nvidia.com/gpu: 1
      requests:
        nvidia.com/gpu: 1
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
```

このテストを実行するには、マニフェストを適用してログを表示します。

```
kubectl apply -f nvidia-smi.yaml
kubectl logs nvidia-smi
```

出力例は次のとおりです。

```
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI XXX.XXX.XX            Driver Version: XXX.XXX.XX     CUDA Version: XX.X      |
|-----------------------------------------+------------------------+----------------------+
| 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 L4                      On  |   00000000:31:00.0 Off |                    0 |
| N/A   27C    P8             11W /   72W |       0MiB /  23034MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+
```