目次
はじめに
数週間前、中国の中古プラットフォームで非常に安価な Nvidia Tesla P4 を見つけました。Tesla P4 はロープロファイル・シングルスロットのグラフィックボードであり、補助電源も不要なため、1U サーバーでの使用に非常に適しています。そこで、vGPU を試すために数枚購入しました。本記事では、Proxmox VE で Nvidia の vGPU 機能を使用する方法を紹介します。
vGPU技術
以前から vGPU 技術には興味があり、特に AMD がオープンソースでハードウェアさえ対応していれば利用可能だと謳っている MxGPU 技術に注目していました。しかし、AMD Instinct MI25 を入手したところ、オープンソースのドライバは古い S7150 までしか対応しておらず、クローズドソースのドライバも一般公開されていませんでした。Microsoft Azure や Alibaba Cloud などの大手クラウドプロバイダーしか入手できないようです。様々なパッチを試しましたが、カーネルドライバが正常に動作しなかったため、そのカードは倉庫に眠ることになりました。
Nvidia 独自の GRID 技術はオープンソースではありませんが、アカウントを登録するだけでドライバをダウンロードできます。この点は AMD に比べて非常に優れていると感じます。
動作方式については、AMD の MxGPU が SR-IOV を使用するのに対し、Nvidia GRID はこの Tesla P4 において mdev 方式で vGPU パススルーを行います。
それでは、本題である Proxmox VE で Nvidia vGPU を使用する方法について解説していきます。
事前設定
まず、Proxmox VE のコミュニティリポジトリを追加し、エンタープライズリポジトリを削除します。
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
更新とアップグレード
apt update
apt dist-upgrade
必要なソフトウェアパッケージをインストールする
apt install -y git build-essential dkms pve-headers mdevctl
vgpu_unlock のインストールと設定
vgpu_unlock GitHub で公開されているオープンソースツールで、本来は Tesla や一部の Quadro グラフィックボードでしか利用できない Nvidia vGPU 技術を、GeForce や他の Quadro カードでも利用できるようにするものです。
Tesla P4 は vgpu_unlock なしでも動作しますが、元の mdev 設定を上書きできる機能が提供されており、メモリが 7680MB しかないこのグラフィックボードでは非常に実用的です。
まず、必要な GitHub リポジトリをクローンします。
git clone https://gitlab.com/polloloco/vgpu-proxmox.git
cd /opt
git clone https://github.com/mbilker/vgpu_unlock-rs.git
Rust コンパイラをインストールする
curl https://sh.rustup.rs -sSf | sh -s -- -y
Rust のバイナリを PATH に追加する
source $HOME/.cargo/env
コンパイル
cd vgpu_unlock-rs/
cargo build --release
Nvidia vGPUサービスが起動時にvgpu_unlockライブラリを読み込むように、必要な設定ファイルを作成します。
mkdir /etc/vgpu_unlock
touch /etc/vgpu_unlock/profile_override.toml
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
私のように、Teslaシリーズなど元々vGPUをサポートしているグラフィックボードを使用している場合は、不要な複雑化を避けるためにアンロック機能を無効にしてください。
echo "unlock = false" > /etc/vgpu_unlock/config.toml
必要なカーネルモジュールのロードと不要なもののブラックリスト登録
vGPUを動作させるには、 vfio, vfio_iommu_type1, vfio_pci 跟 vfio_virqfd これらのカーネルモジュールが必要です。
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules
次に、オープンソースのNvidiaドライバをブラックリストに登録する必要があります。
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
再起動
reboot
Nvidia ドライバー
この記事の執筆時点(2022年12月)では、最新のGRIDドライバはバージョン15.0で、vGPUドライバ525.60.12が組み合わされています。詳細はこちらで最新バージョンを確認できます。新しいバージョンでは、使用するために追加のパッチが必要になる場合があります。
ドライバーの取得
Nvidia GRIDドライバは一般公開されていませんが、 NVIDIA ライセンシングポータル から登録して試用版をダウンロードできます。
注意在註冊得時候如果使用免費的 email 提供商的 email 會需要透過人工認證才能註冊成功,請使用自己 domain 的 email。
ダウンロードが完了したら、ファイルを解凍してサーバーにアップロードします。
scp NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run root@pve:/root/
vGPU 対応 GPU
グラフィックボードが元々vGPUをサポートしている場合は、パッチを適用せずにそのままドライバをインストールしてください。
chmod +x NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run
./NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run --dkms
インストール後に再起動
reboot
vGPU 非対応 GPU
Geforceシリーズなど、vGPU非対応のグラフィックカードを使用する場合、ドライバーにパッチを適用する必要があります。
chmod +x NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run
./NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run --apply-patch ~/vgpu-proxmox/525.60.12.patch
以下のようなメッセージが出力されるはずです。
Self-extractible archive "NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm-custom.run" successfully created.
次にドライバーをインストールします。
./NVIDIA-Linux-x86_64-525.60.12-vgpu-kvm.run --dkms
インストール後に再起動
reboot
最終確認
インストールして再起動した後、このコマンドを入力します。
nvidia-smi
次のような出力が表示されるはずです。
Fri Dec 9 22:57:28 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.12 Driver Version: 525.60.12 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 Tesla P4 On | 00000000:86:00.0 Off | 0 |
| N/A 36C P8 10W / 75W | 27MiB / 7680MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
次に、vGPU mdevが存在することを確認します。
mdevctl types
出力は以下のようになります。
nvidia-69
Available instances: 2
Device API: vfio-pci
Name: GRID P4-4A
Description: num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=2
nvidia-70
Available instances: 1
Device API: vfio-pci
Name: GRID P4-8A
Description: num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=1
nvidia-71
Available instances: 8
Device API: vfio-pci
Name: GRID P4-1B
Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=8
また、 nvidia-smi 以下の方法でも確認できます
nvidia-smi vgpu
Fri Dec 9 22:58:03 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.60.12 Driver Version: 525.60.12 |
|---------------------------------+------------------------------+------------+
| GPU Name | Bus-Id | GPU-Util |
| vGPU ID Name | VM ID VM Name | vGPU-Util |
|=================================+==============================+============|
| 0 Tesla P4 | 00000000:86:00.0 | 0% |
+---------------------------------+------------------------------+------------+
vGPU オーバーライド
先ほど作成した /etc/vgpu_unlock/profile_override.toml このファイルはvGPUオーバーライドを行うためのものです。Tesla P4は7680MiBのメモリしか搭載していないため、デフォルトの4GB mdev設定ではvGPUを1つしか作成できません。そこで、vGPUオーバーライドを利用してmdevのVRAM値を変更することができます。
以下は例です:
[profile.nvidia-259]
num_displays = 1 # Max number of virtual displays. Usually 1 if you want a simple remote gaming VM
display_width = 1920 # Maximum display width in the VM
display_height = 1080 # Maximum display height in the VM
max_pixels = 2073600 # This is the product of display_width and display_height so 1920 * 1080 = 2073600
cuda_enabled = 1 # Enables CUDA support. Either 1 or 0 for enabled/disabled
frl_enabled = 1 # This controls the frame rate limiter, if you enable it your fps in the VM get locked to 60fps. Either 1 or 0 for enabled/disabled
framebuffer = 0x76000000 # VRAM size for the VM. In this case its 2GB
# Other options:
# 1GB: 0x3B000000
# 2GB: 0x76000000
# 3GB: 0xB1000000
# 4GB: 0xEC000000
# 8GB: 0x1D8000000
# 16GB: 0x3B0000000
# These numbers may not be accurate for you, but you can always calculate the right number like this:
# The amount of VRAM in your VM = `framebuffer` + `framebuffer_reservation`
[mdev.00000000-0000-0000-0000-000000000100]
frl_enabled = 0
# You can override all the options from above here too. If you want to add more overrides for a new VM, just copy this block and change the UUID
[profile.nvidia-259] 使用するすべての nvidia-259 このmdevのVMを上書きしますが、 [mdev.00000000-0000-0000-0000-000000000100] UUID を持つ 00000000-0000-0000-0000-000000000100 VM に対してのみ機能します。
Proxmox VM で vGPU を使用する
コマンドラインで1つの手順を実行するだけで、Proxmox VM で vGPU を使用できるようになります。それは、VM に UUID を設定することです。
vim /etc/pve/qemu-server/<VM-ID>.conf
最後にランダムな UUID を追加するか、または VM ID を使用します。
args: -uuid 00000000-0000-0000-0000-00000000XXXX
如 VM ID 1000 我們就可以用
args: -uuid 00000000-0000-0000-0000-000000001000
接下來我們可以在 Proxmox VE UI 中操作,選擇你的 VM,進入 Hardware,加入 PCI device,選擇你要使用的 GPU。這個 GPU 在 Mediated Devices 這行應該是顯示 Yes。選擇後你應該還可以選擇 MDev Type,從中挑選你要使用的 mdev 。
次に、起動してドライバーをインストールします。インストール完了後、内蔵の Display 設定を none (none)に変更すると、以降のすべてのビデオ出力はvGPUを介して演算されるようになります。注意点として、変更後は内蔵のProxmoxコンソールが利用できなくなるため、変更を行う前にVMへリモート接続する手段があることを確認してください。
参考文献
https://gitlab.com/polloloco/vgpu-proxmox#adding-a-vgpu-to-a-proxmox-vm

