View a markdown version of this page

Amazon EKS で NVIDIA DRA ドライバーまたはデバイスプラグインを使用する - Amazon EKS

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

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

Amazon EKS で NVIDIA DRA ドライバーまたはデバイスプラグインを使用する

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

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

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

NVIDIA DRA ドライバーと NVIDIA デバイスプラグインの比較

機能 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 ドライバーをインストールする

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

前提条件

  • Amazon EKS クラスターで Kubernetes バージョン 1.34 以降を実行していて、Karpenter、EKS マネージドノードグループ、またはセルフマネージドノードグループによって静的キャパシティがプロビジョニングされていること。

  • ノードのインスタンスタイプが NVIDIA GPU であること (PG インスタンスなど)。

  • ノードに NVIDIA GPU 用のホストレベルのコンポーネントがインストールされていること。EKS 最適化 AL2023 または Bottlerocket NVIDIA AMI を使用する場合には、ホストレベルの NVIDIA ドライバー、CUDA ユーザーモードドライバー、コンテナツールキットがプリインストールされていること。

  • コマンドライン環境に Helm がインストールされていること。詳細については、「Setup Helm instructions」を参照してください。

  • クラスターと通信するように kubectl が設定されていること。詳細については、「kubectl をインストールまたは更新する」を参照してください。

手順

重要

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

Bottlerocket で組み込み NVIDIA デバイスプラグインを無効にする

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

[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」を参照してください。

  1. NVIDIA DRA ドライバーを Kubernetes SIG OCI レジストリから直接インストールします。利用可能なバージョンを検索するには、GitHub の「NVIDIA DRA ドライバーリリース」を参照してください。

    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 チャート値」を参照してください。特定のチャートバージョンで使用できる値を表示するには、helm show values oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu --version 0.4.1 を実行します。

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

    --set featureGates.TimeSlicingSettings=true
  3. (オプション) DRA ドライバーで動的 MIG を使用するには、前のステップの helm install コマンドに DynamicMIG 機能ゲートを追加します。これは、デフォルトで無効になっているアルファ機能です。DynamicMIG 機能ゲートを PassthroughSupportNVMLDeviceHealthCheck、または MPSSupport 機能ゲートと組み合わせることはできません。詳細については、「NVIDIA DRA ドライバーで MIG を使用する」を参照してください。

    --set featureGates.DynamicMIG=true
  4. DRA ドライバーポッドが実行中であることを確認します。

    kubectl get pods -n nvidia
  5. DeviceClass オブジェクトが作成されたことを確認します。

    kubectl get deviceclass
    NAME AGE gpu.nvidia.com 60s
  6. ResourceSlice オブジェクトが GPU ノードに公開されることを確認します。

    kubectl get resourceslice

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

    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 デバイスプラグインをインストールする

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

前提条件

  • Amazon EKS クラスター。

  • ノードのインスタンスタイプが NVIDIA GPU であること (PG インスタンスなど)。

  • ノードのインスタンスタイプが NVIDIA GPU であり、EKS 最適化 AL2023 NVIDIA AMI を使用していること。EKS 最適化 Bottlerocket AMI には NVIDIA デバイスプラグインが含まれています。別途インストールする必要はありません。

  • ノードに NVIDIA GPU 用のホストレベルのコンポーネントがインストールされていること。EKS 最適化 AL2023 または Bottlerocket NVIDIA AMI を使用する場合には、ホストレベルの NVIDIA ドライバー、CUDA ユーザーモードドライバー、コンテナツールキットがプリインストールされていること。

  • コマンドライン環境に Helm がインストールされていること。詳細については、「Setup Helm instructions」を参照してください。

  • クラスターと通信するように kubectl が設定されていること。詳細については、「kubectl をインストールまたは更新する」を参照してください。

手順

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

    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
  2. ローカル Helm リポジトリを更新します。

    helm repo update
  3. 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.productnvidia.com/gpu.memorynvidia.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 を通じて NVIDIA デバイスプラグインを管理する場合、gdrdrv カーネルモジュールがノードにロードされると、オペレーターは動的に GDRCOPY_ENABLED=true を設定します。

    詳細については、GitHub の「NVIDIA k8s-device-plugin の問題 #1692」を参照してください。

    注記

    GitHub の NVIDIA GPU Operator を使用して NVIDIA Kubernetes デバイスプラグインをインストールおよび管理することもできます。これにより、GPU のプロビジョニングに必要なすべての NVIDIA ソフトウェアコンポーネントの管理が自動化されます。

  4. 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
  5. ノードを調べて割り当て可能な 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 をリクエストする

デバイスプラグインを使用して 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 | +-----------------------------------------------------------------------------------------+