水底

ScalaとかC#とかk8sとか

GPU Passthroughの最前線

TL;DR

今のところ、デスクトップ向けGPUであれば多くの環境で動くが、モバイル向けGPUの場合はゲストOSがWindowsだと比較的新しいGPUが利用できない。

そもそもGPU passthroughとは

GPU搭載のマシンで、VMから直接オーバーヘッド無しでGPUを利用できるようにする技術の総称です。私の場合は、ノートPCでLinuxをホストとし、QEMU/KVM上に建てたWindowsからGPUを利用しようとしています。が、一筋縄では動かすことができません…

なお具体的な設定方法は巷にたくさん転がっているため、この記事ではまとめていません。

動くのか動かないのか

GPU passthroughはソフトウェアだけでなくハードウェアにも強く依存します。CPU・GPU (デスクトップ (GTX1080) ・モバイル (GTX1080 Max-Q)・サーバ (Tesla V100))・バス・ホストOS・ゲストOS・ゲストOS上のGPUドライバなどのちょっとした違いによって動く動かないが分かれます。そのため、これなら動くと言い切るのも難しく、ネット上の情報も錯乱しているのが現状です。

現状把握

以下、NVIDIAのコンシューマ向けGPUのみに絞った話になります。

ひとまず、Maxwell以前のGPUであれば、大体の環境で動くようです。また、Pascal世代でもデスクトップ環境であればパッチを当てるなどして動かすことができるようです。問題なのがPascal世代のモバイル版 (e.g. GTX1070 Max-Q) で、ゲストOSがLinuxであれば動きますが、今のところWindowsだとPassthrough自体には成功するものの、動かそうとするとドライバの内部でコケてCode43というエラーが出てしまいます。

Code43

恐らくWindowsをゲストOSとしてGPU Passthroughしようとして一番頭を悩ませるのがCode43というエラーです。

Code43の原因には諸説?実際に?いくつかあるようです。正直はっきりしないですが、原因とされているものをここに列挙します。

  • ある程度新しいNVIDIAドライバは、ハイパーバイザ上だと、コンシューマ向けGPUわざと コケるようになっているらしい (VGPU対応のTeslaとかと差別化したいから?)。これはハイパーバイザのオプションや下記のnvidia-kvm-patcherで回避できることがあります。
  • vBIOSのCompatibility。UEFI対応しているかどうかが分かれ目になることがあるらしい。別バージョンのvBIOSを野良で拾ってきて使うと動くことも。
  • ACPIテーブル絡み。下記のoptimus-vfio-docsのissueで回避策が議論されている。
  • 設定のtypo。デバイスID等を間違えると、動いているように見えて実はCode43として表面化することがあります。場合によっては別のエラー番号になることもあります。

Code43を安定して解決できる人を募集しております (せめてエラー内容が表示されたらな…)

情報源

最新に近い情報源

1

元祖?ノートPCでNVIDIA Optimusに対応させつつGPU passthroughするための一通りの情報があります。コメント欄も活発でしたが、やはりPascal世代以降でCode43が解決できず最近は停滞気味です。

[GUIDE] Optimus laptop dGPU passthrough · GitHub

2

↑に関するRedditのスレッド。

3

Code43問題の解決に一番近そうな場所、つまり一番熱い場所です。ACPIテーブル周りが原因だろうとされ、絶賛スレッドが進行中です。期待。

ガイド的な情報源

ツール

1

Pascal世代のvBIOSを改変してCode43を回避しようというツール。デスクトップ向けGPUならこれで動くことが多いらしいです。

2

WindowsNVIDIAドライバを改変してCode43を回避しようというツール。

3

WindowsGPUの詳細を見たり、vBIOSのダンプを見られるツール。

4

Win/LinuxGPUのvBIOSダンプを取れるツール。

その他

1

古いドライバを試したいことがあると思います。とはいえGPUが新しいとドライバが対応しているGPUを見つけられなかったとしてインストールに失敗してしまいます。そんなときはドライバ内のiniに手動でGPUのエントリを追加することで無理やり認識させることができます。

2

色んな人がダンプしたvBIOSがアップされているところ。手元のものとは別バージョンのvBIOSをここから探してきて使うと動くこともあります。