この記事を作った動機

 簡易的に GTX 1080 Ti と Linux 環境において、Virtio(OpenGL) や Venus(Vulkan) による GPU アクセラレーションを利用する方法について、今まで諦めていた。それでも諦めきれずに定期的に調べていたところ、対処方法が見つかった。それについて、簡易的に症状とやったことを記録したい。

デモ

 以下の動画は、RDP 経由で Venus による 仮想 GPU を利用して Vulkan や OpenGL のアプリが動作している事を示している。マインクラフトの操作については、今回の RDP セットアップの仕様上、絶対座標しか送られておらず視点を動かすことができていなかったり、VPN など遠隔地から RDP 接続をして動かしているため、ラグが大きくぎこちないものとなっている。

前座

Virtio における GPU 加速

 Virt-Manager において標準で利用できる仮想 GPU である。AMD や Intel の GPU 環境では特別なことをしなくても、私個人の体験としては利用できたが、Nvidia 環境ではそうならなかった。

Venus における GPU 加速

 最近あたらしい GPU 加速手段の一つとして実装されたもので、デフォルトでは Virt−Manager などからはまだ利用できるようにはなっていない模様である。これについては直接 QEMU をコマンドラインから起動することが私が現在できていることであり、Virt-Manager からは XML の設定をいじってみたものの成功していない。

今回犠牲になっている事

 今回提示する解決策は、最低限 仮想 GPU が Nvidia の GTX1080Ti において動作するようにする事を目的としており、以下の負担や犠牲がある。

  • 仮想 GPU 有効時は、Virt-Manager や QEMU によるホストマシン上の GUI による画面描画は正常に動作しない。
  • 仮想マシンに対して、CPU によるソフトウェアレンダリングで OS をインストールし、外部ネットワークから RDP 出来るように環境構築していること。私の場合は、仮想マシンに対して DNAT を行うことでこれを実現しているが、それも紆余曲折あった。詳細は、QEMU(virt-manager) で動かしている仮想マシンと、外部ネットワーク間において、ポート転送ができず時間を溶かす を参照。
  • 仮想マシンに対して、Virtio に関連するドライバを事前に導入していること。
  • あくまで、EGL の初期化エラーを避けて、仮想マシンが起動でき、RDP 経由ではある程度動作する事。
  • 少なくとも GTX 1080Ti における Venus の加速は、RDP を経由してもかなりグリッチがあり、出来ることが限られる。Blender を動かしたり、マインクラフトを動かしたりすることはできたが、特に通常の GUI 描画に弱くブラウザを使ったりするとグリッチがかなり発生したりする。これは、Nvidia 社の GTX1080Ti における Vulkan 実装が不完全であることが原因であると思われる。
  • 今回の記事は主に、Windows 環境については、Virt-Manager で標準で利用できる OpenGL による仮想 GPU を想定しており、Linux 環境については、Venus を使って実現できる Vulkan による仮想 GPU を想定している。なお、Linux 環境でもVirt-Manager で標準で利用できる OpenGL による仮想 GPU は Venus に比べて安定して利用可能である。
  • OpenGL や Vulkan の仮想マシン上における利用は、Venus 経由の仮想 GPU によって実現され、Virt-Manager 標準の Virtio による OpenGL を使った仮想 GPU では、私が試した範囲ではできていない。

本題

症状

 EGL の初期化に失敗し、仮想マシンを起動できなくなる。CPU 加速しか利用できず、GUI 描画がもたつき、CPU を使いまくる。

改善した方法

/etc/libvirt/qemu.conf にて Nvidia GPU に対して適切な権限を設定する

 以下の項目を最後辺りに追記する。

# ...
cgroup_device_acl = [
  "/dev/null", "/dev/full", "/dev/zero",
  "/dev/random", "/dev/urandom",
  "/dev/ptmx", "/dev/kvm",
  "/dev/nvidiactl", "/dev/nvidia0", "/dev/nvidia-modeset", "/dev/dri/renderD128"
]

仮想マシンに適切なドライバやスタックを導入する

Linux かつ Venus 環境の場合

 少なくとも、Gnome 環境をインストールした Arch Linux 仮想マシン環境において、Vulkan を適切に動作させるには、以下のパッケージが必要であった。

yay -S vulkan-virtio
# sudo pacman -S vulkan-virtio
Windows かつ Virt-Manager 環境の場合

 以下のサイトから、OS にあわせた ISO を取得し、仮想マシンにマウントして、必要なドライバをインストールする。

 以下のように表示されていれば、GPU 加速を利用する準備ができている。

  • ホストマシンにて
    ホストマシンの設定
    ホストマシンの設定 1
  • 仮想マシンにて
    Windows において ゲストマシンに GPU ドライバが入っている様子

おまけ

Arch Linux や Arch ベースの Linux の仮想マシンで、Venus 環境下において、Blender を起動したい

 以下に示す古い Blender をインストールし、blender が Intel HD Graphics 4000 で動かない にて示されるワークアラウンドを試すと、とりあえず起動できる。ただしレンダリングしようとしたりするとクラッシュするので実用的ではない。

yay -S blender-4.2-bin

Linux 仮想マシンかつ Venus 環境下において、もっと安定して動かしたい。

 /etc/environmentにて、以下の変数を設定し、アプリ起動時に反映されるようにする。以下の設定は垂直同期についての設定らしいが、私はまだよく理解していない。動かしてみて例えば glxgear のフレームレートが 50 FPS ほどあがるなど、安定性やパフォーマンスの違いを個人的には体感したという程度の話である。

vblank_mode=0

Arch Linux 環境にて、OpenGL や Vulkan の動作確認をしたい

 以下のパッケージをインストールすれば、OpenGL のテストには glxgears コマンドが、Vulkan のテストには vkcube が利用可能である。

yay -S vulkan-tools
# sudo pacman -S vulkan-tools
yay -S mesa-utils lib32-mesa-utils
sudo pacman -S mesa-utils lib32-mesa-utils
glxgearとvkcubeの例

関連する記事とか

参考にしたサイトとか