目次
こんにちは、風船(@fusen_niconico)です。
今回は、Proxmox VEとコンシューマ向けGPUを用いてvGPU環境を無料で作る方法を試してみます。
基本的に、参考にした海外のサイトでそのまま進めていくだけです。超簡単でした。
なお、理由は後述しますが、あくまで技術検討にとどめておく内容です。
実際に試す方は、自己責任の元でやってみてください。
今回の検証に使うPCは以下の記事で紹介していますので、良ければどうぞ!
1 vGPUってなに?
そもそも、vGPUとは何なのでしょうか。
vGPUとは、その名の通り「仮想GPU」といいます。
通常は、1つのGPUを1つのインスタンス(1つのOS)が専有して使用しますが、vGPUは、1つのGPUを仮想化し、複数のインスタンスで共有して使用できるようする、それがvGPUです。
ちなみに、以下のようなGPUが使えるというサービスで、専用GPUの記述がない場合のほとんどが、vGPU技術を使って構築されています。
本来は、コンシューマ向けGPUではできないよ!
残念ながら、NVIDIA、AMDどちらのGPUも、コンシューマ向けGPU(一般的に売られてるGTX、RTXシリーズとか)ではvGPUはできません。
基本、vGPUはエンタープライズ向けGPUに限定しています。Tesla Pなんとかとか、あの辺の超高いデータセンター向けのGPUです。
なので、本来であればできません。
ですが、有志の方々がパッチを作ってくれているおかげで、ついにコンシューマ向けGPUでvGPUが実現したのです。
やるときは自己責任で!
先ほどの通り、本来vGPUはエンタープライズ向けの機能であり、個人向けではありませんし、コンシューマ向けGPUでは動作しません。
NVIDIA自身もしっかりとお金を徴収した上でその機能を解放している為、あくまで技術検討にとどめておくのが良いと思います。
また、今回使用するパッチも有志の方によるパッチです。特定のバージョンでないと機能しないなど、いろいろと制約があります。
本番環境で試すなどは絶対にやめたほうがいいです。
2 vGPU化できるGPU
今回実施する方法でvGPU化できるGPUに制限があります。
今回の方法が使えるのは
- GTX 9XXシリーズ
- GTX 10XXシリーズ
- RTX 20XXシリーズ
のみとなります。ファームウェアの暗号化などの兼ね合いで、現状はこれらの少し前のGPUしかできないそうです。
最近のRTX 30XXシリーズやRTX 40XXシリーズはできないのでご注意ください。
それでは早速やっていきます!
3 動画にしました!
せっかくなので、動画にしてみました。
環境構築編は以下からご覧頂けます。
OSインストール・ベンチマーク編は以下からご覧頂けます。
4 NVIDIAからvGPUドライバをダウンロードする
NVIDIAから、ホストマシンにインストールするvGPUドライバをダウンロードします。
ここで、ドライバのダウンロードにエンタープライズアカウントが必要になるという1つの壁にぶち当たります。
vGPUの評価版を試したい場合は、アカウントを無料で作成できるので、その方法でアカウントを作成しましょう。
以下からできます。
NVIDIA 仮想 GPU (vGPU) ソフトウェアの 90 日間の無料トライアル – NVIDIA
アカウントが作れたら、NVIDIA DashboardのSoftware Downloadsからドライバを拾いましょう。
必要なドライバは、製品ファミリーがLinux KVM、バージョンが15.1、リリース日がJan 23, 2023となっているものです。ホストPC向けドライバ、ゲストPC向けドライバなど一式入っていて、2GB強あります。
ただし、今回必要なのは、ホストPC向けドライバだけです。

ダウンロードできたら、後でProxmox VE環境へ転送できるように解凍しておきます。
次に、Proxmox環境を作っていきます。
5 Proxmox VE環境を整備する

