Proxmox上でNVIDIA vGPUによるGPU分割:ホームラボとAIのためのリソース最適化

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

従来のGPUパススルーにおける最大の壁

Proxmoxを運用しているなら、おそらくPCIパススルーには馴染みがあるでしょう。これはハードウェアのパワーを仮想マシン(VM)に直接届ける最短の方法です。しかし、Home AssistantからStable Diffusionまで、10台以上のVMを半年間運用した結果、ある矛盾に気づきました。それは「1:1の制限」です。例えば、RTX 3060 12GBを持っていて、Windows VMのUIを高速化したいだけだとしても、残りの10GB以上のVRAMを無駄にしてしまいます。

これは、一通の手紙を運ぶためだけにトラックを買うようなものです。他のVMは、新しいカードを増設しない限り、このグラフィックスパワーを利用することすらできません。そこで登場するのが、この無駄を解決するNVIDIA vGPU (Virtual GPU)です。この技術を使えば、1枚の物理カードを複数の独立した「断片」に分割し、各VMが実際のニーズに合わせて必要な分だけのVRAMを受け取れるようになります。

GPU共有手法の比較

特徴 PCIパススルー APIインターセプト (rGPU) NVIDIA vGPU
リソース分割 1枚を1台のVMに専有 共有型 (Shared) パーティション分割 (Partition)
実効パフォーマンス ~100% (ネイティブ) 遅延により大幅低下 ~95-98%を維持
安定性 非常に高い 頻繁なクラッシュ エンタープライズ級
サポート対象カード 全てのカード ソフトウェアによる制限 Quadro/Tesla(またはRTXロック解除)

これら3つの手法の中で、vGPUは最高のバランスを提供します。パススルーのような安定性を持ちながら、CPUコアを仮想化するように柔軟な運用が可能です。

なぜAI/MLにおいてvGPUが最良の選択肢なのか?

AIプロジェクトにおけるGPUの需要は、多くの場合一時的なものです。コードを書いたりデータを準備したりしている間、GPUはほとんど稼働していません。実際に「熱く」なるのは、学習(Training)コマンドを実行した時だけです。vGPUを使えば、1枚の16GBカードから4GBのVRAMを4人の開発者にそれぞれ割り当てることができます。4台のワークステーションに大金を投じる代わりに、十分なパワーを持つProxmoxサーバーを1台用意するだけで済むのです。

NVIDIAの公式ドキュメントではvGPUはエンタープライズ向けとされていますが、vgpu-unlock-rsというツールがその常識を変えました。これにより、一般的なRTXカードを専用のTeslaシリーズと同じように動作させることが可能になります。

Proxmox 8での実践的な導入手順

開始する前に、BIOSでIOMMUを有効にすることを忘れないでください。このステップを抜かすと、その後の設定はすべて無意味になります。

ステップ 1: ホストドライバのインストール

vGPUマネージャー専用のNVIDIAドライバが必要です。Linux標準のapt install nvidia-driverコマンドは使用しないでください。

# 環境の更新
apt update && apt upgrade -y

# 依存パッケージとカーネルヘッダーのインストール
apt install -y build-essential dkms pve-headers-$(uname -r)

# vGPUドライバインストールファイルの実行
chmod +x NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm.run
./NVIDIA-Linux-x86_64-535.129.03-vgpu-kvm.run

ステップ 2: コンシューマー向けカードの潜在能力を解放する

RTX 3000または4000シリーズをお持ちの場合、このステップは必須です。アンロックツールを使用して、システムに仮想化対応カードであると認識させます。

# GitHubからアンロックツールをダウンロード
git clone https://github.com/mbilker/vgpu-unlock-rs.git
cd vgpu-unlock-rs

# Rustを使用してビルド
cargo build --release

# ライブラリをシステムに配置
cp target/release/libvgpu_unlock_rs.so /usr/lib/

次に、ドライバが正しく認識できるように、/etc/vgpu_unlock/config.tomlにカードのパラメータを記述します。

ステップ 3: Mdevプロファイルの確認

マシンを再起動し、以下のコマンドを実行して利用可能なGPUの「断片」を確認します:

mdevctl types | grep nvidia

結果には、nvidia-233(1GB VRAM相当)のようなプロファイルが表示されます。このIDをメモしてVMに割り当てます。

ステップ 4: 仮想マシンへの割り当て

ProxmoxのGUIから、VM -> ハードウェア -> 追加 -> PCIデバイスを選択します。MDev Typeの項目で、適切な容量を選択してください。例えば、画像処理タスクには4GB、Llama-3-8BのようなLLMモデルを実行するには8GBを割り当てます。

クライアントVM(ゲスト側)の設定

仮想マシン内では、「vGPUクライアント」ドライバをインストールする必要があります。通常のGame Readyドライバは動作しないので注意してください。インストール後、カードの全パフォーマンスを解放するためにライセンスの設定が必要です。

# 成果の確認
nvidia-smi

ステータステーブルに割り当てた通りのVRAM容量が表示されていれば、システムの準備は完了です。

実運用における重要な注意点

半年間の連続使用を経て、3つの主要な教訓を得ました:

  1. 温度管理: 複数のVMが同時にレンダリングを行うと、カードは非常に速く高温になります。自動モードは反応が遅れることがあるため、Proxmoxホスト側でファンカーブ(fan curve)を能動的に調整することをお勧めします。
  2. バックアップ時のリスク: ProxmoxはGPUメモリの状態を保存できません。グラフィックデータの破損を防ぐため、バックアップ前にVMをシャットダウンすることをお勧めします。
  3. カーネルのアップデート: Proxmoxがパッチを適用してアップグレードされるたびに、NVIDIAドライバが外れることがあります。接続を復旧するために、いつでもdkms installコマンドを再実行できる準備をしておいてください。

vGPUを活用することで、古いハードウェアを徹底的に最適化することができました。高額なクラウドサービスに一銭も払うことなく、子供たちにクラウドゲーミングで遊ばせる環境と、プロフェッショナルなAIテスト環境を同時に手に入れることができました。皆さんの設定が成功することを願っています!

Share: