Fehlerbehandlung in KI-Clustern: Was wirklich ausfällt und wie Sie es wiederherstellen

Verteiltes Training ist der eine Workload, bei dem Hardwareausfälle kein seltenes Ärgernis sind – sie sind eine Betriebssteuer, die Sie laufend zahlen. Metas veröffentlichtes Post-mortem zu Llama 3.1 405B verzeichnet 419 unerwartete Unterbrechungen in 54 Tagen auf einem Cluster mit 16,384 GPUs: ein Ereignis alle drei Stunden, wobei GPU- und HBM-Fehler für rund die Hälfte verantwortlich waren. So sieht der Dauerbetrieb aus, wenn man Tausende GPUs hart fährt.

Die meisten Kentino Kunden werden solche Zahlen nie sehen. Fine-Tunes auf einem einzelnen Knoten mit 8 GPUs sind statistisch ruhig. Die Fehlerbilder, Diagnosewerkzeuge und Wiederanlaufmuster sind aber dieselben. Dieser Artikel ist der ehrliche Katalog: Was ausfällt, wie Sie es bemerken, was Sie dagegen tun – und wo sich der technische Aufwand in unserer Größenordnung tatsächlich lohnt.

Die tatsächlichen Fehlerbilder

Zwei Kategorien zählen: Hardware-Ereignisse (GPU, Netzteil, NIC oder Datenträger tun etwas Physisches) und Software-Ereignisse (CUDA, NCCL, das Framework oder das Betriebssystem reagieren schlecht auf eine Störung). Nachfolgend grob in der Reihenfolge, wie häufig das jeweilige Problem auf einer Multi-GPU-Workstation oder einem kleinen Cluster zuschlägt.

GPU-XID-Fehler

Die Kernel-Logs (dmesg, journalctl -k) sind die maßgebliche Quelle. NVIDIA gibt bei jedem GPU-Fehler eine XID-Zeile aus. Die, die Ihnen tatsächlich begegnen:

XID Bedeutung Was es wirklich bedeutet
13 Graphics Engine Exception App-Bug, unzulässiger Speicherzugriff – meist CUDA-OOM
31 GPU memory page fault App-Bug oder Treiberproblem, gelegentlich defektes VRAM
43 Stopped processing Problem auf App-Seite, die GPU ist in Ordnung
48 Double-bit ECC error Hardware. Die Speicherzelle ist hinüber, die GPU sollte ausgemustert werden
63 ECC page retirement / row remapping pending Hardware degradiert. Austausch einplanen
74 NVLink error Kabel-, Riser- oder Platinenfehler
79 GPU has fallen off the bus Strom, PCIe, Riser oder thermische Notabschaltung
92 High single-bit ECC error rate Hardware degradiert
94 Contained ECC error (Hopper-Klasse) Ein einzelner Workload stirbt, die GPU läuft weiter
119 GSP RPC timeout Treiber-/Firmware-Problem, oft nach einem Neustart erledigt

Zwei Anmerkungen aus der Praxis:

  • XID 79 ist der Fehler, wegen dem Kunden in Panik anrufen. „Die GPU ist verschwunden.“ Bei einem Aufbau mit 4× oder 8× Riser ist XID 79 fast immer ein Riser-Problem, ein Stromstecker, der sich durch thermische Wechsellast gelöst hat, oder eine thermische Notabschaltung – keine defekte GPU. Neu stecken, neu verkabeln, erneut testen, bevor Sie eine RMA auslösen.
  • XID 48 und 63 sind echt. ECC-Defekte nehmen bei stark genutzten Karten über Monate zu. Die GPU nimmt Speicherseiten automatisch außer Betrieb, bis ihr die Ersatzzeilen ausgehen. Danach ist die Karte für Training unsicher; die meisten Betreiber tauschen sie aus.

CUDA Out-of-Memory mitten im Lauf

