dgx spark(GB10 MSI EdgeXpert)で、GPUが消え、HDMIをつなぐと勝手に再起動するようになった。原因を探す過程をまとめる。

結論から書くと、犯人はカーネル7.0.0-1024-nvidiaだった。7.0.0-1019-nvidiaに戻すと、HDMIをつないでも再起動しなくなり、GPUも安定した。途中でいちばん疑ったファームウェアは、冤罪だった。

事件の発端

このマシンでは、埋め込みモデルの追加学習を3日ほど回していた。学習と評価が終わったあとに一度電源を落とし、2分ほどして入れ直すと、GPUが見えなくなっていた。

$ nvidia-smi
No devices were found

カーネルのログには、ドライバを読み込んだ直後から次のエラーが出ていた。

NVRM: Xid (PCI:000f:01:00): 169, c287d000 94000000
NVRM: Xid (PCI:000f:01:00): 119, Timeout after 6s of waiting for RPC response from GPU0 GSP! Expected function 4097 (GSP_INIT_DONE)
NVRM: ksec2PrepareBootCommands_GB20B: SEC2 secure boot partition timed out.
NVRM: RmInitAdapter: Cannot initialize GSP firmware RM
NVRM: GPU 000f:01:00.0: RmInitAdapter failed! (0x62:0x65:2028)

GPUのファームウェア(GSP)が起動せず、ドライバは再試行を1,000回以上繰り返していた。前の起動では学習が最後まで正常に回っていたので、GPUそのものが急に壊れたとは考えにくい。

調査はClaude Codeに任せた。ログを読ませ、仮説を立てさせ、ひとつずつ潰していった。

容疑者1:ドライバとカーネルの更新

GPUが急に見えなくなったときにまず疑うのは、更新である。しかし、直近3回の起動を比べると、カーネル(7.0.0-1024-nvidia)もドライバ(580.178.04)も同じ版だった。前の起動では同じ組み合わせで学習が回っていたので、ここで一度シロと判定した。

この判定は「直近3回」しか見ていなかった。これが後で効いてくる。

容疑者2:GPUのクロック制限

このマシンは熱が気になって、起動時にGPUのクロックを2,000MHzに制限するsystemdのサービスを入れていた。起動のたびにGPUに触る処理なので疑ったが、ログの時刻を見るとアリバイがあった。

時刻出来事
21:25:37GPUのエラー(Xid 169、GSPの時間切れ)
21:27:13クロック制限のサービスが起動し、「No devices were found」で失敗

クロック制限は、GPUが倒れたあとに現場に来ていた。シロ。

容疑者3:ファームウェアの更新

fwupdmgr get-historyで更新の履歴を見た。最初に目に入ったのは8月のEmbedded Controllerの更新だけで、関係なさそうに見えた。

同じエラーの事例をNVIDIAのフォーラムで探すと、いくつか見つかった。

  • 普通の再起動では直らず、電源アダプタを抜いて30秒以上待つと直った、という報告がある。電源アダプタがつながっている間は、GPUの制御部が壊れた状態を保ってしまうらしい。
  • 一方で、電源を抜いても、OSとファームウェアを入れ直しても直らず、修理(RMA)になった例もある。

電源アダプタを抜いて1〜2分待ち、起動し直すと、GPUは戻った。ひとまず事件は解決した、はずだった。

第二の事件:HDMIをつなぐと再起動する

HDMIケーブルをつなぐと再起動を繰り返すことには気づいていて、今のファームウェアが安定していないのではと疑っていた。

履歴を全部見ると、8月の更新とは別に、USB-C PD(給電の制御)のファームウェアが10/31に502から522に上がっていた。最初に見たときは、出力の先頭しか読んでいなかったので見落としていた。いちばん新しい変更で、時期も合う。最有力の容疑者である。

$ sudo fwupdmgr downgrade <USB-C PDのDevice ID>   # 522 → 502

502に戻して再起動し、HDMIをつないだ。再起動した。

ファームウェアは関係なかった。

ログに何も残らない再起動

この時点で、23分間に8回起動していた。それぞれの起動の終わり方を見ると、2種類に分かれた。

  • 3回は、systemdが順にサービスを止めて終わっている。ファームウェアを戻すために自分で再起動した分である。
  • 4回は、止まる手順が一行もなく、途中でぷつりと切れている。HDMIによる再起動はこちらである。

切れる直前のカーネルのログには、HDMIの話もGPUのエラーも出ていなかった。最後の行は、起動のたびに出る決まった表示だけだった。OSが何かを記録する前に、もっと下の層(ファームウェアや電源の制御)で本体がリセットされている。

しかも、この23分の間にGPUが起動しなかった2回は、どちらもこのリセットの直後の起動だった。リセットされたGPUは、電源アダプタを抜くまで壊れた状態を引きずる。

