注意書き

本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Proxmox仮想マシンからGPUを使う(venus)

インフラストラクチャ

仮想マシンにGPUをパススルーする使い方はよく出てくるのですが、複数の仮想マシンを使いながら、それぞれにGPUを使わせるというのはあまり見かけません。通常この使い方は、高いGPUデバイスを使わないとできないのですが、ホビーレベルでも試せる別の方法があるので紹介します。

スポンサーリンク

動機について

仮想環境(マシン)からGPUを使った描画の確認ができると、自分が作成したVulkanもしくはOpenGLのアプリケーションの動作チェックがやりやすくなります。また、仮想化サーバ母艦は常時電源ONにしておくので、夜中だったりプルリクエストだったり等のタイミングでのCIチェックを走らせられるというのも私としては魅力的です。

ただし、これならデバイスパススルーでも問題ないのですが、昔デバイスパススルーに苦戦した覚えがあるので、まずは共用タイプかなと思った次第です。

virgl と venus

そのような気持ちの中でずっと注目していた virgl や venus というものがあります。実際に動くような環境を作ったことがなく、いつかトライしてみたいと思っていました。これらはそれぞれ、仮想環境からOpenGL, Vulkan を使えるようにする仕組みです。

  • virgl : OpenGL
  • venus : Vulkan

ゲストOSが Linux という条件があり、WindowsからGPUを使ったアクセラレーションは使えないようですね。

これらの機能を使ってどのようなことができるかというと、virtio-gpuにより仮想マシンにGPUがあるように見え、VirGLによってOpenGLの処理が、VenusによってVulkanの処理が、ホスト環境に運ばれて実行されます。やや不正確なところがあるかも知れませんが、これらを図に示したものが次の図です。

Proxmoxホストの設定

仮想マシン側からGPUを使うためには、Proxmoxホスト側にドライバのインストールを始め環境の設定が必要となります。インストール直後の状態で以下の状態でした。

$ qemu-system-x86_64 --version
QEMU emulator version 10.1.2 (pve-qemu-kvm_10.1.2-5)
$ vulkaninfo --summary
bash: vulkaninfo: command not found

ドライバ類をインストールから始めます。管理者ユーザーで以下のようにインストールをしていきます。

# apt update
# apt install -y vulkan-tools mesa-vulkan-drivers mesa-utils virgl-server

このインストール後に、vulkaninfo コマンドを実行して、サポート情報が返ってくれば最初の準備はOKです。このときVulkanとしては2つのGPUが見える状態となります。1つは物理的なGPU、もう一つはCPUによってエミュレートされるGPUとなっています。もし1つしか列挙されず、llvmpipe もしくは lavapipe というようなものしかないのであれば、そのハード用のドライバが正しくインストールされていないので、対処する必要があります。

実際にはCPU処理(エミュレーション)は実用的ではないので、本記事の後半で無効化しています。

ゲスト (Ubuntu)の設定

ここではゲストOSとして Ubuntu 24.04 を使い、このゲストからGPUを使うことを考えます。

仮想GPUの接続

Proxmoxの設定より、ディスプレイに VirGL GPU (virtio-gl) を選択します。

この設定だけでは、Vulkanのコマンドが処理されないため、さらに設定を編集します。仮想マシンの設定ファイルが “/etc/pve/qemu-server/” 以下にあるので、IDを元にファイルを見つけます。

そして、次のようにargsオプションを追記します。ページの都合上改行を入れていますが、1行で入力してください。

args: -global virtio-vga-gl.hostmem=1024M -global
  virtio-vga-gl.blob=true -global virtio-vga-gl.venus=true

hostmemはやり取りのためのウィンドウサイズのようです。また virtio-vga-gl.venus=true の設定で Veusを有効にしています。

ドライバのインストール (ゲスト側)

このゲストでもOpenGLやVulkanのドライバをインストールします。先程と似ていますが、以下のようなコマンドでインストールします。

sudo apt update
sudo apt install -y mesa-utils vulkan-tools mesa-vulkan-drivers

ドライバをインストール後、以下のコマンドを実行して GPU が見えるかを確認します。

  • “glxinfo -B”
  • “vulkaninfo –summary”

glxinfoの結果では、GL_RENDERERに virgl が選択されているかを見てみましょう。もし llvmpipe だとCPUエミュレーションになっています。 vulkaninfo の結果では、 deviceName に Virtio-GPU Venus という文字列が出ているかを見てみましょう

llvmpipe によるGPUエミュレーション

vulkan対応ドライバをインストールした際に、CPUエミュレーションされたllvmpipeのGPUが追加されます。Proxmoxホスト側にもllvmpipeがあると、Venus経由でホスト側のエミュレーションを使うというのもあるようです。その結果vulkaninfoでGPUが3つ並びます。

  • GPU0: Virtio-GPU Venus (AMD Radeon Graphics RADV)
  • GPU1: Virtio-GPU Venus (llvmpipe)
  • GPU2: llvmpipe

ここで必要なのは GPU0のハードウェアを使った Venus の経路です。この項目が出るかを確認します。

動作の確認

仮想マシン Ubuntu の環境から、OpenGLのアプリとして glxgears、Vulkanのアプリとしてvkcubeを実行してみます。Proxmox上での仮想マシンであることを見せるためにもブラウザ管理画面からのコンソール表示で撮影したものが次の通りです。それぞれハードウェアアクセラレーションが有効なGPUを使って動作をしています。

実行してみると分かりますが、仮想環境の中では Vsync待ちがないため、普段見ている動きとは違和感が出ていると思います。ソフトウェアの実装によっては、使えないものが出てくるかも知れません。

ここでは動作していることを示すを優先しました。パフォーマンス計測はしていない

Proxmoxホストのllvmpipeを無効化

以下のコマンドを実行して、CPUエミュレーション側のGPUを取り除きます。

# mkdir -p /usr/share/vulkan/icd.d/disabled
# mv /usr/share/vulkan/icd.d/lvp_icd*.json /usr/share/vulkan/icd.d/disabled/

まとめ

virglやvenusを使って、仮想マシンからもGPUを使うパターンを説明しました。これならデバイスパススルーではないので、複数仮想マシンからGPUを活用できそうです。実行パフォーマンスについては計測していないので、その点には注意です。私の感想としては、この時点でも単純な機能テストのようなものには十分活用できると思っています。

コメント

タイトルとURLをコピーしました