

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

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

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

NVIDIA GPU は、機械学習トレーニング、推論、ハイパフォーマンスコンピューティングワークロードに広く使用されています。Amazon EKS は、EKS クラスターで NVIDIA GPU デバイスを管理できるように 2 つのメカニズムをサポートしています。*GPU 用 NVIDIA DRA ドライバー*と *NVIDIA Kubernetes デバイスプラグイン*です。

Kubernetes バージョン 1.34 以降を実行しているクラスターで新たにデプロイする場合は、NVIDIA DRA ドライバーを使用することをお勧めします。NVIDIA DRA ドライバーを使用すると、GPU を柔軟に割り当てたり、コンテナ間で GPU を共有したりできます。NVIDIA デバイスプラグインは、引き続きサポートされます。

## NVIDIA DRA ドライバーと NVIDIA デバイスプラグインの比較
<a name="_nvidia_dra_driver_vs_nvidia_device_plugin"></a>


| 機能 | NVIDIA DRA ドライバー | NVIDIA デバイスプラグイン | 
| --- | --- | --- | 
|  最小限必要な Kubernetes バージョン  |  1.34  |  EKS でサポートされているすべての Kubernetes バージョン  | 
|  Karpenter と EKS 自動モード  |  サポート外  |  サポート  | 
|  EKS 最適化 AMI  |  AL2023  |  AL2023、Bottlerocket  | 
|  デバイスアドバタイズ  |  GPU モデル、メモリ、ドライバーバージョン、トポロジーなど、`ResourceSlice` オブジェクトによる豊富な属性  |  `nvidia.com/gpu` 拡張リソースの整数カウント  | 
|  GPU 共有  |  同じポッド内の複数のコンテナが共有 `ResourceClaim` リファレンスを介して GPU を共有できる  |  サポート外。各 GPU は 1 つのコンテナにのみ割り当てられる。  | 
|  ComputeDomains  |  安全なマルチノード GPU 通信を実現できるように、`ComputeDomain` リソースを介してマルチノード NVLink (MNNVL) を管理する  |  サポートされていません  | 
|  属性ベースの選択  |  CEL 式を使用してモデルやメモリといった属性で GPU をフィルタリングする  |  サポートされていません  | 

## NVIDIA DRA ドライバーをインストールする
<a name="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)」を参照してください。

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

### 前提条件
<a name="_prerequisites"></a>
+ Amazon EKS クラスターで Kubernetes バージョン 1.34 以降が動作していること。
+ ノードのインスタンスタイプが 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 デバイスプラグインも一緒にデプロイすることはできません。最新の情報については、アップストリーム Kubernetes [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004) を参照してください。

1. NVIDIA DRA ドライバーの Helm チャートリポジトリを追加します。

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   ```

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

   ```
   helm repo update
   ```

1. NVIDIA DRA ドライバーの最新バージョンを入手します。

   ```
   helm search repo nvidia/nvidia-dra
   ```

1. NVIDIA DRA ドライバーをインストールします。

   ```
   helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
       --create-namespace \
       --namespace nvidia-dra-driver-gpu \
       --set resources.computeDomains.enabled=false \
       --set 'gpuResourcesEnabledOverride=true'
   ```

   詳細な設定オプションについては、[NVIDIA DRA ドライバーの Helm チャート](https://github.com/NVIDIA/k8s-dra-driver-gpu/blob/main/deployments/helm/nvidia-dra-driver-gpu/values.yaml)を参照してください。

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

   ```
   kubectl get pods -n nvidia-dra-driver-gpu
   ```

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

   ```
   kubectl get deviceclass
   ```

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

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

   ```
   kubectl get resourceslice
   ```

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

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

次の例では、GPU を 1 つだけリクエストしています。

```
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: app
    ...
    resources:
      claims:
      - name: gpu
  resourceClaims:
  - name: gpu
    resourceClaimTemplateName: single-gpu
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Exists"
    effect: "NoSchedule"
```

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

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

### 前提条件
<a name="_prerequisites_2"></a>
+ Amazon EKS クラスター。
+ ノードのインスタンスタイプが NVIDIA GPU であり、EKS 最適化 AL2023 NVIDIA AMI を使用していること。EKS 最適化 Bottlerocket AMI に NVIDIA デバイスプラグインが含まれているため、別途インストールする必要はありません。
+ コマンドライン環境に 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 \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true
   ```
**注記**  
[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_2"></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
  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                                                             |
+-----------------------------------------------------------------------------------------+
```