当社のGB10マシンは、勝手に電源が切れていました。ログはメモリを疑っていましたが、原因は熱でした
オペレーション
当社の3台あるNVIDIA GB10マシンのうち1台が、9月に4日間で3回停止しました。9月10日、9月12日(17時間停止)、そして9月13日(再起動後12分)です。いずれも、電源ボタンを押す人が必要でした
熱によるシャットダウンの様子
システムジャーナルは、活動中にシャットダウンの記録もなく単に停止しました。ハードウェアによる電源断では、journaldがバッファを書き込む時間がありません。7月にも同様のシャットダウンがあり、その際、時計は古い日付に戻っていました。ハングしたマシンを再起動するハードウェアウォッチドッグは何もしませんでした。マシンはハングしたのではなく、電源が切れていたからです
誤った手がかり
各停止の直前の最後のカーネル行は、GPUのメモリ不足エラー(NV_ERR_NO_MEMORY)だったため、メモリが犯人のように見えました。しかしそうではありませんでした。これらの行は、単にカーネルが最も頻繁に出力するものでした。停止するまで19日間稼働した1回のブートで、440,580回も出力されていました。ある行がこれほど頻繁に現れる場合、それは何かが起きる直前の最後の行になり得ます。ログの行を犯人扱いする前に、問題が起きていないときにそれがどの程度出現するかを数えてください
正しい手がかり
電源断ではジャーナルの最後の数分が失われるため、温度、負荷、メモリを毎分ファイルに書き込み、ディスクにフラッシュする小さなサンプラーを追加していました。これは7月以降の5回の停止すべてを捉えました。いずれもGPU負荷が最大(96%)で、CPU温度は85〜97 °Cでした
タイミングがすべてを説明してくれました。9月上旬頃、私たちはこのマシンに動画レンダリングを移行しました。フル負荷時のGPU消費電力は約24 Wから46 Wへ、GPU温度の中央値は68 °Cから86 °Cへ、そしてCPUが95 °C以上で稼働した週あたりの分数は0分から4,283分へと変化しました。同じ96%の負荷で言語モデルを実行している他の2台のGB10マシンは、65~81 °Cの範囲にとどまっていました。このマシンだけが単純に冷却性能が劣っていたのです。
最初の対策:GPUクロックの上限設定
GB10では、nvidia-smiで電力制限を設定できませんが、GPUクロックの上限を設定できます:nvidia-smi -lgc 0,2000。7月には、これにより最も高温な領域が数秒で91 °Cから77〜83 °Cに低下しました。重要な点は2つあります:
- 重いサービスを開始する前に適用してください。当社の上限設定サービスは、当初は起動後約15秒で実行されていましたが、その頃にはモデルサーバーがすでにフルパワーで読み込みを開始しており、まさにマシンがクラッシュした瞬間でした。現在はDockerの起動前に実行されています
- 負荷下で確認してください。上限を設定した状態で、GPUがアイドル時の報告GPUクロックは約2,400 MHzを示しています。負荷下では1,976 MHzを維持します。
2つ目の対策:段階的なヒートガード
レンダリングを開始すると上限だけでは不十分だったため、ガードはすべてのセンサーを1秒ごとに読み取り、段階的に対応します。89 °CからGPUクロックを下げ、92 °Cからさらに下げます。94 °Cからレンダラーを一時停止(SIGSTOP)し、CPUを減速させます。96 °Cから冷却に必要な秒数だけすべてのGPUジョブを一時停止します。マシンがしばらく低温を維持した後にのみ、段階的に解除されます。97 °Cが20秒続くと、最終手段としてブレーキがビデオサービス全体を停止します。
レンダリング開始後の最初の9分間では、最も高温なゾーンのピークは94 °C、中央値は89 °Cでした。以前は97 °Cで安定していましたが、これには代償が伴います。9月中旬のある1日では、レンダラーは稼働時間の17%で一時停止し、GPUは1日の大半を900 MHz以下で動作させました。また、これは根本的な解決策でもありません。10月11日、97~98 °Cでマシンは再び自動シャットダウンしました。それ以来、無停止で稼働しており、執筆時点で20日間が経過しています。
途中で犯した4つのミス
- 1つのジョブを一時停止してもマシンは冷却されませんでした。レンダラーはすでに一時停止していましたが、画像モデルがまだ描画を行っており、同じ分に12個のタイマーが起動していたため、ブレーキが作動しました。最上位の段階では、レンダラーだけでなく、すべての重いGPUジョブを一時停止するようになりました。
- ガードはジョブを名前で一時停止しますが、名前が変わりました。9月に新しいプロセス名を持つ画像モデル、10月にレンダリングサービスのサブプロセスではなくコンテナ内で動作するレンダラーなど、2回、新しいエンジンが一時停止を逃れるところでした。エンジンの変更時には、ガードのリストを確認するようにしました。
- ブレーキの保持が解除されませんでした。ビデオサービスを停止し、再起動されないように保持ファイルを残しました。誰もアラートを受け取らず、気づくまでに3日間出力が停止していました。保持は現在、自動的に解除されます。最後のブレーキから5分後、新しいブレーキがなく、メモリ空きが少なくとも30 GBあり、10分平均が93 °C以下の場合です。マシンの冷却を待つのは機能しませんでした。レンダリングの有無にかかわらず、平均88 °Cでした。
- アラームは、マシンの通常温度で鳴っていました。 アラームの閾値は88 °Cでしたが、これはこのマシンの平均温度でした。1日あたり、90 °C以上が32%、93 °C以上が8%、95 °C以上が3%で、97 °Cに達したことは一度もありませんでした。アラームを、実際に停止したプラトー(横ばい)の97 °Cに変更したところ、アラームメールは届かなくなりました。
まとめ
マシンを稼働させ続けていたのはソフトウェアでしたが、原因は物理的なものでした。冷却性能が兄弟機種の2〜3倍も悪かったのです。GB10マシンが高負荷時に自動でシャットダウンする場合は、まずエアフローを確認してください。その上で、サービスの起動前にGPUクロックを上限設定し、マシンが限界に達する前に重いジョブを一時停止し、実際に稼働している温度に基づいてアラームを設定してください。
Factory Floorには、こうしたヒートガードが含まれています。GPUおよびサーマルゾーンセンサーの中で最も高い温度を読み取り、設定した温度(デフォルトは92 °C)で指定した重いジョブを一時停止し、より低い温度(84 °C)を下回った場合のみ再開します。メモリガードとディスクガードも併用できます。