Virtio-nvgpu: KVMゲスト内でNVIDIA GPUへのニアネイティブアクセスを実現
Virtio-nvgpu: Near-native Nvidia GPU access inside a KVM guest (github.com)
要約
Virtio-nvgpuは、KVMゲスト環境でNVIDIA GPUへのニアネイティブなアクセスを提供する新しいドライバーです。APIレベルの翻訳を完全にバイパスし、ゲストOSはNVIDIAの公式ユーザーモードドライバーをそのまま使用できます。これにより、GPUレンダリングとエンコードをゲスト内で実行し、ホストへのCPU負荷を最小限に抑えつつ、ヘッドレスストリーミングなどの用途で高いパフォーマンスを発揮します。
全文翻訳
virtio-nvgpu
1つのNVIDIA GPUを複数のVMで、ベアメタル速度で共有する。
NVIDIAの公式ドライバー(Vulkan, NVENC, CUDA)を、ホストがカードを保持したまま、複数のマイクロVM内で実行できます。vGPUライセンスやVFIOパススルーは不要です。
なぜ
- パススルーはGPU全体を1つのVMにロックします。
- vGPUは高価で、データセンターカードでしか動作しません。
- APIフォワーディング(Venus, virgl)は非常に遅く、NVENCやCUDAはサポートしていません。
virtio-nvgpuは、グラフィックスAPIではなく、NVIDIAのドライバーをフォワードします。ゲストは独自のGPUコマンドを構築し、それを直接GPUメモリに書き込みます。そのため、描画されるフレームがVMの境界を越えることはありません。Venusやvirglのように、何もシリアライズされてホストでリプレイされることはありません。
どのくらい速いか
RTX 3060で:
- 実際のゲームフレーム(>2 ms)では、ベアメタルから2%以内
- ホストで実行するのと同等のCPUコスト
- 1枚のカードで12VMを均等に分割し、各VMはフレームドロップなしで720p60 H.264をエンコード
注
12はテストした数であり、ハードキャップではありません。コンテナと同様に、制限されるのは以下の要因です:
- VRAM。 ゲームはギガバイトを必要とするため、通常これが最初に不足します。
--vram-limit-mibで各ゲストのVRAMを制限してください。 - 各VMのホストCPUとRAM。
- GeForceカードのNVENCの12セッションキャップ。当社のNestriキャプチャレイヤーはVulkan Videoでエンコードするため、これにはカウントされません(一度に16セッションでも問題なく動作しました)。
誰向けか
コンシューマー向けNVIDIAカードで、ヘッドレスVM(クラウドゲーミング、リモートデスクトップ、実際のGPUを使ったCI、セルフホスト型「サーバーレス」AI)からゲームやGPUアプリをストリーミングする人々。
使用前の注意
- ハードウェア分離ではありません。 ホストのNVIDIAドライバーが信頼の境界線です。テナント同士がお互いを信頼しない場合は、パススルーまたはvGPUを使用してください。(Dockerコンテナが持つ信頼の境界線とほぼ同等です。)詳細 →
- Linuxゲストとホストのみをサポートします。ドライバー535.129.03以降をサポートします。
- これは初期バージョンであり、2枚のカードでしかテストされていません。CUDAは動作しますが、まだベンチマークされていません。
詳細情報
- 仕組み
- ベンチマーク
- セキュリティ
driver/はゲストカーネルモジュール(GPL-2.0)です。device/はVMMに依存しないRustデバイス(Apache-2.0)です。protocol/は両者で共有されます(BSD-3/GPL-2.0)。
gVisorのnvproxyと、Reindert Pelsmaによるkayfabeに触発されています。