Riešenie porúch v klastroch umelej inteligencie: Čo sa vlastne pokazí a ako to zotaviť

Distribuované školenie je jediná pracovná záťaž, kde zlyhania hardvéru nie sú zriedkavou nepríjemnosťou – sú to prevádzkové dane, ktoré platíte nepretržite. Meta v štúdii Llama 3.1 405B zaznamenala 419 neočakávaných prerušení počas 54 dní na klastri so 16 384 GPU: jednu udalosť každé tri hodiny, pričom chyby GPU a HBM sú zodpovedné za zhruba polovicu. To je ustálený stav prevádzky tisícok GPU v náročnom stave.

Väčšina zákazníkov Kentina takéto čísla nikdy neuvidí. Jemné doladenie 8-GPU s jedným uzlom je štatisticky tiché. Ale režimy zlyhania, diagnostické nástroje a vzory obnovy sú rovnaké. Tento článok je úprimným katalógom: čo zlyháva, ako si to všimnete, čo s tým urobíte a kde sa inžinierske úsilie v našom meradle skutočne oplatí.

Skutočné režimy zlyhania

Dôležité sú dve kategórie – hardvérové ​​udalosti (GPU, zdroj, sieťová karta, disk vykonáva fyzickú činnosť) a softvérové ​​udalosti (CUDA, NCCL, framework, operačný systém reaguje zle na prechodový jav). Nižšie je uvedené zhruba poradie toho, ako často každá z nich narúša prácu na pracovnej stanici s viacerými GPU alebo v malom klastri.

Chyby GPU XID

Záznamy jadra (dmesg, journalctl -k) sú zdrojom pravdy. NVIDIA pri každej chybe GPU vygeneruje riadok XID. Tie, ktoré skutočne vidíte:

XID Význam Čo to naozaj znamená
13 Výnimka grafického enginu Chyba aplikácie, nelegálny prístup k pamäti – zvyčajne CUDA OOM
31 Chyba stránky pamäte GPU Chyba aplikácie alebo problém s ovládačom, občas chybná VRAM
43 Zastavené spracovanie Problém na strane aplikácie, grafická karta je v poriadku
48 Dvojbitová chyba ECC Hardvér. Pamäťová bunka je preč, grafická karta by mala byť vyradená z prevádzky.
63 Čaká sa na ukončenie/premapovanie riadkov stránky ECC Zhoršovanie výkonu hardvéru. Naplánujte si výmenu.
74 Chyba NVLinku Porucha kábla, rozširujúcej sa karty alebo dosky
79 GPU vypadlo z autobusu Napájanie, PCIe, rozširujúca karta alebo tepelné vybitie
92 Vysoká miera chybovosti jednobitového ECC Zhoršovanie kvality hardvéru
94 Chyba ECC (trieda Hopper) Jedna pracovná záťaž bola ukončená, grafická karta stále beží
119 Časový limit RPC GSP Problém s ovládačom/firmvérom, často vyriešený reštartom

Dve poznámky zo skúsenosti:

  • Zákazníci volajú kvôli XID 79. „GPU zmizla.“ Pri zostave s rozširujúcou kartou 4× alebo 8× je XID 79 takmer vždy problémom s rozširujúcou kartou PCIe, napájacím konektorom, ktorý sa vypol pri teplotných cykloch, alebo tepelným vypnutím – nie nefunkčnou grafickou kartou. Pred RMA ju znova osadte, prepojte káble a znova otestujte.
  • XID 48 a 63 sú skutočné. Chyby ECC sa na intenzívne používaných kartách objavujú v priebehu mesiacov. GPU automaticky vyraďuje stránky, kým sa mu neminú voľné riadky. Potom už karta nie je bezpečná na trénovanie; väčšina operátorov ju vymení.

Nedostatok pamäte CUDA počas behu

Najčastejšia chyba trénovania na našom hardvéri a takmer vždy chyba operátora, nie hardvéru. Typický vzorec: trénovanie prebieha bez problémov 200 krokov, potom havaruje s CUDA error: out of memoryPríčinou je zvyčajne:

  1. Aktivačná pamäť rastie s dĺžkou sekvencie — dlhšie vzorky neskôr v epoche premrhajú rozpočet.
  2. Partnerský proces na tej istej grafickej karte. nvidia-smi zobrazuje dva PID; jeden mal byť ukončený, ale nebol.
  3. Fragmentácia pamäte. Alokátor vyrovnávacej pamäte v PyTorch odmieta veľký súvislý blok aj s dostatočnou voľnou pamäťou. Oprava: PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True.

