Pitva latencie: kam sa v sieti AI klastra stráca každá mikrosekunda

Kto dimenzuje siete pre AI klastre, začína zvyčajne pri šírke pásma — 100, 200, 400 GbE — a potom ho prekvapí, že jeho allreduce benchmark vypíše číslo ani zďaleka nie na úrovni linkovej rýchlosti. Dôvodom je takmer vždy latencia a režim krátkych správ, v ktorom sú grafy šírky pásma nanič.

Tento článok rozoberá jedinú obrátku na súčiastky a vyúčtuje každý krok. Čísla nižšie sú konsenzuálnym rozsahom z verejných meraní, dokumentácie NVIDIA/Mellanox a z našich vlastných testov. Berte ich ako rozpočet, nie ako záruku — menia sa s kremíkom sieťovej karty, ASIC prepínača, verziou jadra, nastaveniami BIOS a tým, ako trpezlivo ladíte.

Pre koho to je: pre tých, čo navrhujú alebo riešia problémy sieťových štruktúr AI klastrov. Nie je to kuchárka na ladenie, ale myšlienkový model, vďaka ktorému sa taká kuchárka dá čítať.

Celá obrátka na jednej snímke

Ping-pong so 64 bajtmi medzi dvoma GPU na rôznych uzloch, cez prepínanú štruktúru 100 GbE s RDMA, sa zhruba rozpadá takto:

Zložka Typický príspevok Poznámky
Odoslanie a serializácia v aplikácii 0,1–1 µs memcpy, zostavenie hlavičky, zápis deskriptora
Cesta TX na sieťovej karte (RDMA verbs) 0,3–0,8 µs pod 1 µs na moderných ConnectX / BlueField
Oneskorenie na vedení ~5 ns/m 50 ns na 10 m DAC, pod 100 m zanedbateľné
Prechod prepínačom (cut-through, moderný) 250–600 ns InfiniBand <100 ns; Ethernet 400–600 ns
Prechod prepínačom (store-and-forward, 64 B) 1–3 µs Navrch pripočítajte serializáciu na bajt
Každý ďalší skok +latencia prepínača Leaf-spine pridáva 2 skoky oproti jednému prepínaču
Cesta RX na sieťovej karte 0,3–0,8 µs Pri RDMA symetrická s TX
Kernelový zásobník TCP/IP (jedným smerom) 10–30 µs Cesta cez sokety; s prerušeniami a kopírovaním
Obídenie jadra (DPDK / RDMA verbs, jedným smerom) <1 µs Polling v user space, bez kopírovania
Príjem a deserializácia v aplikácii 0,1–1 µs Zobudiť konzumenta, dekódovať hlavičku

RTT cez RDMA na jedinom prepínači pri 100 GbE / NDR InfiniBand vychádza pre krátke správy na ~2 µs. Dvojskoková leaf-spine pridá ~1 µs. Tá istá cesta cez kernelové TCP/IP vychádza na 20–60 µs, teda o rád viac, a s horším správaním v chvoste. Tieto dve čísla poháňajú takmer každé architektonické rozhodnutie nižšie.

App TX
memcpy, deskriptor
0,1–1 µs
→NIC TX
Prepínač
cut-through
250–600 ns
→NIC RX
App RX
dekódovanie, zobudenie konzumenta
0,1–1 µs

Jednosmerná cesta cez RDMA: prechod prepínačom (250–600 ns na Ethernete, <100 ns na IB) je dominantnou premennou; oneskorenie na vedení je pod 100 m zanedbateľné.

Vedenie nie je problém

Svetlo sa vo vlákne šíri asi dvojtretinovou rýchlosťou c, takže šírenie trvá ~5 ns/m. 30 m vlákna cez rad rackov pridá 150 ns jedným smerom; aj 500 m areálový spoj je jedna mikrosekunda. Pri dnešných rýchlostiach je malá aj serializácia: 64-bajtový rámec na 100 Gb/s trvá 5,12 ns, 9000-bajtový jumbo rámec 720 ns. Pri krátkych riadiacich správach je serializácia zanedbateľná; pri hromadných prenosoch prestane hrať rolu, len čo je potrubie dosť široké.

Latencia žije v softvéri, v ASIC prepínačov a v protokole, ktorý si zvolíte.

