Tech カテゴリのイメージ

GPU Health Checkとは?ECC・Xid・温度異常からLLM推論を守る

GPU使用率が高く、memoryにも余裕がある。それでもLLMの応答が急に遅くなり、別のworkerではCUDA errorが出ることがある。GPUが計算できていることと、健全に計算できていることは同じではない。

LLM servingでは、一台の不調なGPUがTensor Parallel group全体を待たせる。訂正不能なmemory errorやlink障害はrequest失敗やprocess停止にもつながる。GPU Health Checkは利用率を見るためではなく、正しい計算と安定した通信を継続できるか判断するために行う。

GPU使用率はhealthを表さない

GPU utilizationは、観測期間のうちkernelが動いていた割合である。高い利用率は故障の否定にならず、低い利用率も故障の証拠ではない。

温度や電力制限でclockが下がっても利用率は高くなりうる。逆に、上流queueが空なら健全なGPUでも利用率は低い。health判断では、少なくとも次の信号を組み合わせる。

  • ECC errorとmemoryの修復状態
  • driverがkernel logへ記録するXid
  • 温度、power、clock、throttle理由
  • PCIe replay、NVLink error、fabric状態
  • CUDA context作成と小さな計算の成否
  • 同型GPU間のthroughput、clock、powerの外れ値
  • CUDA error、NCCL timeout、TTFT、ITL

一つのmetricだけで故障を断定せず、同じGPU UUIDで時系列とapplication症状を結び付ける。

ECCは訂正済みと訂正不能を分ける

ECCはGPU memory内のbit errorを検出し、対応hardwareでは一部を訂正する仕組みである。Single-Bit Errorは訂正される場合があるが、訂正できたから無視してよいとは限らない。発生率の増加や同じ領域での反復は、memory劣化や環境要因の手掛かりになる。

Double-Bit Errorなどの訂正不能errorは、workloadの正しさや継続性に影響しうる。DCGMのmemory health watchは、volatileなdouble-bit ECC、faulty memory、pendingまたは過剰なpage retirement、row remap失敗などを評価する。

確認時はcurrent boot以降のvolatile countと、累積値であるaggregate countを混同しない。counterが非zeroかだけでなく、直近で増えたか、どのworkload中に増えたかを見る。

page retirementとrow remappingを見る

errorが見つかったmemory pageを使わないようにするpage retirementや、故障したmemory rowを予備rowへ置き換えるrow remappingがある。修復機能が動いたこと自体は即時故障を意味しないが、pending状態、修復失敗、予備資源の減少は運用判断に必要である。

再起動後に修復が反映される場合もあるため、単に再起動してcounterが消えたように見える状態を正常復帰としない。修復状態を確認し、必要なdiagnosticを通してからschedulerへ戻す。

Xidは原因ではなく調査の入口である

XidはNVIDIA driverがOSのkernel logまたはevent logへ出すGPU error reportである。hardware、driver、applicationのいずれも原因になりうる。Xid番号だけで「GPU故障」と決めるものではない。

Linuxでは最初のXid付近にGPU UUIDやPCI bus IDが記録される。時刻、Xid番号、GPU UUID、直前のrequestやjob、driver versionを保存する。GPU indexは並び替わる可能性があるため、GPU 2だけをincident記録へ残さない。

Xidごとに推奨対応は異なる。applicationの不正memory accessを示す場合も、PCIeやframe bufferのcorruptionが別のerrorとして表面化する場合もある。公式資料を参照し、codeごとのrunbookへ分岐する。

resetや再起動の前に証拠を残す

GPU resetやnode再起動は復旧を早める場合があるが、kernel log、counter、process状態などの証拠を失わせる。まず新規requestの割り当てを止め、可能なら既存requestをdrainし、次を採取する。

  • Xidを含むkernel logと時刻
  • GPU UUID、PCI bus ID、driver・firmware version
  • ECC、retired page、row remap、temperature、power、clock
  • PCIe、NVLink、NVSwitchのerrorと状態
  • process、container、model version、parallel group
  • CUDA、NCCL、model serverのlog
  • TTFT、ITL、throughput、error rateの変化