Zdvojnásobenie GPU nepomôže. Správnou odpoveďou je zníženie veľkosti mikrodávok, povolenie gradientového kontrolného bodovania alebo rozdelenie optimalizátora (pozri K02).

Časové limity NCCL a sieťové chyby

kolektívy NCCL (all_reduce, all_gather, reduce_scatter) sú synchrónne vo všetkých radoch. Ak sa jeden rad zastaví – chybná sieťová karta, preťažený prepínač, problém s plánovačom jadra, jedna pomalá grafická karta – každý ďalší rad čaká na ďalší kolektív a celá úloha sa zablokuje. Bez asynchrónneho spracovania chýb je zastavenie tiché; úloha sa javí ako „zaseknutá“, kým sa nespustí časový limit watchdogu (predvolene 30 minút).

Oprava spočíva v jednej premennej prostredia:

export TORCH_NCCL_ASYNC_ERROR_HANDLING=1
export TORCH_NCCL_TRACE_BUFFER_SIZE=20000  # for post-mortem analysis

PyTorch potom preruší s SIGABRT na kolektíve s vypršaným časovým limitom. V kombinácii s torchelastic sa úloha reštartuje od posledného kontrolného bodu. Poznámka: staršie NCCL_ASYNC_ERROR_HANDLING je zastarané.

Odpojenie uzla a poruchy zdroja

Na viacuzlových klastroch môže uzol vypadnúť z dôvodu resetu sieťovej karty, výpadku portu prepínača, paniky jadra, zásahu OOM-killer alebo udalosti napájania. Detekcia je rovnaká ako pri časovom limite NCCL. Pre zostavy s jedným uzlom a 8 GPU – väčšina našich zákazníkov – sa táto kategória neuplatňuje.

Nefunkčný zdroj je vážna porucha. Na serveri s 8 grafickými procesormi a duálne ATX zdroje v konfigurácii s delenými koľajnicami, porucha zdroja nie rovnaká redundancia. Zdroj PSU A napája GPU 0–3, zdroj PSU B napája GPU 4–7. Výpadok zdroja PSU B a štyri GPU zmiznú na XID 79 v priebehu milisekúnd. Obnova znamená fyzickú výmenu. Skutočná redundancia vyžaduje jednotky CRPS v režime 1+1 hot-swap, čo je zostava serverovej triedy, nie pracovná stanica so spotrebiteľskou GPU.

Zlyhania zápisu do úložiska počas kontrolného bodu

Menej časté, ale bolestivé. Úloha beží desať hodín, dosiahne kontrolný bod a zápis zlyhá, pretože NFS server je plný, lokálny NVMe prekročil svoju alokáciu DWPD a prechádza do režimu iba na čítanie, bol dosiahnutý limit inódov alebo boli zmenené povolenia. Poškodenie je úmerné intervalu kontrolných bodov; ak ho zachytíte iba na ďalšie pokusom môžete stratiť hodinu alebo viac.

Pomalé úniky ECC

Tichý zabijak. GPU začne vysielať XID 92 (jednobitový ECC) raz týždenne, potom denne a nakoniec každú hodinu. Každá udalosť je „zadržaná“ a úloha pokračuje, ale presnosť sa znižuje a strata tréningu pomaly smeruje nahor. Kým si to niekto všimne, stovky stránok sú už vyradené z prevádzky a karta smeruje k XID 48. Preto je monitorovacia sekcia dôležitejšia ako sekcia obnovy.

Detekcia – na čo sa pozerať

Tri vrstvy: úroveň jadra (riadky XID v dmesg), dodávateľ GPU (exportér DCGM do Prometheus, dcgmi diag pre aktívne kontroly) a na úrovni frameworku (watchdog PyTorch, vyrovnávacia pamäť sledovania NCCL, upozornenia na stratu/priepustnosť).

Dôležité upozornenia:

  • Každý XID 48 / 63 / 79 / 92 riadok v dmesg → strana
  • Teplota GPU > 85 °C dlhšie ako 5 minút → strana
  • Zvyšovanie počtu volatilných chýb ECC → tiket, nie stránka
  • DCGM dcgm_thermal_violation nenulové → problém s chladením, skontrolujte prietok vzduchu
  • Tréningová strata sa neznižuje po viac ako 100 krokoch → stojí za to pozrieť

Príklady reálnych protokolov zlyhaní

Čo v skutočnosti vidíte v journalctl -k keď sa aktivuje XID 79 (RTX 5090, kábel riser sa vycúval v dôsledku tepelného cyklovania):

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.