Sieťová štruktúra: cut-through verzus store-and-forward

Cut-through prepínač začne preposielať hneď, ako prečíta cieľovú hlavičku. Store-and-forward prepínač odloží celý rámec do vyrovnávacej pamäte, voliteľne overí CRC a až potom preposiela.

Trieda prepínača Latencia na skok
InfiniBand NDR/HDR prepínač (cut-through) <100 ns
Ethernet cut-through (trieda Tomahawk, AI štruktúra) 400–600 ns
Ethernet cut-through (starší / bežný) 600–900 ns
Ethernet store-and-forward, 64 B 1–3 µs
Ethernet store-and-forward, 1500 B 1,5–4 µs

Náskok InfiniBandu je reálny: kremík pre HPC sa na toto optimalizuje už dve desaťročia. Moderné ethernetové AI prepínače (Tomahawk 5, Jericho3-AI, Spectrum-X) väčšinu latenčného rozdielu dotiahli a InfiniBand prekonávajú hĺbkou vyrovnávacích pamätí, čo pri incaste v allreduce váži viac.

V leaf-spine prejde tok medzi rackmi cez leaf → spine → leaf. Návrhy, ktoré minimalizujú počet skokov (plytký fat-tree, rail-optimized topológie), sa nesnažia ušetriť šírku pásma; šetria 500 ns za každý nevykonaný skok pri každej kolektívnej operácii.

Sieťový zásobník jadra

Obyčajné TCP/IP cez linuxové jadro platí za každý paket: obsluha prerušenia sieťovej karty (alebo polling cez NAPI), alokácia skb a softirq, spracovanie TCP/IP, kopírovanie medzi vyrovnávacou pamäťou soketu v jadre a user space a prepnutie kontextu do aplikácie.

Pri malom pakete na modernom x86 je to v najlepšom prípade 10–30 µs jedným smerom, so špičkami v chvoste nad 100 µs pri záťaži. Je to aj limitované procesorom — jadro CPU vyťaží pri ~1 Mpps dávno pred sieťovou kartou. Práve túto réžiu sa zvyšok článku snaží odstrániť.

Obídenie jadra: DPDK, RDMA, XDP, AF_XDP

Štyri bežné spôsoby, ako dostať jadro z dátovej cesty, líšia sa mierou obídenia aj tým, čo nechávajú ležať:

Cesta Dolná hranica latencie Model využitia CPU Kompatibilita Typické použitie
Kernelové TCP/IP 10–30 µs/smer Prerušenia Univerzálna Všetko, kde latencia nie je kritická
AF_XDP 6–10 µs/smer Hybridný Linuxové nástroje fungujú ďalej Stredná cesta; programy eBPF
DPDK 1–3 µs/smer Busy poll Jadro nevidí nič Telco, HFT, NFV, vlastné paketové linky
RDMA verbs <1 µs/smer Queue pair / CQE Vyžaduje RDMA kartu + štruktúru HPC, tréning AI, sieťové úložiská

Niekoľko praktických poznámok:

  • DPDK a RDMA nie sú zameniteľné. DPDK spúšťa ľubovoľné spracovanie paketov v user space pri linkovej rýchlosti; RDMA implementuje konkrétny pamäťovo-sémantický protokol s hardvérovým offloadom. AI workloady chcú RDMA — NCCL aj úložné zásobníky ním hovoria natívne. DPDK sa objavuje v inferenčných proxy, telemetrii a vlastných dátových rovinách.
  • AF_XDP je stredná cesta. Zavesí sa na ovládač na vrstve eBPF, dosiahne latenciu pod 10 µs a na rozdiel od DPDK neukradne sieťovú kartu operačnému systému. Správna odpoveď pre stroje so zmiešaným využitím.
  • XDP bez AF_XDP slúži na inline zahadzovanie, presmerovanie a preposielanie (čistenie DDoS, load balancery). Spracúva pakety priamo v jadre na háku ovládača a nepresúva ich do user space.

Pre AI klaster: RDMA cez InfiniBand alebo RoCEv2 pre komunikáciu GPU s GPU, obyčajné TCP/IP na všetko ostatné (správa, telemetria, sťahovanie modelov). Pomalé cesty neprekombinujte.

