Skip to content
Published on

[仮想化] 07. NVIDIA GPU Operator: KubernetesでのGPU管理自動化

Authors

はじめに

KubernetesでGPUを使用するには、NVIDIAドライバ、コンテナランタイム設定、デバイスプラグイン、モニタリングなど、複数のソフトウェアをインストール・管理する必要があります。GPU Operatorはこの全プロセスを自動化し、Day-0からDay-2運用まで一括で解決します。

GPU Operatorとは?

NVIDIA GPU Operatorは、KubernetesでGPUを使用するために必要なすべてのNVIDIAソフトウェアコンポーネントを自動的にデプロイ・管理するOperatorです。

解決する問題

KubernetesでGPUを使用するために手動インストールが必要な項目を見てみましょう。

手動インストール時:
+------------------+
| 1. GPUドライバ    |  <-- ホストOSに直接インストール
+------------------+
| 2. Container Toolkit | <-- containerd/CRI-O設定変更
+------------------+
| 3. Device Plugin |  <-- K8s DaemonSetデプロイ
+------------------+
| 4. GFD           |  <-- GPUラベリングDaemonSet
+------------------+
| 5. DCGM          |  <-- モニタリングエージェント
+------------------+
| 6. MIG Manager   |  <-- MIGプロファイル管理(オプション)
+------------------+

GPU Operator使用時:
+------------------+
| ClusterPolicy CR |  <-- これ一つで全て自動化
+------------------+

ClusterPolicy CRD

GPU OperatorはOperator Frameworkを基盤とし、ClusterPolicy CRDを通じてすべてのコンポーネントを宣言的に管理します。

apiVersion: nvidia.com/v1
kind: ClusterPolicy
metadata:
  name: cluster-policy
spec:
  operator:
    defaultRuntime: containerd
  driver:
    enabled: true
    version: '550.90.07'
    repository: nvcr.io/nvidia
    image: driver
  toolkit:
    enabled: true
    version: v1.16.1-ubuntu20.04
  devicePlugin:
    enabled: true
    version: v0.16.1
  dcgm:
    enabled: true
  dcgmExporter:
    enabled: true
    version: 3.3.7-3.5.0-ubuntu22.04
  gfd:
    enabled: true
    version: v0.16.1
  migManager:
    enabled: true
    version: v0.8.0
  nodeStatusExporter:
    enabled: true
  validator:
    version: v24.6.2

コンポーネント詳細

1. NVIDIA Driver DaemonSet

GPUドライバをコンテナ化し、ホストに直接インストールする必要なくDaemonSetとしてデプロイします。

+------------------------------------------+
|            Worker Node                    |
|  +------------------------------------+  |
|  | NVIDIA Driver Container (DaemonSet)|  |
|  |                                    |  |
|  |  - カーネルモジュールのコンパイルとロード |
|  |  - nvidia.ko, nvidia-uvm.ko       |  |
|  |  - /dev/nvidia* デバイス作成       |  |
|  |                                    |  |
|  +------------------------------------+  |
|                  |                        |
|  +------------------------------------+  |
|  | Host Kernel                        |  |
|  +------------------------------------+  |
+------------------------------------------+

主な特徴は以下の通りです。

  • ホストOSにドライバを直接インストールする必要がない
  • ドライババージョンアップがローリングアップデートで可能
  • カーネルバージョンに合わせたドライバの自動コンパイル
  • プリコンパイル済みドライバイメージもサポート

2. NVIDIA Container Toolkit

containerdやCRI-OがNVIDIA GPUを認識できるようにランタイムを構成します。

コンテナ実行フロー:

kubelet --> containerd --> nvidia-container-runtime-hook
                                    |
                                    v
                          nvidia-container-cli
                                    |
                                    v
                          GPUデバイス/ライブラリを
                          コンテナにマウント
  • containerd/CRI-O設定を自動パッチ
  • nvidia-container-runtimeフックを登録
  • GPUライブラリとデバイスをコンテナに自動注入

3. Device Plugin

nvidia.com/gpu リソースをKubernetesに登録し、PodからGPUを要求できるようにします。

# PodでのGPU要求例
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: cuda-app
      image: nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04
      resources:
        limits:
          nvidia.com/gpu: 1

Device Pluginの動作フローは以下の通りです。

+-------------------+     +------------------+     +---------------+
| Device Plugin     | --> | kubelet          | --> | API Server    |
| (DaemonSet)       |     | gRPC登録          |     | Nodeリソース   |
+-------------------+     +------------------+     | アップデート    |
                                                    +---------------+
  • kubeletにgRPCでGPUデバイスを登録
  • GPU割り当て/解放の管理
  • トポロジ認識スケジューリングをサポート

4. GPU Feature Discovery(GFD)

ノードのGPU情報を検出し、Kubernetesノードラベルとして追加します。

# GFDが追加するノードラベル例
kubectl get node worker-gpu-01 -o json | jq '.metadata.labels' | grep nvidia

# 出力例:
# "nvidia.com/cuda.driver.major": "550"
# "nvidia.com/cuda.driver.minor": "90"
# "nvidia.com/cuda.driver.rev": "07"
# "nvidia.com/cuda.runtime.major": "12"
# "nvidia.com/gpu.count": "4"
# "nvidia.com/gpu.family": "ampere"
# "nvidia.com/gpu.machine": "DGX-A100"
# "nvidia.com/gpu.memory": "81920"
# "nvidia.com/gpu.product": "A100-SXM4-80GB"
# "nvidia.com/gpu.replicas": "1"
# "nvidia.com/mig.capable": "true"

検出される情報は以下の通りです。

ラベル説明
gpu.productGPUモデル名(A100、H100など)
gpu.memoryGPUメモリ容量(MB)
gpu.familyGPUアーキテクチャ(ampere、hopperなど)
cuda.driver.majorCUDAドライバメジャーバージョン
cuda.runtime.majorCUDAランタイムメジャーバージョン
mig.capableMIGサポート状況
gpu.countGPU数

5. DCGM + DCGM Exporter

NVIDIA DCGM(Data Center GPU Manager)でGPU状態をモニタリングし、Prometheusメトリクスとしてエクスポートします。

+------------------+     +------------------+     +------------------+
| DCGM             | --> | DCGM Exporter    | --> | Prometheus       |
| (GPUモニタリング) |     | (メトリクス変換)  |     | (収集/保存)       |
+------------------+     +------------------+     +--------+---------+
                                                           |
                                                  +--------v---------+
                                                  | Grafana           |
                                                  | (可視化/ダッシュボード)|
                                                  +------------------+

主要メトリクスは以下の通りです。

メトリクス説明
DCGM_FI_DEV_GPU_UTILGPU使用率(%)
DCGM_FI_DEV_MEM_COPY_UTILメモリコピー使用率(%)
DCGM_FI_DEV_FB_USED使用中フレームバッファメモリ(MB)
DCGM_FI_DEV_FB_FREE空きフレームバッファメモリ(MB)
DCGM_FI_DEV_GPU_TEMPGPU温度(C)
DCGM_FI_DEV_POWER_USAGEGPU電力使用量(W)
DCGM_FI_DEV_PCIE_TX_THROUGHPUTPCIe送信スループット
DCGM_FI_DEV_XID_ERRORSXIDエラーカウント

6. MIG Manager

NVIDIA A100、H100などでMulti-Instance GPU(MIG)プロファイルを動的に構成します。

A100 80GB MIGプロファイル例:

GPU (80GB)
+------------------------------------------------------------------+
|                          1g.10gb x 7                              |
+--------+--------+--------+--------+--------+--------+--------+  |
| 10GB   | 10GB   | 10GB   | 10GB   | 10GB   | 10GB   | 10GB   |  |
+--------+--------+--------+--------+--------+--------+--------+  |

または

+------------------------------------------------------------------+
|              3g.40gb              |           4g.40gb             |
+---------------------------------+---------------------------------+
|            40GB                  |            40GB                |
+---------------------------------+---------------------------------+

または

+------------------------------------------------------------------+
|                          7g.80gb x 1                              |
+------------------------------------------------------------------+
|                           80GB                                    |
+------------------------------------------------------------------+

7. vGPU Manager(オプション)

NVIDIA vGPUライセンスがある環境で仮想GPUを作成・管理します。

  • ホストドライバのデプロイ
  • vGPUインスタンスの作成と管理
  • KubeVirt VMへのvGPU割り当てサポート

8. Node Feature Discovery(NFD)

GPU Operatorの前提条件として、ノードのハードウェア特性を検出します。

# NFDが追加するラベル例
# feature.node.kubernetes.io/pci-10de.present=true  (NVIDIA PCIデバイス)
# feature.node.kubernetes.io/kernel-version.major=5
# feature.node.kubernetes.io/system-os_release.ID=ubuntu

初期化順序

GPU Operatorのコンポーネントは依存関係に従って順次初期化されます。

1. NFD (Node Feature Discovery)
   |
   v
2. NVIDIA Driver
   |
   v
3. NVIDIA Container Toolkit
   |
   v