今回、Proxmox VEをホストPCにインストールし、その環境にVMを作って使用します。
Promox VEのインストールを済ませて、ログイン画面を開けるようにします。
viを使う人は、一手間加えておく
私は、vim派なので、最初にvimを開いた時に矢印キーが使えない事に気づきました。
nanoとかだったらこの設定は多分要りません。
解決方法を書いてあるサイトがあったので、そのサイト通りに設定します。
すぐにvimが本来の状態で使えるようになります。
・設定ファイルを開く
vi ~/.vimrc・以下記入(vi互換モードのoff)
set nocompatible・以下記入(Backspaceの有効化)
set backspace=indent,eol,start・上書き保存
■Proxmox VEのvimで方向キーがABCDを入力してしまう場合の解決方法 – ネットワーク・サーバー関連備忘録-パラダイムシフト(Paradigm Shift)
Proxmoxのアップデートができるようにする
インストールしたてのままでは、サブスクリプション契約者だけが利用できるパッケージソースのみが登録されています。
以下のコマンドを実行して、無償利用者も使えるソースを登録します。以下のソースは、Proxmox 7.3で検証済みです。
古い記事とかだと、bullseyeの部分が古いカーネル向けのままの場合があるので気をつけてください。
echo "deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription" >> /etc/apt/sources.list
サブスクリプション契約者向けソースを削除します。
rm /etc/apt/sources.list.d/pve-enterprise.list
これで無償利用においてもアップデートができるようになります。
proxmoxをアップデート&必要になるパッケージをインストール
proxmoxのアップデートと必要になるパッケージをインストールします。
以下のコマンドを順に実行してアップデートします。
apt update
apt dist-upgrade
これから使うvGPU関連ツールをコンパイルするために必要なパッケージをインストールします。
apt install -y git build-essential dkms pve-headers mdevctl
続いて、Rustコンパイラをインストールします。
curl https://sh.rustup.rs -sSf | sh -s -- -y --profile minimal
インストールできたら、以下のコマンドでパスを通します。
source $HOME/.cargo/env
これで準備は完了です。
IOMMUの有効化とカーネルモジュール関係をいじる
続いて、vGPUの動作に必要なIOMMUとカーネルモジュールの修正、内蔵ドライバのブラックリスト追加を行います。
以下のコマンドで、grubの設定ファイルを開きます。
nano /etc/default/grub
開いたファイルにGRUB_CMDLINE_LINUX_DEFAULT="quiet"
という項目があると思います。
quietの後にスペースを入れ、Intelの場合はintel_iommu=on iommu=pt
、AMDの場合はamd_iommu=on iommu=pt
を追加して保存します。
最後に、以下のコマンドでgrubを更新します。
update-grub
続いて、必要なモジュールが読み込まれるように追加します。
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules
vGPUを有効にするにあたり、NVIDIA謹製のドライバを使用するため、Proxmoxに内蔵されているドライバを無効にします。
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
ここまで設定できたら、カーネル設定を適用するため、以下のコマンドを実行します。
update-initramfs -u -k all
最後に再起動して完了です。
Gitから必要なリポジトリをクローンする
これからの作業で必要になるリポジトリをクローンします。
まずは、パッチファイルなどをrootディレクトリにクローンします。
git clone https://gitlab.com/polloloco/vgpu-proxmox.git
続いて、opt配下にvGPU解除ツールをクローンします。
cd /opt
git clone https://github.com/mbilker/vgpu_unlock-rs.git
そして、vGPU解除ツールのディレクトリに移動して、ビルドします。
cd vgpu_unlock-rs/
cargo build --release
少々時間がかかりますが、気長に待ちましょう。
vGPU解除に必要なファイルを作成する
vgpu_unlock-rsのビルドが完了したら、以下のコマンドを実行して、必要なファイルを作成します。
mkdir /etc/vgpu_unlock
touch /etc/vgpu_unlock/profile_override.toml
続いて、systemdで必要になるディレクトリとファイルを作成します。
mkdir /etc/systemd/system/{nvidia-vgpud.service.d,nvidia-vgpu-mgr.service.d}
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpud.service.d/vgpu_unlock.conf
echo -e "[Service]\nEnvironment=LD_PRELOAD=/opt/vgpu_unlock-rs/target/release/libvgpu_unlock_rs.so" > /etc/systemd/system/nvidia-vgpu-mgr.service.d/vgpu_unlock.conf
SSHを使って、vGPUドライバをコピーする
SSHを使って、先ほどダウンロードしたvGPUドライバを先ほどの「vgpu-proxmox 」があるディレクトリに転送しておきます。
転送できたら、早速このドライバにパッチを当てていきます。
ドライバにパッチを当てる
ドライバがあるディレクトリに移動し、以下のコマンドを実行して、ドライバに実行権限を付与します。
chmod +x NVIDIA-Linux-x86_64-525.85.27-vgpu-kvm.run
そして、パッチを当てます。
./NVIDIA-Linux-x86_64-525.85.27-vgpu-kvm.run --apply-patch ~/vgpu-proxmox/525.85.27.patch
パッチが当たると、同一ディレクトリ内に、NVIDIA-Linux-x86_64-525.85.27-vgpu-kvm-custom.run
が生成されますので、以下のコマンドでパッチ済みインストーラを実行します。
./NVIDIA-Linux-x86_64-525.85.27-vgpu-kvm-custom.run --dkms
インストールができたら、再起動します。
vGPU環境ができたか確認する
以下のコマンドを実行して、ドライバが正しくインストールされているか確認します。
nvidia-smi
以下のような結果が出力されたら、ドライバは正常にインストールされて、動作しています。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07 Driver Version: 525.85.07 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| 0% 32C P8 14W / 180W | 28MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
続いて、以下のコマンドを実行して、vGPU機能が動作しているか確認します。
mdevctl types
vGPU機能のロックが正しく解除されていれば、以下のように、vGPUプロファイルの一覧が出てきます。
0000:01:00.0
nvidia-156
Available instances: 12
Device API: vfio-pci
Name: GRID P40-2B
Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12
nvidia-215
Available instances: 12
Device API: vfio-pci
Name: GRID P40-2B4
Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=12
nvidia-241
Available instances: 24
Device API: vfio-pci
Name: GRID P40-1B4
Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=24
nvidia-283
Available instances: 6
Device API: vfio-pci
Name: GRID P40-4C
Description: num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2400, max_instance=6
nvidia-284
Available instances: 4
Device API: vfio-pci
Name: GRID P40-6C
Description: num_heads=1, frl_config=60, framebuffer=6144M, max_resolution=4096x2400, max_instance=4
表示されなかったら、どこかの設定が間違っている可能性があるので見直しが必要です。
vGPU設定を上書きする
先ほどの手順で、/etc/vgpu_unlock/profile_override.toml
というファイルを作成したのを覚えているでしょうか?
このファイルは、vGPUインスタンスのパラメータを上書きするファイルになります。たとえば、割り当てるVRAMや解像度を上書きできます。
先ほどのmdevctl types
を実行して出力されるvGPUプロファイルのNameの項目の末尾に、Q、A、Cがついているものがあると思います。
それぞれ、最適な分野があり
タイプ | 説明 |
Q | ゲームや動画編集など |
A | 仮想アプリケーション(Citrixのようなやつとか) |
B | 事務作業などの簡易的な仮想デスクトップ |
C | AI、機械学習などの計算重視 |
となります。
今回のテストでは、ゲームを動作させるつもりなので、Qタイプのプロファイルを探します。
以下のプロファイルを使用することにしました。
nvidia-49
Available instances: 6
Device API: vfio-pci
Name: GRID P40-4Q
Description: num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=6
というプロファイルを使います。
framebufferの値が4096Mでmax_instanceは6なので、今回テストに使用するGTX 1080の8GBでは、VRAMから計算すると2つのvGPUインスタンスを建てられることになりますね。
このプロファイルを上書きする設定を先ほどのファイルに定義します。
例として以下のようになります。
[profile.nvidia-49]
num_displays = 1
display_width = 1920
display_height = 1080
max_pixels = 2073600
framebuffer = 0xEC000000
framebuffer_reservation = 0x14000000
これだけでも動作しますが、このままだとTesla P40としてVMからは認識されるので、GRIDドライバーが必須となります。
一般的に入手可能なQuadroドライバーで動かせるように、さらに以下の記述を追加して、VM上から認識されるGPUを変えてしまいます。今回使用したのはGTX10シリーズのGPUなので、同一アーキテクチャのQuadro P5000にしてみました。以下の記述を先ほどのプロファイル定義の下部に追加することでできました。
pci_device_id = 0x1BB0
pci_id = 0x1BB011B2
これで、VM上からはQuadro P5000として認識されるので、一般的なQuadroドライバーで動作するようになります。
ちなみに、RTXシリーズの場合は、以下の内容にすることでQuadro RTX 6000になります。
pci_device_id = 0x1E30
pci_id = 0x1E3012BA
尚、ドライバーは特定のものでないとダメらしいので、こちらからダウンロードしてください。
6 VMにGPUを追加する
ProxmoxでVMを作ります。作ったVMのハードウェア→追加→PCIデバイスと辿ります。
追加ボタンの左にある詳細設定のチェックをつけ、以下の通り設定して追加ボタンをクリックします。
項目名 | 設定値 |
デバイス | vGPU設定したGPU |
MDev 種別 | 先ほど選択したプロファイル |
プライマリGPU | チェックしない |
ROM-Bar | チェック |
PCI-Express | チェック |
追加できたら、OSをインストールし、先ほどダウンロードしたQuadroドライバーをインストールします。
その後、Parsecを導入してください。
Parsecの導入方法は以下の記事を参考にしてみてください。
尚、Installation typeは、Sharedを選びます。こちらにしないと、自動ログインが無効になっている環境のWindows起動直後など、一度もログインしていない状態だとParsecが起動しないので、操作ができなくなってしまいます。

