- Authors

- Name
- Youngju Kim
- @fjvbn20031
はじめに
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.product | GPUモデル名(A100、H100など) |
| gpu.memory | GPUメモリ容量(MB) |
| gpu.family | GPUアーキテクチャ(ampere、hopperなど) |
| cuda.driver.major | CUDAドライバメジャーバージョン |
| cuda.runtime.major | CUDAランタイムメジャーバージョン |
| mig.capable | MIGサポート状況 |
| gpu.count | GPU数 |
5. DCGM + DCGM Exporter
NVIDIA DCGM(Data Center GPU Manager)でGPU状態をモニタリングし、Prometheusメトリクスとしてエクスポートします。
+------------------+ +------------------+ +------------------+
| DCGM | --> | DCGM Exporter | --> | Prometheus |
| (GPUモニタリング) | | (メトリクス変換) | | (収集/保存) |
+------------------+ +------------------+ +--------+---------+
|
+--------v---------+
| Grafana |
| (可視化/ダッシュボード)|
+------------------+
主要メトリクスは以下の通りです。
| メトリクス | 説明 |
|---|---|
| DCGM_FI_DEV_GPU_UTIL | GPU使用率(%) |
| DCGM_FI_DEV_MEM_COPY_UTIL | メモリコピー使用率(%) |
| DCGM_FI_DEV_FB_USED | 使用中フレームバッファメモリ(MB) |
| DCGM_FI_DEV_FB_FREE | 空きフレームバッファメモリ(MB) |
| DCGM_FI_DEV_GPU_TEMP | GPU温度(C) |
| DCGM_FI_DEV_POWER_USAGE | GPU電力使用量(W) |
| DCGM_FI_DEV_PCIE_TX_THROUGHPUT | PCIe送信スループット |
| DCGM_FI_DEV_XID_ERRORS | XIDエラーカウント |
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モニタリングの範囲外です。