Der mit Abstand häufigste Trainingsfehler auf unserer Hardware – und fast immer die Schuld des Betreibers, nicht der Hardware. Typisches Muster: Das Training läuft 200 Schritte sauber, dann stürzt es ab mit CUDA error: out of memory. Die Ursache ist meist:

  1. Der Aktivierungsspeicher wächst mit der Sequenzlänge – längere Samples später in der Epoche sprengen das Budget.
  2. Ein weiterer Prozess auf derselben GPU. nvidia-smi zeigt zwei PIDs; einer hätte beendet werden sollen und wurde es nicht.
  3. Speicherfragmentierung. Der Caching-Allocator von PyTorch verweigert einen großen zusammenhängenden Block, obwohl genug Speicher frei ist. Abhilfe: PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True.

Die GPU zu verdoppeln hilft nicht. Die richtige Antwort ist eine kleinere Micro-Batch-Größe, aktiviertes Gradient Checkpointing oder ein geshardeter Optimizer (siehe K02).

NCCL-Timeouts und Netzwerkaussetzer

NCCL-Kollektive (all_reduce, all_gather, reduce_scatter) laufen über alle Ranks synchron. Bleibt ein Rank hängen – defekte NIC, überlasteter Switch, Aussetzer im Kernel-Scheduler, eine einzelne langsame GPU –, warten alle anderen Ranks am nächsten Kollektiv, und der gesamte Job blockiert. Ohne asynchrone Fehlerbehandlung bleibt der Stillstand unbemerkt; der Job scheint zu „hängen“, bis ein Watchdog-Timeout greift (standardmäßig 30 Minuten).

Die Abhilfe ist eine einzige Umgebungsvariable:

export TORCH_NCCL_ASYNC_ERROR_HANDLING=1
export TORCH_NCCL_TRACE_BUFFER_SIZE=20000  # für die Post-mortem-Analyse

PyTorch bricht dann bei einem Kollektiv mit Timeout mit SIGABRT ab. Zusammen mit torchelastic startet der Job vom letzten Checkpoint neu. Hinweis: Das ältere NCCL_ASYNC_ERROR_HANDLING ist veraltet.

Knotenausfälle und Netzteildefekte

In Multi-Node-Clustern kann ein Knoten durch einen NIC-Reset, einen flatternden Switch-Port, eine Kernel-Panic, den OOM-Killer oder ein Stromereignis ausfallen. Die Erkennung entspricht der beim NCCL-Timeout. Für Single-Node-Aufbauten mit 8 GPUs – die Mehrheit unserer Kunden – ist diese Kategorie irrelevant.

Ein defektes Netzteil ist ein harter Ausfall. Bei einem 8-GPU-Server mit zwei ATX-Netzteilen in Split-Rail-Konfigurationbedeutet ein Netzteilausfall keine Redundanz. Netzteil A versorgt GPU 0–3, Netzteil B die GPUs 4–7. Fällt Netzteil B aus, verschwinden vier GPUs innerhalb von Millisekunden mit XID 79. Die Wiederherstellung erfordert physischen Austausch. Echte Redundanz verlangt CRPS-Einheiten in 1+1-Hot-Swap – das ist ein Aufbau in Serverklasse, keine Workstation mit Consumer-GPUs.

Schreibfehler beim Checkpoint

Seltener, aber schmerzhaft. Der Job läuft zehn Stunden, erreicht einen Checkpoint, und der Schreibvorgang scheitert, weil der NFS-Server voll ist, die lokale NVMe ihr DWPD-Budget überschritten hat und in den Nur-Lese-Modus geht, ein Inode-Limit erreicht wurde oder sich Berechtigungen geändert haben. Der Schaden ist proportional zum Checkpoint-Intervall; wenn Sie es erst beim nächsten Versuch bemerken, verlieren Sie eine Stunde oder mehr.

Schleichende ECC-Defekte

Der stille Killer. Eine GPU meldet zunächst einmal pro Woche XID 92 (Single-Bit-ECC), dann täglich, dann stündlich. Jedes Ereignis gilt als „eingegrenzt“, der Job läuft weiter, aber die Genauigkeit driftet und der Trainingsverlust entwickelt eine langsame Aufwärtstendenz. Bis es jemand bemerkt, sind Hunderte Speicherseiten außer Betrieb und die Karte steuert auf XID 48 zu. Genau deshalb ist der Abschnitt zum Monitoring wichtiger als der zur Wiederherstellung.

Erkennung – worauf Sie achten sollten

Drei Ebenen: Kernel-Ebene (XID-Zeilen in dmesg), GPU-Hersteller (DCGM-Exporter nach Prometheus, dcgmi diag für aktive Prüfungen) und Framework-Ebene (PyTorch-Watchdog, NCCL-Trace-Buffer, Alarme auf Loss und Durchsatz).

Die Alarme, auf die es ankommt:

  • Jede Zeile XID 48 / 63 / 79 / 92 in dmesg → sofortige Benachrichtigung
  • GPU-Temperatur > 85 °C länger als 5 Minuten → sofortige Benachrichtigung
  • Steigender Zähler für flüchtige ECC-Fehler → Ticket, kein Sofortalarm
  • DCGM dcgm_thermal_violation ungleich null → Kühlungsproblem, Luftführung prüfen
  • Trainingsverlust sinkt über >100 Schritte nicht → einen Blick wert

Beispiele echter Fehlerprotokolle

Das sehen Sie tatsächlich in journalctl -k , wenn XID 79 auslöst (RTX 5090, Riser-Kabel hatte sich durch thermische Wechsellast gelöst):

Apr 22 03:14:17 kentino-ai-04 kernel: NVRM: Xid (PCI:0000:c1:00): 79, pid='<unknown>', name=<unknown>, GPU has fallen off the bus.
Apr 22 03:14:17 kentino-ai-04 kernel: NVRM: GPU 0000:c1:00.0: GPU is on Board .
Apr 22 03:14:17 kentino-ai-04 kernel: NVRM: A GPU crash dump has been created. If possible, please run
Apr 22 03:14:17 kentino-ai-04 kernel: NVRM: nvidia-bug-report.sh as root to collect this data before
Apr 22 03:14:17 kentino-ai-04 kernel: NVRM: the NVIDIA kernel module is unloaded.

So sieht ein NCCL-Timeout aus, gekürzt:

[E ProcessGroupNCCL.cpp:475] [Rank 3] Watchdog caught collective operation timeout:
WorkNCCL(SeqNum=842, OpType=ALLREDUCE, NumelIn=268435456, NumelOut=268435456,
Timeout(ms)=1800000) ran for 1800321 milliseconds before timing out.
[E ProcessGroupNCCL.cpp:489] [Rank 3] Some NCCL operations have failed or timed out.
terminate called after throwing an instance of 'std::runtime_error'

Rank 3 meldet es, aber Rank 3 ist fast nie das eigentliche Problem. Der langsame Rank ist der, der nicht angekommen ist. Der NCCL-Trace-Buffer gibt aus, welche Ranks bei welchem Aufruf blockiert waren – so finden Sie den wahren Verursacher.

Wiederanlaufmuster

Checkpoints so häufig, dass ein Neustart billig ist

Für ein 7B-Fine-Tuning auf 8× RTX 5090 mit Checkpoints auf lokaler NVMe: ~14 GB geschrieben mit ~3 GB/s ≈ 5 s pro Checkpoint; alle 30 Minuten sind 0.3% Overhead, und der Worst-Case-Verlust liegt bei 15 Minuten. Für einen geshardeten 70B-FSDP-Checkpoint auf derselben Box: ~140 GB parallel über 8 GPUs verteilt, vergleichbarer Overhead. Günstig – also tun.

Ein vollständiger Pretrain-Checkpoint von Llama 70B über Netzwerkspeicher umfasst ~520 GB und kann 20+ Minuten dauern; genau dort führen Häuser vom Meta-Kaliber asynchrones, gestuftes Checkpointing ein (schnell lokal schreiben, langsam auf dauerhaften Speicher abfließen lassen). In Kentino Größenordnung gilt: alle 15–30 Minuten auf lokale NVMe sichern und am Ende des Laufs auf das NAS synchronisieren. Alles Aufwendigere ist Over-Engineering.