設定ができたら、VMをシャットダウンします。
VMから仮想マシン用のグラフィックカードを外す
シャットダウンできたら、ハードウェア→ディスプレイ→編集をクリックします。
グラフィックカードの値をnone
に変更します。

7 vGPUを試す

いよいよvGPUの準備ができました。ParsecからVMに接続します。

デバイスマネージャーを開いて、ディスプレイアダプターを見てみると、Quadro P5000(という名のvGPU GTX 1080)がいることがわかります!
vGPU環境の完成です!
nvidia-smi
とnvidia-smi vgpu
の結果は以下の通りになります。確かに、vGPUインスタンスができていますね。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07 Driver Version: 525.85.07 CUDA Version: N/A |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A |
| 0% 33C P8 14W / 180W | 4090MiB / 8192MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1815091 C+G vgpu 4200MiB |
+-----------------------------------------------------------------------------+
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.07 Driver Version: 525.85.07 |
|---------------------------------+------------------------------+------------+
| GPU Name | Bus-Id | GPU-Util |
| vGPU ID Name | VM ID VM Name | vGPU-Util |
|=================================+==============================+============|
| 0 NVIDIA GeForce GTX 1080 | 00000000:01:00.0 | 0% |
| 3251636754 GRID P40-4Q | 0000... vGPU-01,debug-th... | 0% |
+---------------------------------+------------------------------+------------+
8 ベンチマーク結果は…?
恐らく皆さん気になるのは、実際にベンチしたらどんなもんなのよ?という所ですよね。
FF15ベンチを1vGPUインスタンスで実行した結果は次のような感じでした。


