Skip to content
Published on

[仮想化] 08. KubeVirt + GPU: VMでGPUアクセラレーションを活用する

Authors

はじめに

KubeVirtでVMをKubernetes上で実行し、GPU OperatorでGPU管理を自動化しました。この2つの技術を組み合わせて、VMでGPUアクセラレーションを活用する方法を見ていきましょう。

GPU OperatorとKubeVirtの統合

GPU OperatorはKubeVirt VMにGPUを提供するための2つのモードをサポートしています。

ノードラベリング: gpu.workload.config

nvidia.com/gpu.workload.config ラベル値によってGPUの使用モードが決定されます。

ラベル値説明対象
containerデフォルト。標準コンテナGPUPod
vm-passthroughGPU全体をVMにパススルーKubeVirt VM
vm-vgpuvGPUインスタンスをVMに割り当てKubeVirt VM
# ノードをVMパススルーモードに設定
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=vm-passthrough --overwrite

# ノードをvGPUモードに設定
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=vm-vgpu --overwrite

# デフォルトのコンテナモードに復元
kubectl label node worker-gpu-01 \
  nvidia.com/gpu.workload.config=container --overwrite

モード変更時の動作フロー

ノードラベル変更
      |
      v
GPU Operatorが変更を検知
      |
      v
既存GPUソフトウェアスタックをクリーンアップ
      |
      v
新モードに合わせたコンポーネントをデプロイ
      |
      +-- container: Driver + Toolkit + Device Plugin
      |
      +-- vm-passthrough: VFIO Manager + Sandbox Device Plugin
      |
      +-- vm-vgpu: vGPU Manager + Sandbox Device Plugin

GPUパススルーワークフロー

GPUパススルーは物理GPU全体をVMに直接割り当てる方式です。ネイティブに近いパフォーマンスを提供します。

ステップ1: IOMMUの有効化

BIOSとカーネルの両方でIOMMUを有効化する必要があります。

# Intel CPUの場合、カーネルパラメータを追加
# GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

# AMD CPUの場合
# GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"

# GRUBを更新して再起動
sudo update-grub
sudo reboot

# IOMMUの有効化確認
dmesg | grep -i iommu
# 出力: DMAR: IOMMU enabled

ステップ2: VFIO Manager DaemonSet

GPU Operatorが自動的にVFIO Managerをデプロイします。

+------------------------------------------+
|            Worker Node                    |
|  +------------------------------------+  |
|  | VFIO Manager (DaemonSet)           |  |
|  |                                    |  |
|  |  1. vfio-pciカーネルモジュールロード |  |
|  |  2. GPUをホストドライバからアンバインド|  |
|  |  3. GPUをvfio-pciにバインド         |  |
|  |                                    |  |
|  +------------------------------------+  |
|                                          |
|  GPU状態:                                 |
|  nvidiaドライバ --> vfio-pciドライバ       |
+------------------------------------------+

VFIO Managerの動作過程は以下の通りです。

  • vfio-pci カーネルモジュールのロード
  • GPUデバイスをNVIDIAドライバからアンバインド
  • GPUを vfio-pci ドライバにバインド
  • VMがGPUに直接アクセス可能に

ステップ3: Sandbox Device Plugin

Sandbox Device Pluginがパススルー可能なGPUを検出し、kubeletに登録します。

+------------------------------------------+
| Sandbox Device Plugin (DaemonSet)        |
|                                          |
| 1. VFIOにバインドされたGPUデバイスを検出  |
| 2. nvidia.com/gpuリソースとしてkubeletに登録|
| 3. KubeVirt VMGPUを要求可能            |
+------------------------------------------+

vGPUワークフロー

vGPUは1つの物理GPUを複数のVMに分割して提供する方式です。

vGPU Managerドライバのデプロイ

+------------------------------------------+
|            Worker Node                    |
|  +------------------------------------+  |
|  | vGPU Manager (DaemonSet)           |  |
|  |                                    |  |
|  |  - vGPUホストドライバのインストール  |  |
|  |  - Mediated DeviceまたはSR-IOV VF   |  |
|  |    の作成                           |  |
|  +------------------------------------+  |
|                                          |
|  +------------------------------------+  |
|  | Sandbox Device Plugin              |  |
|  |  - vGPUデバイスの検出               |  |
|  |  - nvidia.com/VGPU_TYPEとして登録   |  |
|  +------------------------------------+  |
+------------------------------------------+

GPUアーキテクチャ別vGPU実装

GPUアーキテクチャvGPU実装方式
Ampere以前(V100等)Mediated Devices(MDEV)
Ampere(A100)MIGバックvGPUまたはMDEV
Hopper以降(H100)SR-IOV Virtual Functions

