Nvidia GPUの仮想化技術
1. ハードウェアレベル
NVIDIA MIG (Multi-Instance GPU)
ハードウェアレベルで物理GPUを複数の独立したインスタンスに分割する技術。
各インスタンスは完全に独立しているため、ユーザーやプロセスごとに専用のGPUリソースを割り当てることができる。
対応GPU: NVIDIA A100、H100シリーズ。
NVIDIA vGPU (Virtual GPU)
ハードウェア仮想化技術を使って、1つの物理GPUを複数の仮想インスタンスに分割し、仮想マシンやコンテナがこれらのリソースを共有。
GPUメモリや計算リソースを仮想化することで、ユーザーごとに専用のGPU割り当てが可能。
主にデータセンター向け(NVIDIA Tesla, Quadro, A100)に最適化されており、ライセンスが必要。
2. ミドルウェア・システムレイヤー
コンテナ技術 (NVIDIA Docker, Docker with GPU Support)
コンテナレイヤーでGPUを管理し、コンテナ単位で特定のGPUを割り当てることが可能。
--gpus オプションや device オプションを用いて、コンテナごとにリソースの使用制限や可視性を指定。
開発者向けに柔軟なリソース管理を提供し、ユーザー間の競合を防ぐことができる。
3. ソフトウェアレベル(プログラムやアプリケーション層)
CUDA API を用いた制御
CUDAプログラムでGPUを使用する際、CUDA_VISIBLE_DEVICES 環境変数などを用いて、どのGPUを使用するかを指定する技術。
プログラム内で、メモリの上限やスケジューリングの設定を行うことができ、ユーザーが個別にリソースを管理することが可能。
リソースの割り当て制御としては柔軟性が高いが、他のアプリケーションとのリソース競合が発生しやすい。
フレームワークによるリソース制御 (TensorFlow, PyTorch)
TensorFlow や PyTorch の設定を用いて、個別のGPU使用量をプログラム内で指定。
例: TensorFlow の tf.config.set_virtual_device_configuration でメモリ使用量を制限する、PyTorch の torch.cuda.set_device を用いて使用するデバイスを指定するなど。
フレームワークレベルでの制御は、ユーザーごとに個別の設定が可能ですが、サーバーレベルのリソース管理とは異なり、プログラムを通じての調整となります。