Interrupt coalescing, GRO/LRO: pasca priepustnosti

Linux aj väčšina ovládačov sieťových kariet prichádzajú naladené na priepustnosť, nie na latenciu. Dôležité sú dva parametre:

  • Interrupt coalescing. Sieťová karta pred vyvolaním prerušenia počká nastavené okno v µs (alebo určitý počet paketov). Znižuje réžiu na paket, no pridáva latenciu v dĺžke okna. rx-usecs 50 pridá na tichom spoji až 50 µs.
  • GRO / LRO. Jadro (GRO) alebo karta (LRO) zlučuje prichádzajúce TCP segmenty do jedného väčšieho skb, než ich pošle vyššie. Spracovanie je lacnejšie, ale agregátor zámerne čaká na ďalšie pakety, čím pridáva mikrosekundy.

Kompromis je poctivý a nevyhnutný: špičkovú priepustnosť a špičkovú latenciu na tej istej konfigurácii mať nemôžete. Pri GPU uzle chce RDMA karta obsluhujúca allreduce rx-usecs 0 alebo 1, vypnuté adaptívne coalescing a vypnuté GRO na rozhraní na strane RDMA. Samostatná manažmentová karta si ponechá predvolené hodnoty; nie je na kritickej ceste.

Z toho plynie: karta, ktorá robí zároveň RDMA kolektívy aj TCP sťahovanie, bude mať priemerné čísla v oboch disciplínach, pokiaľ prevádzku nerozdelíte medzi fronty alebo rozhrania. Seriózne AI uzly majú jednu alebo dve vyhradené RDMA karty (ConnectX-7/8, BlueField-3) a k tomu samostatnú kartu na správu.

Ani aplikačná vrstva nie je zadarmo

Dve položky na vrchole zásobníka sa do architektonických schém dostanú len málokedy:

  • memcpy. memcpy so 4 MB trvá na jednom jadre pri ~20 GB/s zhruba 200 µs. Ak Vaša kolektívna operácia kopíruje dáta tenzora do odkladacej vyrovnávacej pamäte pred odoslaním, spálili ste viac času než celá sieťová obrátka. GPUDirect RDMA tento krok preskočí — karta číta priamo z pamäte GPU.
  • Serializácia. Protobuf, JSON či vlastné rámcovanie pridá pri netriviálnych dátach desiatky µs. V riadiacom RPC je to v poriadku, vo vnútornej slučke allreduce smrteľné. NCCL sa tomu vyhýba pevnými binárnymi deskriptormi a vopred registrovanou pamäťou.

Ak je Váš „na RDMA naladený“ zásobník stále pomalý, skôr než budete viniť sieťovú štruktúru, sprofilujte user space. Videli sme 30 µs kolektívy, kde 25 µs bola zmena tvaru tenzora v PyTorchi a len 5 µs vedenie a prepínač.

Kolektívne operácie: latencia verzus šírka pásma a prečo záleží na veľkosti paketu

NCCL (a každá knižnica kolektívov) volí algoritmus podľa veľkosti správy:

  • Krátke správy sú limitované latenciou. NCCL používa stromové algoritmy a svoj protokol LL (4 bajty dát so 4 bajtmi príznakov cez 8-bajtové atomické zápisy, bez pamäťových bariér). BusBw je zlomkom linkovej rýchlosti; meriate réžiu na správu × počet správ.
  • Dlhé správy sú limitované šírkou pásma. NCCL prepne na kruhové algoritmy, ktoré sa blížia linkovej rýchlosti najpomalšieho spoja. Latencia na správu zmizne pod megabajtmi.

Prechod leží zhruba medzi 64 KB a 1 MB podľa topológie a sieťovej karty. Pod ním dominuje latencia prepínača a karty a protokolový zásobník. Nad ním z grafu čítate rýchlosť vedenia.

Allreduce busbw — klastre H100 / NDR InfiniBand v jednom racku
Veľkosť správy Algoritmus BusBw (jeden uzol, 8× NVLink) BusBw (8 uzlov, NDR IB)
1 KB Tree / LL ~5 GB/s ~2 GB/s
64 KB Tree ~80 GB/s ~20 GB/s
1 MB Ring ~250 GB/s ~40 GB/s
64 MB Ring ~370 GB/s ~45 GB/s
1 GB Ring ~450 GB/s ~48 GB/s