Ako vyzerá skrátený časový limit NCCL:

[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'

Hlási to poradie 3, ale poradie 3 takmer nikdy nie je skutočným problémom. Pomalé poradie je to, ktoré nedorazilo. Vyrovnávacia pamäť sledovania NCCL ukladá, ktoré poradia boli blokované pri ktorom volaní – takto nájdete skutočného vinníka.

Vzory zotavenia

Kontrolujte dostatočne často, aby bol reštart lacný

Pre 7B jemné doladenie na 8× RTX 5090 s lokálnymi NVMe kontrolnými bodmi: ~14 GB zapísaných rýchlosťou ~3 GB/s ≈ 5 s na kontrolný bod, každých 30 minút je to 0.3 % réžia a strata v najhoršom prípade je 15 minút. Pre 70B FSDP segmentovaný kontrolný bod na tom istom zariadení: ~140 GB rozdelených na 8 GPU paralelne, podobná réžia. Lacné, urob to.

Kompletný predtréningový kontrolný bod Llama-70B cez sieťové úložisko beží na približne 520 GB a môže trvať viac ako 20 minút; práve tu obchody triedy Meta zavádzajú asynchrónne stupňovité kontrolné body (rýchly lokálny zápis, pomalé vyprázdňovanie do trvalého úložiska). Pri veľkosti Kentina: kontrolný bod každých 15–30 minút do lokálneho NVMe, synchronizácia do NAS na konci behu. Čokoľvek prepracovanejšie je prehnané inžinierstvo.

Automatický reštart s torchelastic

torchrun podporuje elastický tréning hneď po vybalení z krabice:

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

s TORCH_NCCL_ASYNC_ERROR_HANDLING=1, reťazec je: NCCL kolektív sa zasekne → PyTorch watchdog vyvolá → proces sa predčasne ukončí pomocou SIGABRT → torchelastic ukončí súrodenecké ranky a reštartuje od latest_checkpoint.ptCelková sekvencia trvá zvyčajne 60 – 120 sekúnd. Prechodné záblesky sa vyskytujú. Trvalá chyba (GPU prešla na XID 79) spáli... --max-restarts rozpočet a potom je v procese zapojený človek.

Prevádzková prax

Najväčším faktorom ovplyvňujúcim náklady na zlyhanie nie je kód obnovy – je to to, čo robíte pred práca začína.

Predletové kontroly

Pred spustením čohokoľvek, čo bude bežať dlhšie ako niekoľko hodín, spustite overovaciu sekvenciu:

# 1. Per-GPU stress test — catches silent thermal/ECC issues
gpu-burn 600                        # 10 minutes per GPU at full load

# 2. DCGM diagnostic — finds latent hardware faults
sudo dcgmi diag -r 3                # level 3 = thorough, ~15 min

# 3. NCCL fabric test — validates inter-GPU bandwidth on the box
mpirun -np 8 ./build/all_reduce_perf -b 8 -e 1G -f 2 -g 1

# 4. PyTorch dry-run — one step, full batch size, all ranks
torchrun --nproc-per-node=8 dryrun.py
Kontrola úlovky
gpu-burn Tepelné škrtenie, tiché chyby ECC, ktoré sa zobrazujú iba pri záťaži
dcgmi diag Regresie šírky prepojenia PCIe, problémy s napájaním, chyby pamäte, NVLink
nccl-tests Zlý riser, pomalá linka PCIe, poškodený mostík NVLink, nesprávne nakonfigurovaný prepínač
skúšobná prevádzka OOM, chyby v kóde, zaseknutie zavádzača dát, nesprávny tokenizátor

Na čistom serveri s 8× RTX 5090, all_reduce_perf by sa mala pohybovať v rozsahu šírky pásma zbernice 50 – 80 GB/s v závislosti od topológie PCIe. Výrazne nižšia hodnota znamená problém s rozširujúcou platformou alebo topológiou – opravte ho pred tréningom. Ako súčasť predbežného testovania kvality na každej zostave, ktorá opúšťa Kentino, spúšťame gpu-burn celú hodinu.

Dávajte si pozor na pomalé úniky

Reálne kódové bázy akumulujú pamäť: hook logovania obsahuje referenciu tenzora, cesta výnimky zabudne vymazať vyrovnávaciu pamäť, plánovač LR unikne uzáver. Výsledkom je OOM v kroku 5000 z 10 000-krokového behu. Najlacnejšie zmiernenie: print torch.cuda.memory_allocated() každých N krokov do tréningového denníka. Ak rastie, nemalo by to tak byť.

Štatistická realita na úrovni Kentina

Tu je dôležité byť úprimný ohľadom veľkosti. Miera zlyhania sa zvyšuje s počtom hodín načítania grafických kariet (GPU); veľké klastre zlyhávajú neustále, pretože majú veľa GPU spustených mnoho hodín.

konfigurácia Hodiny GPU/mesiac Očakávané udalosti týkajúce sa hardvéru/mesiac
Jedna pracovná stanica, 4 GPU 2,880 ~0.05 – t. j. jeden každé 1 – 2 roky
Jeden server, 8 GPU 5,760 ~0.1 – raz ročne pri intenzívnom používaní
Malý klaster, 32 GPU 23,040 ~0.5 — raz za 2 mesiace
Malý klaster, 32 GPU 24/7 Plný pracovný cyklus ~1/mesiac
Hyperškálovateľnosť, 16 384 GPU ~12 miliónov 232/mesiac (Meta Llama 3)

Odhady kalibrované podľa metadát (jedno zlyhanie na približne 50 000 pozorovaných hodín GPU). Skutočné čísla sa líšia podľa modelu GPU – spotrebiteľské 4090 a 5090 s rozširujúcimi kartami zlyhávajú častejšie ako dátové L40 v natívnom šasi, najmä kvôli opotrebovaniu PCIe a napájacích konektorov.

Ponaučenie: pri jednom uzle s 8 GPU očakávajte jednu hardvérovú udalosť za rok intenzívneho používania, nie za týždeň. Väčšina jemných doladení sa dokončí bez akýchkoľvek problémov. Zákazníci, ktorí ich zaznamenajú, nepretržite vykonávajú tréning a dominantným režimom poruchy je strana rozširujúcej karty/napájacieho zdroja, nie kremík GPU.

Náklady na reštart

Náklady na reštart sa skladajú z strateného času školenia plus času diagnostického technika. Pri zostave s 8× RTX 5090 za napríklad 300 €/deň s amortizáciou je ďalších 30 minút 6 €. Čas technika na diagnostiku, opätovné umiestnenie kábla a reštartovanie je jedna až tri hodiny. Strata výpočtového výkonu je chyba zaokrúhľovania; práca je nákladom. Preto je správnou investíciou monitorovanie a predbežná príprava, nie exotická infraštruktúra na obnovu.

Väčšina online obsahu o riešení zlyhaní je napísaná pre hyperscale úroveň. Pri veľkosti Kentino je väčšina z toho prehnaná. Pravidlo 80/20 je: monitorovanie protokolov jadra, kontrolný bod pre lokálny NVMe, nastavenie TORCH_NCCL_ASYNC_ERROR_HANDLING=1Pred veľkými úlohami spustite gpu-burn.

Čo urobiť ďalej

Ak prevádzkujete multi-GPU box v Kentino mierke, konkrétne kroky:

  1. Nastavenie exportéra DCGM + minimálne upozornenie Prometheus pri chybách ECC a teplotných porušeniach. Pol dňa; zachytí 80 % pomaly sa vyskytujúcich hardvérových problémov.
  2. pridať TORCH_NCCL_ASYNC_ERROR_HANDLING=1 a --max-restarts=3 k vášmu dnešnému spúšťaciemu skriptu. Nulová námaha, zabraňuje zaseknutiu cez noc.
  3. Vyberte interval kontrolných bodov podľa dĺžky úlohy. Menej ako 2 hodiny: neobťažujte sa. 2–24 hodín: každých 30 minút na lokálny NVMe. Viacdňový režim: každých 15 minút s pravidelnou synchronizáciou do trvalého úložiska.
  4. beh gpu-burn a dcgmi diag -r 3 po dodaní, pred prvým skutočným pracovným zaťažením. Zachytáva karty DOA a poškodenia pri preprave. Opakujte štvrťročne.
  5. Predtým, ako začnete viniť grafickú kartu, si prečítajte články o rozširujúcej konštrukcii a zdroji. Na spotrebiteľských serveroch s grafickými kartami sú rozširujúca lišta a lišta zdroja zdrojom porúch dvakrát častejšie ako výpadok grafickej karty.

Sprievodné články: K02 (distribuované formáty školení a kontrolných bodov), K04 (klastrové úložisko), N06 (disekcia latencie).


Toto je súčasť Kentino Wiki, referenčnej série o umelej inteligencii, robotike a systémoch, ktoré ich spájajú. Komentáre a opravy sú vítané na info@kentino.com.