真犯人:カーネル 7.0.0-1024-nvidia

フォーラムをもう一度探すと、立ったばかりのスレッドが見つかった。タイトルは「Any use of the HDMI (TMDS) output causes a hard reset on kernel 7.0.0-1024-nvidia」。ASUSのGB10マシンでの報告で、症状がそのまま同じだった。

  • HDMIのモニタをつないで起動すると、65〜100秒後にハードリセットされ、それを繰り返す。起動したあとに挿すと、数秒でリセットされる。
  • リセットの前に、ログには何も残らない。
  • 次の起動で、ACPIのBERT(前の起動で起きたハードウェアの誤りの記録)にcorrectedの記録が1件出る。
  • 7.0.0-1019-nvidiaに戻すと直った、という人が複数いる。

自分のマシンでも、起動ごとのカーネルの版とBERTの記録を並べた。

起動した時刻カーネルBERTの記録
10/31 14:577.0.0-1019-nvidiaなし
10/31 15:12〜15:30(13回)7.0.0-1024-nvidia毎回あり
11/01 21:257.0.0-1024-nvidiaあり
11/01 22:59〜23:09(5回)7.0.0-1024-nvidia毎回あり

BERTの記録の中身もフォーラムと同じだった。

BERT: Error records from previous boot:
[Hardware Error]: event severity: corrected
[Hardware Error]:   section type: unknown, 3c1e3f4b-1e1a-43df-af28-59820e958e3c

決め手は1行目と2行目の間である。カーネルが1024になった10/31の15:12から15:30まで、1分半おきに13回起動し直していた。

容疑者1を「直近3回が同じ版だから」でシロにしたのが間違いだった。直近3回はすべて1024で、比べる相手も1024だった。1024でも、学習は2日間問題なく回っていた。

そして、USB-C PDのファームウェアが入ったのは10/31の15:10で、カーネル1024で初めて起動したのはその直後の15:12だった。二人の容疑者が同じ時刻に現場にいたので、片方が冤罪になった。

1019に戻す

7.0.0-1019-nvidiaのカーネルと、それ用のドライバ(同じ580.178.04)はまだ残っていた。GRUBで1019から起動するように固定する。

$ echo 'GRUB_DEFAULT="Advanced options for DGX OS GNU/Linux>DGX OS GNU/Linux, with Linux 7.0.0-1019-nvidia"' \
    | sudo tee /etc/default/grub.d/99-kernel-1019.cfg
$ sudo update-grub

GRUBの項目は、IDでも名前でも指定できる。IDは長く、表示を切り詰めると途中で読めなくなるので、名前で指定した。区切りの>は、サブメニューとその中の項目をつなぐ。

設定が入ったかを確かめるときに、ひとつ罠がある。

$ sudo grep -n "set default" /boot/grub/grub.cfg
24:   set default="${next_entry}"
29:   set default="Advanced options for DGX OS GNU/Linux>DGX OS GNU/Linux, with Linux 7.0.0-1019-nvidia"

set defaultは2回出てくる。1回目は「次の1回だけ別の項目で起動する」ための行なので、grep -m1で最初の行だけを見ると、設定が入っていないと誤解する。見るのは2回目の行である。

リセットでGPUが壊れた状態を消すため、シャットダウンして電源アダプタを1〜2分抜いてから起動した。

$ uname -r
7.0.0-1019-nvidia
$ nvidia-smi --query-gpu=name,driver_version --format=csv,noheader
NVIDIA GB10, 580.178.04

GPUのエラーは0件、BERTの記録もなし。HDMIをつなぐと、Xorgがモニタを認識した。

NVIDIA(GPU-0): BenQ EW3270U (DFP-0): connected
NVIDIA(GPU-0): BenQ EW3270U (DFP-0): Internal TMDS

画面が映り、そのまま再起動しなかった。

最後に、冤罪だったUSB-C PDのファームウェアを522に戻した。こちらも問題なく動いている。

振り返り

  • 症状が始まった時刻に、何が変わったかを見る。「直近の起動どうしで同じか」を比べても、全部が壊れた後なら差は出ない。今回は、起動ごとのカーネルの版とBERTの記録を並べた表が決め手になった。
  • 同時に入った更新は、片方だけ見ると誤認する。カーネルとファームウェアが同じ再起動で入れ替わっていた。
  • ログに何も残らないこと自体が手がかりになる。OSのログが途中で切れていて、次の起動でBERTに記録が出るなら、OSより下でリセットされている。
  • GPUのGSPが起動しないときは、電源アダプタを抜く。普通の再起動では直らなかった。

7.0.0-1024-nvidiaの不具合は、NVIDIAからの回答も直った版もまだ出ていない。直った版が出るまで、1019で固定しておく。