NVIDIAのnvidia-bug-report.shはdriver関連のdebug情報を収集する。productionでの実行権限、保存先、個人情報やsecretの取り扱いを事前にrunbookへ定める。

温度、電力、clock低下はstragglerを生む

GPUは温度やpower limitに近づくとclockを下げることがある。処理自体は成功しても、一つのrankだけ遅くなればAll-ReduceやAll-to-Allの同期点でgroup全体が待つ。

平均温度だけでは短いthermal excursionを見逃す。temperature、SM・memory clock、power draw、throttle reasonを同じ時間軸で確認する。同型GPUの同じworkloadと比較し、一台だけclockやthroughputが低い状態を検出する。

原因はGPU単体とは限らない。fan、airflow、rack吸気温度、power delivery、同居workloadも調べる。clock低下をmodel serverのbatch設定だけで補うと、障害の発見を遅らせる。

PCIeとNVLinkもhealthの一部である

GPU memoryとcomputeが健全でも、PCIeやNVLinkのerrorでcollectiveが遅延または失敗する。DCGMのhealth monitoringはPCIe replayやbus・fabric関連Xid、NVLink、driverなどを監視対象にできる。

LLM servingではNCCL timeoutやhangが最初の症状になることがある。application logだけで通信libraryの問題と断定せず、affected rankのGPU、link、NIC、switchをTopologyと照合する。同じGPUで再発するのか、同じPCIe switchやNVLink pathに偏るのかで調査範囲が変わる。

DCGMのpassive監視とactive診断を分ける

NVIDIA DCGMには、通常workloadを動かしたままtelemetryを評価するhealth monitoringと、専用の負荷をかけるdiagnosticsがある。

passive health monitoringは、保持したsampleからPCIe、memory、driver、thermal・power、NVLinkなどの既知のincidentを判定する。Healthyは、設定したwatchが保持期間内に問題を検出しなかったという意味である。すべてのsubsystemを検査したことや、負荷試験に合格したことまでは保証しない。

active diagnosticsは、CUDA context、memory、compute、PCIe、bandwidth、powerなどへtest workloadをかける。passive監視で問題がなくてもactive testで失敗することがあり、その逆もある。

active testはGPU compute、memory、PCIe、NVLink、CPU、power、coolingを消費し、running processと競合する。production trafficを載せたまま長いsuiteを実行せず、対象GPUまたはnodeをschedulerから外してから行う。

Pass、Fail、Skipを正しく読む

diagnosticのPassは、選択したtestが説明された範囲で問題を検出しなかったことを示す。GPU全体の永久的な健康証明ではない。

Failはhardware defectの検出だけでなく、prerequisite不足やtest実行失敗を含む場合がある。結果のcodeとmessageを読む。Skipは未検査であり、passとして数えない。

復帰条件は「commandが終了した」ではなく、必要なtestが対象GPUでpassし、counterが安定し、canary workloadでapplication metricも正常であることにする。

LLM servingで現れる症状

  • 一つのrankだけDecodeが遅くなり、全体のITLが悪化する
  • NCCL collectiveがtimeoutする
  • CUDA contextの作成やmemory allocationが失敗する
  • workerが再起動loopへ入る
  • outputにNaNが混ざる、またはdiagnosticで計算結果の不一致が出る
  • replicaの一部だけTTFTとerror rateが悪化する

ただしOOMは常にhardware故障ではない。KV Cache不足、memory leak、batch設定、fragmentationでも起きる。CUDA errorやlatency悪化をhealth telemetryと関連付けて切り分ける。

