このページの改善にご協力ください
このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。
Amazon EKS で NVIDIA DRA ドライバーまたはデバイスプラグインを使用する
Amazon EKS は、EKS クラスターで NVIDIA GPU デバイスを管理できるように 2 つのメカニズムをサポートしています。GPU 用 NVIDIA DRA ドライバーと NVIDIA Kubernetes デバイスプラグインです。
Karpenter、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 モデル、メモリ、ドライバーバージョン、トポロジーなど、 |
|
|
GPU 共有 |
(アルファ) 動的 MIG、MPS、タイムスライシング |
(GA) 静的 MIG、MPS、タイムスライシング |
|
ComputeDomains |
安全なマルチノード GPU 通信を実現できるように、 |
サポートされていません |
|
属性ベースの選択 |
CEL 式を使用してモデルやメモリといった属性で GPU をフィルタリングする |
サポートされていません |
|
トポロジー認識 EFA 割り当て |
DRA ネイティブトポロジー認識 |
自動トポロジー認識 (EKS 最適化 AL2023 AMI のみ) |
NVIDIA DRA ドライバーをインストールする
GPU 用 NVIDIA DRA ドライバーは、GPU と ComputeDomains という 2 つのタイプのリソースを管理します。また、gpu-kubelet-plugin と compute-domain-kubelet-plugin という 2 つの DRA kubelet プラグインを実行します。それぞれ、インストール中に個別に有効または無効にできます。このガイドでは、GPU の割り当てに焦点を当てます。ComputeDomains の使用方法については、「Amazon EKS で P6e-GB200 UltraServer を使用する」を参照してください。
前提条件
-
Amazon EKS クラスターで Kubernetes バージョン 1.34 以降を実行していて、Karpenter、EKS マネージドノードグループ、またはセルフマネージドノードグループによって静的キャパシティがプロビジョニングされていること。
-
ノードのインスタンスタイプが NVIDIA GPU であること (
PやGインスタンスなど)。 -
ノードに 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.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
-
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 \ --version0.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を実行します。 -
(オプション) DRA ドライバーでタイムスライシングを使用するには、前のステップの
helm installコマンドにTimeSlicingSettings機能ゲートを追加します。これは、デフォルトで無効になっているアルファ機能です。詳細については、「NVIDIA DRA ドライバーで GPU タイムスライシングを使用する」を参照してください。--set featureGates.TimeSlicingSettings=true -
(オプション) DRA ドライバーで動的 MIG を使用するには、前のステップの
helm installコマンドにDynamicMIG機能ゲートを追加します。これは、デフォルトで無効になっているアルファ機能です。DynamicMIG機能ゲートをPassthroughSupport、NVMLDeviceHealthCheck、またはMPSSupport機能ゲートと組み合わせることはできません。詳細については、「NVIDIA DRA ドライバーで MIG を使用する」を参照してください。--set featureGates.DynamicMIG=true -
DRA ドライバーポッドが実行中であることを確認します。
kubectl get pods -n nvidia -
DeviceClassオブジェクトが作成されたことを確認します。kubectl get deviceclassNAME AGE gpu.nvidia.com 60s -
ResourceSliceオブジェクトが GPU ノードに公開されることを確認します。kubectl get resourcesliceDRA ドライバーを使用して NVIDIA GPU をリクエストするには、
gpu.nvidia.comDeviceClassを参照する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 であること (
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」を参照してください。
-
クラスターと通信するように
kubectlが設定されていること。詳細については、「kubectl をインストールまたは更新する」を参照してください。
手順
-
NVIDIA デバイスプラグインの Helm チャートリポジトリを追加します。
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin -
ローカル Helm リポジトリを更新します。
helm repo update -
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-pluginv0.19.0 から v0.19.2 では、GDRCopy および MOFED 機能がデフォルトで有効になっていました。このデフォルトの有効化はk8s-device-pluginv0.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 ソフトウェアコンポーネントの管理が自動化されます。 -
DaemonSet という NVIDIA デバイスプラグインが実行されていることを確認します。
kubectl get ds -n nvidia nvdp-nvidia-device-pluginNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nvdp-nvidia-device-plugin 2 2 2 2 2 <none> 60s -
ノードを調べて割り当て可能な 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 | +-----------------------------------------------------------------------------------------+