vGPUタイプ例

A100で使用可能なvGPUプロファイルは以下の通りです。

vGPUタイプフレームバッファ最大インスタンス
A100-1-5C5GB7
A100-2-10C10GB3
A100-3-20C20GB2
A100-4-40C40GB1
A100-1-5CME5GB(MIG)7

KubeVirt CR設定

permittedDevicesの構成

KubeVirt CRでGPUデバイスをVMで使用できるように許可する必要があります。

apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
  name: kubevirt
  namespace: kubevirt
spec:
  configuration:
    permittedHostDevices:
      pciHostDevices:
        - pciVendorSelector: '10DE:20B5'
          resourceName: 'nvidia.com/gpu'
          externalResourceProvider: true
      mediatedDevices:
        - mdevNameSelector: 'NVIDIA A100-1-5C'
          resourceName: 'nvidia.com/NVIDIA_A100-1-5C'

pciVendorSelector はGPUのPCIベンダー/デバイスIDです。以下のコマンドで確認できます。

# GPU PCI IDの確認
lspci -nn | grep NVIDIA
# 出力: 3b:00.0 3D controller [0302]: NVIDIA Corporation A100 [10DE:20B5]

VMIスペックにGPUを接続

GPUパススルーVMI

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: gpu-passthrough-vm
spec:
  running: true
  template:
    metadata:
      labels:
        app: gpu-vm
    spec:
      domain:
        cpu:
          cores: 8
        memory:
          guest: 32Gi
        devices:
          disks:
            - name: rootdisk
              disk:
                bus: virtio
          gpus:
            - name: gpu1
              deviceName: nvidia.com/gpu
          interfaces:
            - name: default
              masquerade: {}
      networks:
        - name: default
          pod: {}
      volumes:
        - name: rootdisk
          dataVolume:
            name: ubuntu-gpu-dv

vGPU VMI

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vgpu-vm
spec:
  running: true
  template:
    spec:
      domain:
        cpu:
          cores: 4
        memory:
          guest: 16Gi
        devices:
          disks:
            - name: rootdisk
              disk:
                bus: virtio
          gpus:
            - name: vgpu1
              deviceName: nvidia.com/NVIDIA_A100-1-5C
          interfaces:
            - name: default
              masquerade: {}
      networks:
        - name: default
          pod: {}
      volumes:
        - name: rootdisk
          dataVolume:
            name: ubuntu-vgpu-dv

ゲストOSドライバのインストール

GPU OperatorはVM内部にドライバをインストールしません。ゲストOSで直接インストールする必要があります。

Linuxゲスト

# VMコンソールに接続
virtctl console gpu-passthrough-vm

# NVIDIAドライバのインストール(Ubuntu)
sudo apt-get update
sudo apt-get install -y linux-headers-$(uname -r)

# NVIDIAドライバリポジトリの追加
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# ドライバのインストール
sudo apt-get install -y nvidia-driver-550

# 再起動後に確認
sudo reboot
nvidia-smi

Windowsゲスト

1. NVIDIA公式サイトからドライバをダウンロード
   - パススルー: 標準GPUドライバ
   - vGPU: NVIDIA vGPUゲストドライバ

2. RDPまたはVNCでWindows VMに接続

3. ドライバインストーラーを実行

4. 再起動後、デバイスマネージャーでGPUを確認

全体アーキテクチャ図

+------------------------------------------------------------------+
|                    Kubernetes Cluster                              |
|                                                                    |
|  +---------------------------+  +------------------------------+  |
|  | Container Node            |  | GPU Node (vm-passthrough)    |  |
|  | gpu.workload.config:      |  | gpu.workload.config:         |  |
|  |   container               |  |   vm-passthrough             |  |
|  |                           |  |                              |  |
|  | +-------+ +-------+      |  | +-------------------------+  |  |
|  | | Pod   | | Pod   |      |  | | VFIO Manager            |  |  |
|  | | GPU:1 | | GPU:1 |      |  | | (vfio-pci bind)         |  |  |
|  | +-------+ +-------+      |  | +-------------------------+  |  |
|  |                           |  |                              |  |
|  | NVIDIA Driver             |  | +-------------------------+  |  |
|  | Container Toolkit         |  | | Sandbox Device Plugin   |  |  |
|  | Device Plugin             |  | +-------------------------+  |  |
|  +---------------------------+  |                              |  |
|                                  | +--------+  +--------+     |  |
|                                  | |  VM 1  |  |  VM 2  |     |  |
|                                  | | GPU:1  |  | GPU:1  |     |  |
|                                  | +--------+  +--------+     |  |
|                                  +------------------------------+  |
+------------------------------------------------------------------+

