Incus VMでGPUパススルーを試みた結果、ベアメタルに逃げた話

Progress 17 / 18
目次

前回の記事でMESファームウェアのバグを倒してlemonadeが動くようになりました。ところが、しばらく使っていると別の問題が出てきました。今回はその話です。

何が起きたか

lemonadeが推論中にクラッシュしました。モデルのロード中やOOM(Out of Memory)でプロセスが死ぬのは推論サーバーあるあるなのですが、問題はその後でした。

Podが再起動しても、GPUが使えない。VM内の dmesg を見ると、以下のエラーを吐いて止まっています。

[ 40.4] amdgpu: PSP tmr init failed!

VM を再起動してもダメ。ホストを再起動してもダメ。電源を一度落とすコールドブート(完全放電までは試していませんが)をしてもダメ。

これには少し驚きました。ソフトウェアリセットはもちろん、OSレベルで電源を落としてもGPUの汚い状態がクリアされないことがあるんですね。

なぜ回復できないのか

Strix HaloはAPUなので、GPU側のPSP(Platform Security Processor)がCPU側のASP(AMD Security Processor / CCP)と密結合しています。lemonadeがGPUをクリーンにリリースせず終了すると、PSPがTMR(Trusted Memory Region)を汚い状態のまま残してしまう、ということのようです。

次回起動時にPSPが初期化しようとするとこの汚い状態に当たり、UNKNOWN CMD(0xFFFFFFFF)(タイムアウト)で失敗します。

VFIO環境ではCPU側のASPを「VMとして」パススルーしているため、ホスト側の物理リソースに直接アクセスできません。このため、VFIO越しではPSPのリセットが正しく機能しないようです。ベアメタルでは同じクラッシュが起きてもPodを再起動するだけで回復できるので、VFIO特有の問題だと考えています。

ほぼほぼredditからの受け売りですが、ある程度説明はついているのかなと思います。

試したこと

FLR(Function Level Reset)

Terminal window
echo 1 > /sys/bus/pci/devices/0000:c5:00.0/reset

効果なし。PSPのファームウェア状態はFLRでクリアされません。

vendor-resetモジュール

AMDのGPUリセット問題の定番解決策ですが、kernel 7.x系ではビルドが失敗します。そもそもStrix Haloには非対応でした。

どちらも解決には至らず、ここで打ち手が尽きました。

ベアメタルに切り替える

「Incus VMをやめて、直接ベアメタルにUbuntuを入れてk3sを動かせばいい」という当たり前の結論にたどり着きました。

他のノードとアーキテクチャをそろえられないのは少し惜しいですが、GPUクラッシュのたびにコンセントを抜くしかない構成では、運用として成り立ちません。

落ち着いた構成

  • ベアメタルUbuntu 26.04(Incus無し)
  • カーネル組み込みのamdgpu + ROCm 7.2.3
  • k3sエージェントを直接インストール
  • AMD GPU Operator + DRAドライバーでKubernetesからGPUを利用

lemonadeがクラッシュしてもPodが再起動すれば普通に回復するようになりました。VFIOの頃とは比べ物にならない安定性です。

まとめ

VFIOパススルーは動いているときは良いのですが、Strix HaloのようなAPUでは、GPUがdirty状態になったときにソフトウェアで回復する手段がありません。クラッシュを完全に防げない推論サーバーの用途では、VFIO構成の継続は難しいと判断しました。

ベアメタルは「当たり前の選択」に見えて最初は抵抗がありましたが、安定して動いているのが一番です。

同じ構成で詰まっている方の参考になれば幸いです。