Automatischer Neustart mit torchelastic

torchrun unterstützt elastisches Training ab Werk:

torchrun \
    --nnodes=1:1 \
    --nproc-per-node=8 \
    --max-restarts=3 \
    --rdzv-backend=c10d \
    --rdzv-endpoint=localhost:29500 \
    train.py --checkpoint-dir /mnt/nvme/ckpt

Mit TORCH_NCCL_ASYNC_ERROR_HANDLING=1lautet die Kette: NCCL-Kollektiv hängt → PyTorch-Watchdog schlägt an → Prozess bricht mit SIGABRT ab → torchelastic beendet die Geschwister-Ranks und startet neu ab latest_checkpoint.pt. Der gesamte Ablauf dauert meist 60–120 Sekunden. Kurzzeitige Aussetzer werden so überbrückt. Ein dauerhafter Defekt (GPU auf XID 79) verbraucht das Budget aus --max-restarts und dann ist ein Mensch gefragt.

Die betriebliche Praxis

Der größte Hebel auf die Ausfallkosten ist nicht der Wiederherstellungscode – es ist das, was Sie tun, bevor der Job startet.

Pre-Flight-Checks

Bevor Sie etwas starten, das länger als ein paar Stunden läuft, führen Sie die Validierungssequenz aus:

# 1. Stresstest je GPU — findet stille Thermik-/ECC-Probleme
gpu-burn 600                        # 10 Minuten pro GPU unter Volllast

# 2. DCGM-Diagnose — deckt latente Hardwarefehler auf
sudo dcgmi diag -r 3                # Stufe 3 = gründlich, ~15 Min.

# 3. NCCL-Fabric-Test — prüft die Bandbreite zwischen den GPUs der Box
mpirun -np 8 ./build/all_reduce_perf -b 8 -e 1G -f 2 -g 1

# 4. PyTorch-Trockenlauf — ein Schritt, volle Batch-Größe, alle Ranks
torchrun --nproc-per-node=8 dryrun.py
Prüfung Findet
gpu-burn Thermisches Throttling, stille ECC-Fehler, die nur unter Last auftreten
dcgmi diag Rückstufungen der PCIe-Linkbreite, Stromprobleme, Speicherfehler, NVLink
nccl-tests Defekten Riser, langsame PCIe-Lane, defekte NVLink-Brücke, falsch konfigurierten Switch
Trockenlauf OOM, Code-Bugs, hängende Dataloader, falschen Tokenizer

Auf einem sauberen Server mit 8× RTX 5090 sollte all_reduce_perf je nach PCIe-Topologie bei einer Busbandbreite von 50–80 GB/s landen. Deutlich darunter heißt Riser- oder Topologieproblem – das beheben Sie vor dem Training. Wir lassen gpu-burn im Rahmen der Vorversand-QA bei jedem Aufbau, der Kentino verlässt, eine volle Stunde laufen.

Achten Sie auf schleichende Lecks

Echte Codebasen sammeln Speicher an: Ein Logging-Hook hält eine Tensor-Referenz, ein Exception-Pfad vergisst, einen Puffer zu leeren, ein LR-Scheduler leakt eine Closure. Das Ergebnis ist ein OOM bei Schritt 5000 eines Laufs über 10000 Schritte. Günstigste Gegenmaßnahme: Geben Sie torch.cuda.memory_allocated() alle N Schritte im Trainingslog aus. Wenn der Wert wächst, sollte er das nicht.

Die statistische Realität in Kentino Größenordnung

Hier zahlt sich Ehrlichkeit über die Größenordnung aus. Ausfallraten skalieren mit GPU-Stunden; große Cluster fallen ständig aus, weil dort viele GPUs viele Stunden laufen.

Konfiguration GPU-Stunden/Monat Erwartete Hardware-Ereignisse/Monat
Einzelne Workstation, 4 GPUs 2,880 ~0.05 – also eines alle 1–2 Jahre
Einzelner Server, 8 GPUs 5,760 ~0.1 – einmal jährlich bei intensiver Nutzung
Kleiner Cluster, 32 GPUs 23,040 ~0.5 – einmal alle 2 Monate
Kleiner Cluster, 32 GPUs im 24/7-Betrieb Voller Lastzyklus ~1/Monat
Hyperscale, 16,384 GPUs ~12M 232/Monat (Meta Llama 3)

