Amazon EKS で NVIDIA GPU デバイスを管理する - Amazon EKS

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

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

Amazon EKS で NVIDIA GPU デバイスを管理する

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 デバイスプラグインの比較

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

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

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

前提条件

  • Amazon EKS クラスターで Kubernetes バージョン 1.34 以降が動作していること。

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

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

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

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

手順

重要

GPU デバイスの管理に NVIDIA DRA ドライバーを使用する場合、同じノードに NVIDIA デバイスプラグインも一緒にデプロイすることはできません。最新の情報については、アップストリーム Kubernetes KEP-5004 を参照してください。

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

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
  2. ローカル Helm リポジトリを更新します。

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

    helm search repo nvidia/nvidia-dra
  4. 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 チャートを参照してください。

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

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

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

    kubectl get resourceslice

ポッド内で NVIDIA GPU をリクエストする

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

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

前提条件

  • Amazon EKS クラスター。

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

  • コマンドライン環境に 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 \ --namespace nvidia \ --create-namespace \ --set gfd.enabled=true
    注記

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