隔離から復帰までの手順

  1. alertへGPU UUID、node、時刻、severityを付ける
  2. schedulerで対象GPUまたはnodeへの新規配置を止める
  3. 可能なrequestを別replicaへ逃がし、対象workerをdrainする
  4. resetや再起動の前にlogとcounterを採取する
  5. Xid、ECC、row remap、temperature、power、link、application症状を分類する
  6. code別runbookに従ってprocess停止、GPU reset、node再起動、driver調査、hardware交換へ分岐する
  7. idle状態で必要なactive diagnosticを実行する
  8. 小さなcanary workloadで正しさ、latency、collectiveを確認する
  9. 一部trafficから段階的にschedulerへ戻す
  10. 再発監視期間を設け、incident記録とcounter差分を残す

訂正不能ECCや重大なXidが出たGPUへ、自動再試行だけでtrafficを戻し続けない。別replicaでrequestを成功させる仕組みと、疑わしいdeviceを隔離する仕組みを分ける。

Kubernetesでの実装

KubernetesではDCGM ExporterなどでGPU telemetryを収集し、alertとnode・deviceの隔離へつなげる。metricを集めるだけで自動復旧は完成しない。

alert ruleには一時的なspikeを吸収する継続時間と、即時隔離すべきfatal eventを分けて持たせる。GPU単位で隔離できないscheduler構成なら、node全体をcordonしてworkloadをdrainする。MIGを使う場合も、instanceのerrorとphysical GPU全体の状態を区別する。

indexではなくUUIDを主keyにし、Pod、container、model、rank、PCI bus IDを関連付ける。device pluginやcontainer runtimeの再起動でindexが変わっても追跡できるようにする。

監視するmetric

  • corrected、uncorrected ECCの増分
  • volatile、aggregate ECC count
  • retired page、pending page、row remapの状態
  • Xid番号、発生時刻、GPU UUID、PCI bus ID
  • temperature、power draw、power limit、throttle reason
  • SM clock、memory clock、同型GPU間のperformance差
  • PCIe replay、NVLink・NVSwitch error
  • DCGM healthのsubsystem別Warning・Failure
  • diagnosticのtest、結果、code、対象entity
  • CUDA error、worker restart、NCCL timeout
  • GPU別のTTFT、ITL、token throughput、error rate
  • node隔離から復帰までの時間と再発率

counterの絶対値だけでなく、deployment、driver更新、firmware更新、室温変化の前後差を見る。

障害試験

  1. alertからGPU UUIDとPodを特定できるか確認する
  2. 一台のworkerを停止し、requestが別replicaへ退避するか確認する
  3. persistentなhealth eventで新規配置が止まるか確認する
  4. drain中に新しいlong requestが入らないか確認する
  5. log採取前にautomationが再起動しないか確認する
  6. active diagnosticがproduction workloadへ混入しないか確認する
  7. SkipをPassとして復帰判定しないか確認する
  8. GPU index変更後もUUIDでincidentを追跡できるか確認する
  9. 一つのrankを意図的に遅らせ、TTFT・ITLとcollective待ちで検出できるか確認する
  10. canary失敗時に再隔離されるか確認する

hardware errorそのものを無理に再現する必要はない。alert、scheduler、drain、evidence収集、診断、復帰のcontrol pathを安全なfault injectionで検証する。

GPUのhealthは計算、memory、通信、冷却をまとめて見る

GPU Health Checkは、使用率やfree memoryを眺める作業ではない。ECC、page retirement、row remap、Xid、温度・電力、clock、PCIe・NVLink、application症状を同じGPU UUIDと時間軸で関連付ける。

通常時はpassive monitoringを続け、疑わしいdeviceをdrainしてからactive diagnosticsを行う。reset前に証拠を保存し、Pass・Fail・Skipを区別し、canaryを通して段階的に戻す。LLM分散推論では一台のstragglerが全rankへ波及するため、個体のhealthとservice全体のlatencyを同時に見る必要がある。

参考資料