パフォーマンスの考慮事項

パススルー vs vGPU パフォーマンス比較

項目パススルーvGPU
GPU使用率100%(専用)共有(プロファイルに依存)
パフォーマンスオーバーヘッド1-3%5-10%
GPUメモリ全体使用可能プロファイルに依存
VM密度1 GPU = 1 VM1 GPU = 複数VM
ライブマイグレーション制限ありサポート
ライセンス追加なしvGPUライセンス必要

ベンチマーク参考値

以下はA100 GPUでの一般的なパフォーマンス比較です。

ワークロードベアメタルパススルーvGPU(フルプロファイル)
ResNet-50学習100%97-99%90-95%
BERT推論100%98-99%92-96%
CUDAベンチマーク100%97-99%91-95%

ユースケース

1. VDI(仮想デスクトップインフラ)on K8s

+--------------------------------------------------+
| Kubernetes Cluster                                |
|                                                    |
| +--------+ +--------+ +--------+ +--------+      |
| | Win VM | | Win VM | | Win VM | | Win VM |      |
| | vGPU   | | vGPU   | | vGPU   | | vGPU   |      |
| +--------+ +--------+ +--------+ +--------+      |
|      |          |          |          |            |
|      +----------+----------+----------+            |
|                     |                              |
|              +------+------+                       |
|              | Physical GPU|                       |
|              | (A100/L40)  |                       |
|              +-------------+                       |
+--------------------------------------------------+

2. レガシーWindows MLワークロード

コンテナ化できないWindowsベースのMLアプリケーションをKubeVirt VMでGPUとともに実行します。

3. マルチテナントGPU分離

vGPUを使用してテナント間でGPUメモリとコンピューティングリソースをハードウェアレベルで分離します。

4. VMwareマイグレーション

既存VMware環境のGPU VMをKubeVirtに移行し、ライセンスコストを削減します。

トラブルシューティング

よくある問題と解決方法

問題原因解決方法
GPUがVMに見えないpermittedDevices未設定KubeVirt CRにデバイスを追加
VFIOバインド失敗IOMMU未有効化BIOS/カーネルIOMMU設定を確認
vGPU作成失敗vGPU Manager未インストールGPU Operator vGPU設定を確認
ゲストでnvidia-smi失敗ゲストドライバ未インストールVM内部にドライバをインストール
# GPUデバイス状態の確認
kubectl get node worker-gpu-01 -o json | jq '.status.allocatable'

# VFIOバインド状態の確認
kubectl logs -n gpu-operator -l app=nvidia-vfio-manager

# Sandbox Device Pluginログの確認
kubectl logs -n gpu-operator -l app=nvidia-sandbox-device-plugin

おわりに

KubeVirtとGPU Operatorの組み合わせは、VMベースのGPUワークロードをKubernetesに統合する強力な方法です。パススルーは最大パフォーマンスが必要な場合に、vGPUはGPU共有と効率性が重要な場合に適しています。

次の記事では、QEMU、VirtualBox、VMware、KubeVirtを総合的に比較し、各プラットフォームの長所と短所を分析します。


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

Q1. GPUパススルーモードを有効にするためのノードラベル値は?

A) container B) vm-passthrough C) gpu-direct D) vfio-passthrough

答え:B) nvidia.com/gpu.workload.config=vm-passthrough ラベルを設定します。


Q2. GPUパススルー時のVFIO Managerの役割は?

A) VM内部にGPUドライバをインストール B) GPUをvfio-pciドライバにバインド C) vGPUインスタンスを作成 D) GPUメトリクスを収集

答え:B) VFIO ManagerはGPUをNVIDIAドライバからアンバインドし、vfio-pciにバインドしてVMが直接アクセスできるようにします。


Q3. GPU OperatorがVMに対してしないことは?

A) VFIO Managerのデプロイ B) Sandbox Device Pluginのデプロイ C) ゲストOS内のGPUドライバインストール D) ノードラベリングの自動化

答え:C) GPU Operatorはホストレベルのソフトウェアのみ管理します。ゲストOS内部のGPUドライバはユーザーが直接インストールする必要があります。


Q4. vGPUの利点ではないものは?

A) 1つのGPUを複数のVMで共有 B) ライブマイグレーションのサポート C) 追加ライセンスコスト不要 D) ハードウェアレベルのGPU分離

答え:C) vGPUにはNVIDIA vGPUライセンスが必要です。パススルーには追加ライセンスは必要ありません。