Publikovaný strop NVLinku na H100 je 450 GB/s; dostať sa k nemu pri menších správach alebo naprieč uzlami je boj o ladenie. Pri sortimente Kentino — 5090 / 4090 / RTX Pro 6000 Blackwell cez 100 GbE RoCE — čakajte pri dlhých správach busbw okolo 10–12 GB/s na uzol pri 100 GbE, s rovnakým tvarom algoritmu.

Rozptyl je horší než latencia

Ak je latencia allreduce na každom uzle 30 µs ± 1 µs, bariéra čaká 30 µs. Ak je priemer 30 µs, no jeden uzol raz za tisíc iterácií vyskočí na 300 µs, všetky ostatné GPU zakaždým stoja 270 µs. Naprieč epochou so 100k iteráciami na 16 uzloch sú to hodiny stratených výpočtov.

Preto je pri tréningu AI dôležitejšia latencia P99 / P999 než priemer. Bariérová kolektívna operácia je operácia, kde vyhráva najpomalší: klaster sa pohybuje rýchlosťou svojho najhoršieho uzla.

Zdroje rozptylu:

  • Zahltenie vyrovnávacích pamätí pri incaste. AllReduce je v každej iterácii operáciou mnohí k jednému. Prepínače s plytkými vyrovnávacími pamäťami zahadzujú pakety, nastúpi pauza PFC a latencia vyskočí 10×–100×. Hlboko bufferované AI prepínače (Jericho3-AI, Spectrum-X) nápor pohltia.
  • Rozptyl na CPU hostiteľa. Úloha v cron, neohraničené vlákno jadra alebo výkyv frekvencie CPU vyrobia odľahlú hodnotu 1 ms. Vyhraďte jadrá pre ISR/polling vlákno sieťovej karty, vypnite C-stavy na kritických CPU, procesy pripnite.
  • Adaptívne coalescing. Ovládač „pomáha“ tým, že pri záťaži coalescing zvyšuje; latencia potichu vyskočí. Na RDMA karte ho výslovne vypnite.
  • Asymetria topológie. Jeden leaf na 200 GbE, druhý na 100 GbE. Ten pomalší je Vaším stropom pre každú kolektívnu operáciu.

Správnym SLO pre AI sieťovú štruktúru je latencia v chvoste, nie priemerná latencia.

Ako to merať správne

ping meria RTT ICMP cez kernelový zásobník na manažmentovej rovine. Na charakterizáciu RDMA štruktúry je nanič. Nástroje, ktoré fungujú:

  • sockperf ping-pong — latencia UDP/TCP s rozlíšením pod nanosekundu. Dobré na základné hodnoty kernelového zásobníka a na odhaľovanie regresií.
  • ib_send_lat, ib_write_lat (sada perftest) — priamo latencia RDMA verbs. Číslo, na ktorom Vám pri InfiniBande a RoCE naozaj záleží. Na spoji cez ten istý prepínač čakajte ~1–2 µs.
  • Mikrobenchmarky OSU — osu_latency, osu_bw, osu_allreduce na úrovni MPI. Správny nástroj pre HPC aplikácie, kým do hry vstúpi NCCL.
  • nccl-tests — all_reduce_perf, all_gather_perf, reduce_scatter_perf. Jediný benchmark, ktorý pri tréningu AI naozaj niečo znamená. Preveruje presne tú cestu kódu, ktorú používa Váš beh. Preveďte rozsah od 8 B po 1 GB; krivka Vám povie, kde je štruktúra pokazená.

Rýchla kontrola: ak je busbw z nccl-tests all_reduce_perf pri dlhých správach výrazne pod 80 % linkovej rýchlosti karty, máte problém v sieťovej štruktúre, nie v softvéri. Prejdite vrstvy odhora tohto článku nadol.

Užitočný zvyk: výstup z nccl-tests si uložte ako súčasť uvedenia do prevádzky a spustite ho znovu po každej zmene firmvéru, ovládača či topológie. Regresia zachytená v deň, keď vznikla, je jednoriadkový diff. Zachytená o tri týždne neskôr je forenzné cvičenie.

Kedy na latencii naozaj záleží — a kedy nie