GTX 1080だと約11,000なので、若干スコアが下がっている印象です。CPUのコア数割り当てが4コアなのも影響しているかもしれないと思い、8コアにしてやってみました。
結果としては以下の通りなので、やはりCPUコア数も影響していそうです。
ほぼ物理PCと同等レベルの性能が実現できていますね。

2vGPUインスタンス(いずれもCPU4コア)で動作させた結果は以下のような感じです。



平均5,300ぐらいですね。性能がそれぞれのVMで半分ずつ割り当てられた感じになりました。
ちなみに、それぞれのVMに8コア全て割り当てるようにしたら、コアの取り合いになってしまうためか、スコアが平均4,400ほどに落ち込んだので、コアは専有にして動かした方が安定するようですね。
9 最後に
個人でvGPUいる?って聞かれたら困っちゃいますが、所謂ロマンですね。
と言っても、個人でVM走らせたことがある方は、1回はGPUのパワーが恋しくなったことは必ずあるはず。
GPUパススルーだと1VMがGPUを専有してしまうため、複数のVMでGPUを共有したい場合などに、このvGPUができればなーとか思う事もあったので、今回試してみて非常に面白かったです。
環境を整えれば、個人のクラウドゲーミング環境が作れるので、1つのマシンで複数人でゲームをする、なんてこともできますね
正直な話、vGPUを個人でも安価にできるよう、公式が何か用意してくれればなぁと思ってしまいます。でも、難しいのが本音だろうなあ…。
大変参考になりました!
vGPU環境完成できました
patchバージョンアップされていました