Proxmox VEでNvidia vGPUを使用する

在 Proxmox VE 上使用 Nvidia vGPU

はじめに

数週間前、中国の中古プラットフォームで非常に安価な 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_pcivfio_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

コメントを残す