Schätzungen kalibriert an den Meta-Daten (ein Ausfall je ~50,000 beobachtete GPU-Stunden). Die realen Zahlen schwanken je nach GPU-Modell – Consumer-Karten wie 4090 und 5090 an Risern fallen häufiger aus als L40 aus dem Rechenzentrum in ihrem nativen Chassis, vor allem durch Verschleiß an PCIe- und Stromsteckern.

Fazit: In der Größenordnung eines Einzelknotens mit 8 GPUs sollten Sie mit einem Hardware-Ereignis pro Jahr intensiver Nutzung rechnen, nicht mit einem pro Woche. Die meisten Fine-Tunes laufen durch, ohne je eines zu sehen. Kunden, die welche sehen, trainieren durchgehend – und das dominierende Fehlerbild liegt auf der Riser-/Netzteilseite, nicht im GPU-Silizium.

Was ein Neustart kostet

Die Kosten eines Neustarts bestehen aus verlorener Trainingszeit plus Diagnosezeit eines Ingenieurs. Bei einem Aufbau mit 8× RTX 5090 und sagen wir €300/Tag amortisiert kosten zusätzliche 30 Minuten €6. Die Arbeitszeit für Diagnose, erneutes Stecken eines Kabels und Neustart beträgt ein bis drei Stunden. Der Rechenverlust ist ein Rundungsfehler; die Arbeitszeit ist der Kostenblock. Genau deshalb ist die richtige Investition Monitoring und Pre-Flight, nicht exotische Wiederherstellungsinfrastruktur.

Die meisten Inhalte zum Umgang mit Ausfällen sind für die Hyperscale-Ebene geschrieben. In Kentino Größenordnung ist das Meiste davon Over-Engineering. Die 80/20-Regel lautet: Kernel-Logs überwachen, auf lokale NVMe sichern, TORCH_NCCL_ASYNC_ERROR_HANDLING=1setzen und vor großen Jobs gpu-burn laufen lassen.

Wie Sie weiter vorgehen

Wenn Sie eine Multi-GPU-Box in Kentino Größenordnung betreiben, sind das die konkreten Schritte:

  1. Richten Sie DCGM-Exporter und einen minimalen Prometheus-Alarm ein für ECC-Fehler und thermische Grenzwertverletzungen. Ein halber Tag Aufwand; fängt 80% der schleichenden Hardwareprobleme ab.
  2. Ergänzen Sie TORCH_NCCL_ASYNC_ERROR_HANDLING=1 und --max-restarts=3 noch heute in Ihrem Startskript. Null Aufwand, verhindert den Stillstand über Nacht.
  3. Wählen Sie das Checkpoint-Intervall nach Joblänge. Unter 2 Stunden: lohnt nicht. 2–24 Stunden: alle 30 Minuten auf lokale NVMe. Über mehrere Tage: alle 15 Minuten mit regelmäßiger Synchronisation auf dauerhaften Speicher.
  4. Lassen Sie gpu-burn und dcgmi diag -r 3 nach der Lieferung laufen, vor dem ersten echten Workload. Das findet tote Karten und Transportschäden. Quartalsweise wiederholen.
  5. Lesen Sie die Artikel zu Risern und Netzteilen, bevor Sie die GPU verdächtigen. Auf Servern mit Consumer-GPUs sind Riser und Netzteil-Rail doppelt so oft die Fehlerquelle wie der GPU-Die.

Begleitende Artikel: K02 (verteiltes Training und Checkpoint-Formate), K04 (Cluster-Storage), N06 (Latenzanalyse).


Dies ist Teil des Kentino Wiki, einer Referenzreihe zu KI-Compute, Robotik und den Systemen, die beides verbinden. Kommentare und Korrekturen willkommen unter info@kentino.com.