Latencia je dôležitá:

  • Synchrónny allreduce gradientov pri dátovo paralelnom tréningu. Každá iterácia, každý uzol. Latencia v chvoste = stratený výpočet.
  • Jemne delený pipeline paralelizmus s malými mikrodávkami. Čas bubliny na hraniciach stupňov je zdola obmedzený latenciou medzi uzlami.
  • Tenzorovo paralelné delenie vrstiev, ktoré sa rozvetví a zase zbehne v rámci jedného dopredného/spätného prechodu — reťazec krátkych kolektívov, čistá hra o latenciu.
  • Komunikácia krokov s parameter serverom pri vysokej frekvencii aktualizácií.

Latencia väčšinou dôležitá nie je:

  • Dávkovanie inferencie na úrovni požiadaviek. Latenciu jednej požiadavky určuje výpočet na GPU (TTFT, dekódovanie na token). 10 µs siete je šum vedľa 50 ms dekódovania.
  • Hromadné načítanie modelu z objektového úložiska pri štarte úlohy. Limituje priepustnosť.
  • Zápis checkpointu na sieťové úložisko. Veľké sekvenčné zápisy, ladí sa na šírku pásma.
  • Premiešanie v DataLoaderi cez prednačítanie vo workeroch. Dávkované, limituje priepustnosť.

Poctivý dôsledok: jednouzlový server so 4 alebo 8 GPU (chlieb a soľ sortimentu Kentino AI) komunikuje medzi GPU cez NVLink alebo PCIe, nie cez sieť. Sieť slúži na úložiská, telemetriu a občasný viacuzlový experiment. Optimalizovať štruktúru na latenciu kolektívov sa vyplatí až pri skutočnom viacuzlovom tréningu, ktorý väčšina zákazníkov Kentina neprevádzkuje. Pre čistú inferenciu a jednouzlový tréning stačí 25 GbE s čistým kernelovým zásobníkom.

Čo robiť ďalej

Ak uvádzate do prevádzky novú sieťovú štruktúru, prejdite túto postupnosť:

  1. ib_send_lat medzi každou dvojicou uzlov. Čokoľvek nad 1,5-násobok mediánu je signál — zlý kábel, znečistená optika, zle smerovaná topológia.
  2. nccl-tests all_reduce_perf naprieč 8 B → 1 GB. Krivku si uložte. Porovnajte ju s publikovanou referenciou pre Vašu sieťovú kartu a triedu prepínača.
  3. Porovnajte TCP sockperf ping-pong s RDMA ib_send_lat. Rozdiel by mal byť 10–30×. Ak je 2×, buď je Váš kernelový zásobník nezvyčajne rýchly (nepravdepodobné), alebo je Vaša RDMA cesta pokazená (pravdepodobné — zlá konfigurácia PFC, zle nastavené DCQCN, RDMA spadnuté na softvérovú cestu).
  4. Spustite nccl-tests pod záťažou. Pustite súbežne prevádzku na úložisko a sledujte, ako busbw klesá. Zdravé klastre pri realistickej zmiešanej záťaži klesnú o <20 %; choré sa zrútia.
  5. Laďte vždy len jednu premennú. Coalescing, adaptívne smerovanie, prahy PFC, značkovanie ECN. Každú zmenu si zapíšte. Zmeňte tri veci naraz a jedna pomôže — a neviete, ktorá.
  6. Alarmujte na latenciu kolektívov v P99, nie na priemer. Priemer problém schová; P99 je to, čo tréning naozaj cíti.

Pokračovania — N07 o smerovaní a riadení zahltenia (ECMP, DCQCN, ECN), N08 o nastavení RDMA v praxi a K02 o voľbe algoritmu distribuovaného tréningu — idú hlbšie do konkrétnych rozhodnutí, ktoré tento článok iba načrtol.

Latencia v AI sieťovej štruktúre nie je vedenie, je to všetko, čo je okolo vedenia omotané — a riešením je takmer vždy skrátiť softvérovú cestu skôr, než miniete viac na hardvér.


Toto je súčasť Kentino Wiki, referenčnej série o AI výpočtoch, robotike a systémoch, ktoré ich prepájajú. Pripomienky a opravy uvítame na info@kentino.com.