4. Device Plugin
   |
   v
5. GPU Feature Discovery (GFD)
   |
   v
6. DCGM / DCGM Exporter
   |
   v
7. MIG Manager(オプション)

各ステップが完了してから次のステップが開始されます。Validator Podが各ステップの正常動作を検証します。

インストール

Helmによるインストール

# NVIDIA Helmリポジトリの追加
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update

# GPU Operatorネームスペースの作成
kubectl create namespace gpu-operator

# GPU Operatorのインストール
helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --set driver.version=550.90.07 \
  --set toolkit.version=v1.16.1-ubuntu20.04

# インストール状態の確認
kubectl get pods -n gpu-operator -w

ホストにドライバが既にインストールされている場合

helm install gpu-operator nvidia/gpu-operator \
  --namespace gpu-operator \
  --set driver.enabled=false

GPUタイムスライシング設定

MIGをサポートしないGPUで複数のPodがGPUを共有できるようにします。

apiVersion: v1
kind: ConfigMap
metadata:
  name: time-slicing-config
  namespace: gpu-operator
data:
  any: |
    version: v1
    flags:
      migStrategy: none
    sharing:
      timeSlicing:
        renameByDefault: false
        failRequestsGreaterThanOne: false
        resources:
          - name: nvidia.com/gpu
            replicas: 4
# ConfigMapの適用
kubectl apply -f time-slicing-config.yaml

# ClusterPolicyにタイムスライシング設定を追加
kubectl patch clusterpolicy cluster-policy \
  --type=merge \
  -p '{"spec":{"devicePlugin":{"config":{"name":"time-slicing-config","default":"any"}}}}'

MIG設定例

apiVersion: v1
kind: ConfigMap
metadata:
  name: mig-config
  namespace: gpu-operator
data:
  config.yaml: |
    version: v1
    mig-configs:
      all-1g.10gb:
        - devices: all
          mig-enabled: true
          mig-devices:
            "1g.10gb": 7
      all-3g.40gb:
        - devices: all
          mig-enabled: true
          mig-devices:
            "3g.40gb": 2
      mixed-mig:
        - devices: all
          mig-enabled: true
          mig-devices:
            "3g.40gb": 1
            "1g.10gb": 4
# MIGプロファイルの適用
kubectl label node worker-gpu-01 nvidia.com/mig.config=all-1g.10gb --overwrite

# MIGデバイスの確認
kubectl describe node worker-gpu-01 | grep nvidia.com/mig
# nvidia.com/mig-1g.10gb: 7

おわりに

NVIDIA GPU Operatorは、KubernetesでのGPUインフラ管理の複雑さを大幅に軽減します。ClusterPolicy一つでドライバからモニタリングまですべてを自動化でき、MIGとタイムスライシングによってGPU活用率を最大化できます。

次の記事では、KubeVirtとGPU Operatorを組み合わせてVMでGPUアクセラレーションを活用する方法を解説します。


クイズ:GPU Operator理解度チェック

Q1. GPU Operatorのコンポーネント初期化順序で正しいのは?

A) Device Plugin -> Driver -> Toolkit -> GFD B) Driver -> Toolkit -> Device Plugin -> GFD C) Toolkit -> Driver -> Device Plugin -> GFD D) GFD -> Driver -> Toolkit -> Device Plugin

答え:B) Driver -> Toolkit -> Device Plugin -> GFDの順序で初期化されます。各ステップは前のステップに依存しています。


Q2. GPU Feature Discovery(GFD)の役割は?

A) GPUドライバのインストール B) コンテナランタイムの設定 C) GPU情報を検出してノードラベルとして追加 D) GPUメトリクスをPrometheusにエクスポート

答え:C) GFDはGPUモデル、ドライババージョン、CUDAバージョン、MIGサポート状況などを検出し、Kubernetesノードラベルとして追加します。


Q3. MIGをサポートしないGPUで複数のPodがGPUを共有するには?

A) vGPU Managerを使用 B) GPUタイムスライシングを設定 C) Device Pluginのレプリカを増加 D) 別途のGPUパーティショニングは不可能

答え:B) GPUタイムスライシングを使用すると、MIGをサポートしないGPUでも複数のPodが時分割でGPUを共有できます。


Q4. DCGM Exporterが提供しないメトリクスは?

A) GPU使用率 B) GPU温度 C) Pod別ネットワーク帯域幅 D) XIDエラーカウント

答え:C) DCGM ExporterはGPU関連メトリクスのみ提供します。ネットワーク帯域幅はGPUモニタリングの範囲外です。