はじめに
大規模なAIモデルの学習や推論、HPCワークロードにおいて、NVIDIA A100やH100のような高性能GPUは不可欠なリソースです。しかし、これらの高価で強力なGPUリソースを、単一の小さなジョブや複数のユーザーで効率的に共有・活用することは、リソース管理上の大きな課題でした。
この課題を解決する技術が、NVIDIA MIG(Multi-Instance GPU)です。MIGは、単一の物理GPUを複数の独立したGPUインスタンスに分割し、それぞれに専用のコンピュートコア、メモリ、キャッシュを割り当てることで、複数のワークロードを安全に分離して実行できるようにします。これにより、GPU利用率の向上、マルチテナンシー環境でのセキュリティ確保、予測可能な性能保証が実現します。
本記事では、NVIDIA A100およびH100 GPUにおけるMIGの設定方法から、Kubernetes連携、運用監視までの実践的な手順を詳しく解説します。
前提条件・必要な環境
MIGを設定・利用するためには、以下の環境が必要です。
- ハードウェア: NVIDIA A100 (80GB/40GB) または H100 (80GB) GPU。MIG機能はこれらのGPUアーキテクチャ(Ampere, Hopper)でサポートされています。
- ドライバ: NVIDIA Data Center GPU Driver (バージョン 450.80.02 以降を推奨)。
- ソフトウェア:
- NVIDIA Container Toolkit (Dockerランタイム用)
- NVIDIA GPU Operator (Kubernetes環境用、オプションだが推奨)
- NVIDIA Data Center GPU Manager (DCGM、モニタリング用)
- OS: Ubuntu 20.04 LTS 以降、RHEL/CentOS 8 以降などの主要なLinuxディストリビューション。
まず、nvidia-smiコマンドを実行して、GPUが正しく認識され、MIGモードが無効(`Disabled`)であることを確認してください。
nvidia-smi
# 出力の「MIG」列が「Disabled」であることを確認
手順1: MIGモードの有効化とGPUのリブート
MIGを利用するには、まずGPUをMIGモードに切り替える必要があります。この操作にはGPUのリブートが伴い、実行中のすべてのCUDAプロセスが終了します。
以下のコマンドでMIGモードを有効化します。
# MIGモードを有効化
sudo nvidia-smi -i 0 -mig 1
# `-i 0` はGPUインデックス0を指定。複数GPUがある場合は適宜変更。
# 設定を確認
nvidia-smi
# 「MIG」列が「Enabled」になっていることを確認
注意: このコマンド実行後、GPUドライバが再初期化されます。システムによっては、Xサーバーが使用しているGPUの場合、ディスプレイに一時的な影響が出る可能性があります。
手順2: MIGインスタンスプロファイルの作成
MIGモードを有効にしただけでは、GPUはまだ単一のユニットです。使用可能なコンピュートとメモリリソースを確認し、必要なサイズのインスタンスに分割します。
まず、GPUが提供可能なMIGプロファイル(分割パターン)を一覧表示します。
# 利用可能なプロファイルを表示
sudo nvidia-smi mig -i 0 -lgip
# または、より詳細な情報を表示
sudo nvidia-smi mig -i 0 -lgipp
出力には、`1g.5gb`、`2g.10gb`、`3g.20gb`、`4g.20gb`、`7g.40gb`(A100 40GBの場合)といったプロファイル名が表示されます。これは「1つのGPUインスタンスが5GBメモリを占有」といった意味です。A100 80GBやH100では、`7g.80gb`などのより大きなプロファイルも利用可能です。
次に、実際にインスタンスを作成します。例えば、7つの`1g.5gb`インスタンスを作成するには以下のコマンドを実行します。
# 7つの 1g.5gb インスタンスを作成
sudo nvidia-smi mig -i 0 -cgi 1g.5gb -C
# `-cgi` はCreate GPU Instanceの略。`-C` で作成を実行。
# 作成されたインスタンスを確認
sudo nvidia-smi mig -i 0 -lgi
インスタンスが作成されると、各インスタンスには`GPU instance ID`が割り当てられます。さらに、各GPUインスタンス内に「コンピュートインスタンス」を作成する必要があります。通常は、GPUインスタンス内のすべてのリソースを使うコンピュートインスタンスを作成します。
# 例: GPUインスタンスID 14 内にコンピュートインスタンスを作成
sudo nvidia-smi mig -i 0 -gi 14 -cci 0 -C
# `-gi` でGPUインスタンスIDを指定。`-cci 0` は通常、唯一のコンピュートインスタンスプロファイルを指定。
# コンピュートインスタンスの状態を確認
sudo nvidia-smi mig -i 0 -lci
これで、`nvidia-smi`を実行すると、7つの独立したGPUデバイス(例: `GPU 0-MIG 1g.5gb`)として表示されるはずです。
手順3: DockerコンテナでのMIGインスタンスの利用
作成したMIGインスタンスをDockerコンテナから利用するには、`–gpus`フラグで特定のMIGデバイスを指定します。デバイスUUIDを指定する方法が確実です。
まず、利用可能なMIGデバイスのUUIDを取得します。
nvidia-smi -L
# 出力例:
# GPU 0: NVIDIA A100 80GB PCIe (UUID: GPU-xxxxxx)
# MIG 1g.5gb Device 0: (UUID: MIG-GPU-xxxxxx-0)
# MIG 1g.5gb Device 1: (UUID: MIG-GPU-xxxxxx-1)
# ...
取得したMIGデバイスのUUIDを指定してコンテナを起動します。
docker run --rm --gpus '"device=0"' nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
# これは物理GPU 0全体を指定。MIGインスタンス単体を指定する場合は以下。
docker run --rm --gpus '"device=MIG-GPU-xxxxxx-0"' nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
# 特定のMIGインスタンス(UUID: MIG-GPU-xxxxxx-0)をコンテナに割り当て
コンテナ内では、割り当てられたMIGインスタンスが`GPU 0`として認識され、そのメモリ容量(例: 5GB)のみが利用可能になります。
手順4: Kubernetes (K8s) でのMIGインスタンスの管理
KubernetesクラスターでMIGを管理する最も簡単な方法は、NVIDIA GPU Operatorを利用することです。GPU Operatorは、ドライバ、MIGマネージャー、デバイスプラグイン、DCGMエクスポーターなどを自動的にデプロイ・管理します。
1. まず、Helmを使用してGPU Operatorをインストールします(環境に合わせてバージョンは調整してください)。
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install --wait --generate-name \
-n gpu-operator --create-namespace \
nvidia/gpu-operator \
--set mig.strategy=mixed
--set mig.strategy=mixed は、MIGインスタンスとフルGPUを混在させて管理するための設定です。
2. GPU OperatorがMIG設定を管理できるように、ConfigMapを作成してMIG設定を定義します。
# mig-parted-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: default-mig-parted-config
namespace: gpu-operator
data:
config.yaml: |
version: v1
mig-configs:
all-disabled:
- devices: all
mig-enabled: false
all-1g.5gb: # A100 40GB向けの7分割プロファイル
- devices: all
mig-enabled: true
mig-devices:
"1g.5gb": 7
all-2g.10gb:
- devices: all
mig-enabled: true
mig-devices:
"2g.10gb": 3 # 2g.10gb * 3 + 残りリソース
mixed-a100-80gb:
- devices: all
mig-enabled: true
mig-devices:
"3g.40gb": 2
"1g.20gb": 1
current-mig-config: "all-1g.5gb" # 適用する設定名
3. このConfigMapを適用し、GPU OperatorのPodを再起動して設定を反映させます。
kubectl apply -f mig-parted-config.yaml
kubectl delete pod -n gpu-operator -l app=nvidia-operator-validator
4. PodからMIGインスタンスをリクエストするには、リソースリミットで`nvidia.com/gpu`の代わりにMIGプロファイル名を指定します。
# mig-pod-example.yaml
apiVersion: v1
kind: Pod
metadata:
name: mig-example-pod
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.1.0-base-ubuntu22.04
command: ["sleep", "infinity"]
resources:
limits:
nvidia.com/mig-1g.5gb: 1 # 1g.5gbインスタンスを1つリクエスト
nodeSelector:
nvidia.com/gpu.product: A100-SXM4-40GB # 特定のGPUを持つノードを選択
手順5: MIGインスタンスのモニタリング
MIGインスタンスの性能と状態を監視するには、NVIDIA Data Center GPU Manager (DCGM) が最適です。DCGMは、各MIGインスタンスの利用率、メモリ使用量、温度、電力消費などを細かく収集できます。
GPU Operatorをインストールすると、DCGMエクスポーターが自動的にデプロイされ、Prometheusメトリクスが収集可能になります。収集されるメトリクスには、`dcgm_gpu_utilization`や`dcgm_mem_utilization`などがあり、これらのメトリクスには`GPU_I_PROFILE`や`GPU_ID`といったラベルが付与され、どのMIGインスタンスのデータか識別できます。
Prometheusでクエリを実行する例:
# すべてのMIGインスタンスのGPU利用率を表示
dcgm_gpu_utilization{gpu="0", GPU_I_PROFILE!=""}
# 特定のプロファイル(1g.5gb)のインスタンスの平均メモリ使用率
avg by (GPU_I_PROFILE) (dcgm_mem_utilization{GPU_I_PROFILE=~"1g.*"})
また、`nvidia-smi`コマンドでも各MIGインスタンスの状態を確認できます。
# 各MIGインスタンスの詳細な使用状況を表示
nvidia-smi mig -i 0 -lgi
# または、標準のnvidia-smiでもMIGインスタンスごとの情報が表示される
nvidia-smi
トラブルシューティング
- MIGモードの切り替えが失敗する:
- 原因: GPU上でCUDAプロセス(コンテナ含む)が実行中。
- 解決法:
sudo nvidia-smiでプロセスを確認し、sudo kill -9 <PID>で終了させる。またはシステム全体のGPUジョブを停止してから再試行。
- DockerコンテナがMIGデバイスを見つけられない:
- 原因: `–gpus`フラグの指定方法が誤っている、またはNVIDIA Container Toolkitが正しくインストールされていない。
- 解決法: デバイスUUIDを正確に指定しているか確認。`docker run –rm –runtime nvidia nvidia/cuda:12.1.0-base nvidia-smi`で基本機能をテスト。
- Kubernetes Podが`Pending`状態のまま:
- 原因: リクエストしたMIGプロファイル(例: `nvidia.com/mig-1g.5gb`)がノードに存在しない、またはGPU Operatorのデバイスプラグインが正しく機能していない。
- 解決法: ノードのラベル(`kubectl describe node <node-name>`)に希望するMIGリソースが登録されているか確認。GPU Operator Podのログを調査(`kubectl logs -n gpu-operator <pod-name>`)。
- MIGインスタンスの性能が期待より低い:
- 原因: インスタンス間でのメモリ帯域やL2キャッシュの競合。または、ワークロードが非常に小さなインスタンスに対して過大。
- 解決法: ワークロードの特性に合わせて、より大きなプロファイル(例: `2g.10gb`や`3g.20gb`)を試す。DCGMでメモリ帯域使用率などのメトリクスを監視し、ボトルネックを特定する。
- MIG設定のリセット方法:
- すべてのMIGインスタンスを削除し、MIGモードを無効化してフルGPUに戻すには:
# すべてのMIGインスタンスを削除 sudo nvidia-smi mig -i 0 -dci sudo nvidia-smi mig -i 0 -dgi # MIGモードを無効化 sudo nvidia-smi -i 0 -mig 0
- すべてのMIGインスタンスを削除し、MIGモードを無効化してフルGPUに戻すには:
まとめ
NVIDIA MIGは、A100やH100のような高性能GPUをマルチテナント環境で最大限に活用するための強力なテクノロジーです。物理GPUを安全に分離された複数のインスタンスに分割することで、リソースの細かい割り当て、高い利用率、そして性能の予測可能性を同時に実現できます。
本ガイドで解説した手順に従うことで、MIGモードの有効化からインスタンス作成、DockerやKubernetesといった現代的なコンテナ環境での統合、そして運用監視までの一連の流れを構築できるでしょう。特にKubernetes環境ではNVIDIA GPU Operatorを利用することで、MIGの管理が宣言的かつ自動化され、大規模なクラスター管理の負担を大幅に軽減できます。
ワークロードの特性とリソース要件をよく分析し、最適なMIG分割プロファイルを選択することが、コストパフォーマンスと性能の両方を達成する鍵となります。
💡 クラウドGPUを試してみる
ローカル環境の構築が難しい場合、クラウドGPUサービスなら数分でAI開発環境が手に入ります:
⚡ GPU環境をすぐに使いたいなら
ハードウェアの購入・セットアップなしで、すぐにGPU環境を使えるクラウドサービスがおすすめです。
- RunPod — RTX 4090/A100/H100を即座に利用可能
- Vast.ai — 最安のGPUクラウド、オークション方式で低コスト
- RTX 5090をAmazonで見る — 自宅GPU環境を構築するなら