Proč trénovat hluboké modely na GPU
Trénování hlubokých neuronových sítí je výpočetně náročné kvůli rozsáhlým maticovým a algebraickým operacím a vysokým nárokům na propustnost paměti. GPU (Graphics Processing Unit) poskytují tisíce paralelních jader, vysokou paměťovou propustnost a akcelerované knihovny (cuDNN, cuBLAS, NCCL), což oproti CPU zásadně zkracuje dobu trénování. Moderní GPU navíc obsahují specializované akcelerační jednotky (Tensor Cores) optimalizované pro smíšenou přesnost (FP16/BF16) a maticové operace, které dominují dopřednému průchodu i zpětnému šíření chyby.
Architektura GPU a její dopady na trénování
- Masivní paralelismus: tisíce vláken organizovaných do warpů a bloků; efektivita roste s velkými, pravidelnými maticemi.
- Paměťová hierarchie: globální paměť (HBM/GDDR), L2 cache, sdílená paměť, registry. Klíčový je sloučený přístup k paměti (coalesced access) a minimalizace přístupů do globální paměti.
- Tensor Cores: akcelerace operací FMA pro FP16/BF16/TF32; vyžadují správné rozměry dlaždic (tile) a rozložení dat (NHWC/NCHW).
- Propojovací infrastruktura: PCIe, NVLink, NVSwitch – omezuje škálování mezi GPU (komunikaci gradientů/parametrů).
Výběr datového typu: FP32, TF32, FP16, BF16 a INT8
- FP32: referenční přesnost, vyšší nároky na výpočetní výkon a paměť.
- TF32 (na vybraných GPU): kompromis mezi FP16 a FP32 pro trénování konvolučních sítí/MLP bez zásahů do kódu.
- FP16 s škálováním ztráty (loss scaling): kvůli podtečení (underflow) vyžaduje škálování ztráty (statické/dynamické); na Tensor Cores nabízí výbornou propustnost.
- BF16: širší exponent než FP16, stabilnější numerické výpočty bez škálování ztráty; často se upřednostňuje pro LLM.
- INT8/INT4: primárně pro inferenci; při trénování se využívá trénování s ohledem na kvantizaci (quantization-aware training) nebo QLoRA pro dolaďování modelu.
Smíšená přesnost (AMP) v praxi
AMP (Automatic Mixed Precision) kombinuje FP16/BF16 pro výpočetně náročné části a FP32 pro akumulaci gradientů. Výsledkem je vyšší propustnost a nižší spotřeba paměti. Příklad (PyTorch):
<!-- ilustrativní pseudo-HTML (neprovádí se) --> with autocast(dtype=bf16): y = model(x) loss = criterion(y, t) scaler.scale(loss).backward() scaler.step(optim) scaler.update() optim.zero_grad(set_to_none=True)
Datové pipeline: CPU ↔ GPU bez prodlev
- Připnutá paměť (pinned/page-locked memory) a asynchronní přenosy přes DMA s nastavením
non_blocking=True. - Přednačítání (prefetching) a více workerů v DataLoaderu (vyvážení I/O a dekomprese na CPU).
- Komprese a formáty: binární formáty (WebDataset/TFRecord), dělení dat do shardů (sharding), ukládání do mezipaměti (caching) v RAM/Redis; minimalizace náhodných I/O operací.
- GPUDirect Storage/RDMA (je-li k dispozici) ke snížení latence a zapojení CPU.
Optimalizace využití paměti
- Gradient checkpointing (přepočítávání aktivací) – výměna části výpočtu za nižší nároky na paměť.
- FSDP/ZeRO – rozdělení parametrů, gradientů a stavů optimalizátoru mezi GPU.
- Sloučené operace (fused operations) (LayerNorm+MatMul+Bias+GELU) – méně průchodů pamětí, vyšší efektivita.
- Stavy optimalizátoru: 8bitový Adam, Adafactor nebo přesun do CPU/NVMe.
- Přiměřená velikost batch + akumulace gradientů (gradient accumulation) pro dosažení efektivní velikosti batch bez překročení kapacity VRAM.
Paralelizace: data, model, tensor, pipeline
- Paralelizace podle dat (DDP): replikace modelu, rozdělení batch mezi GPU; synchronizace gradientů přes NCCL AllReduce.
- Paralelizace modelu: rozdělení vrstev/parametrů mezi GPU (pipeline parallel, tensor/sliced parallel – např. Megatron).
- Hybridní schémata: kombinace DP+TP+PP pro velmi velké modely (LLM, rozsáhlé vision transformery).
- Překrývání operací: překrytí komunikace s výpočtem (seskupování gradientů do bloků, kolektivní operace asynchronně).
Distribuované trénování a knihovny
- NCCL (NVIDIA Collective Communications Library) – kolektivní operace (AllReduce, AllGather, ReduceScatter) přes NVLink/PCIe.
- PyTorch DDP/FSDP, DeepSpeed ZeRO, Horovod, JAX pjit/pmap – různé modely paralelizace a správy paměti.
- Elastické trénování a odolnost proti chybám: obnovení z checkpointu, škálování bez bariér (barrierless), práce se spot instancemi.
Trénování velkých jazykových modelů (LLM) a vision transformerů
- Stabilita: BF16, architektury pre-norm, ořezávání gradientů, správná inicializace (µ, σ) a plánování LR podle křivky cosine.
- Efektivní dolaďování modelu: LoRA/QLoRA (adaptéry s nízkou hodností), prefix tuning – úspora paměti a vyšší rychlost.
- Tokenizace a sekvence: FlashAttention/SDPA pro škálování na dlouhé sekvence, implementace sloučených kernelů.
Plánování trénování: velikost batch, LR, warmup, regularizace
- Lineární škálování LR podle efektivní velikosti batch (Goyal et al.) + warmup pro stabilní začátek.
- Plánovač: cosine decay, OneCycle, exponenciální pokles; sledování stagnace ztrátové funkce (loss plateaus).
- Regularizace: weight decay, dropout, label smoothing; stochastic depth u transformerů.
Profilování a ladění výkonu
- Profiler (PyTorch Profiler, Nsight Systems/Compute): identifikace úzkých hrdel (doba běhu kernelů, propustnost paměti, synchronizace mezi hostitelem a zařízením).
- CUDA Graphs: snížení režie spouštění kernelů u stabilních výpočetních grafů.
- Slučování kernelů (kernel fusion) a knihovny (heuristiky cuDNN, CUTLASS, Triton) – výběr algoritmů GEMM/conv, automatické ladění.
- I/O a augmentace: augmentace přímo na zařízení, mixup/cutmix s minimální režií.
Správa checkpointů a obnova po pádu
- Úplné checkpointy: parametry, stavy optimalizátoru, plánovač LR, stavy RNG pro reprodukovatelnost.
- Rozdělení checkpointů do shardů při použití FSDP/ZeRO; asynchronní ukládání checkpointů do objektového úložiště.
- Interval ukládání: podle MTBF clusteru a nákladů na ztrátu odvedené práce; kombinace posledních a „dlouhodobých“ checkpointů.
Reprodukovatelnost a numerická stabilita
- Nastavení seedů (knihovny CPU/GPU), deterministické varianty kernelů (za cenu nižšího výkonu), kontrola nedeterminismu (AtomicAdd, race conditions).
- Přesná akumulace: akumulace gradientů ve FP32, ořezávání gradientů, škálování ztráty u FP16.
- Kontrola anomálií (hooky pro NaN/Inf), automatické vynechání batch obsahujících NaN.
Bezpečnost, správa dat a soukromí
- Šifrování dat v klidu i při přenosu, řízení přístupu k datasetům a modelům, audit přístupů.
- Diferenciální soukromí (DP-SGD) pro trénování s ochranou soukromí, federované učení s agregací gradientů.
- Kvalita dat: detekce otrávení dat/změny štítků (poisoning/label flipping), robustní validace a kontrola driftu.
Ekonomika a udržitelnost trénování
- Poměr nákladů a výkonu: výběr GPU (kapacita HBM, NVLink), využití clusteru, spot instance s ukládáním checkpointů.
- Energetická účinnost: smíšená přesnost, slučování kernelů, využití chladnějších datacenter, dávkové plánování.
- Green AI: metriky CO2 na epizodu/epochu, předčasné zastavení (early stopping), optimalizace hyperparametrů (hyperparameter optimization) s využitím ASHA/BOHB.
Praktické vzory (patterns) pro velké projekty
- Jeden uzel, více GPU: DDP + AMP + akumulace gradientů; sdílená mezipaměť NVMe pro data.
- Více uzlů: DDP s NCCL přes InfiniBand; FSDP/ZeRO pro obří modely; překrývání komunikace a výpočtu.
- Dolaďování LLM/Vision: BF16 + LoRA/QLoRA, FlashAttention, 8bitový optimalizátor; robustní tokenizér a dělení dat do shardů.
- Optimalizace doby potřebné k dosažení požadované přesnosti (time-to-accuracy): warmup LR, správný plánovač, intenzivní využití AMP, profilování každé fáze.
Kontrolní seznam před spuštěním trénování
- Funguje pipeline plynule bez prodlev? (pinned memory, prefetch, dostatečné I/O)
- Je aktivní AMP (BF16/FP16) a je správně nastaveno škálování ztráty?
- Je u modelu aktivní gradient checkpointing a jsou použity sloučené operace tam, kde to dává smysl?
- Je zvolen správný režim paralelizace (DDP/FSDP/ZeRO/PP/TP) a bylo otestováno škálování?
- Jsou k dispozici pravidelné checkpointy a byl otestován postup obnovy? (nácvik obnovy po havárii)
- Bylo provedeno profilování (Nsight/Profiler) a byla odstraněna úzká hrdla?
- Jsou data zabezpečena (ACL, šifrování) a je nastaven audit přístupů?
Časté chyby a jak se jim vyhnout
- Nedostatečné využití GPU kvůli I/O – řešením je přednačítání, dělení dat do shardů a pinned memory.
- Explodující gradienty – ořezávání gradientů, lepší normalizace, správná inicializace.
- Numerická nestabilita ve FP16 – použít BF16 nebo přesnou akumulaci a správné škálování ztráty.
- Nesprávná komunikace mezi GPU – chybějící překrývání komunikace s výpočtem, nevhodná velikost bucketů, nedostatečně výkonná propojovací infrastruktura.
- Neúplné checkpointy – vždy ukládat také stavy optimalizátoru a RNG.
Závěr
Trénování hlubokých modelů na GPU spojuje správnou volbu numerické přesnosti, efektivní práci s pamětí, vyspělé datové pipeline a škálování komunikace napříč mnoha GPU a uzly. Úspěch závisí na systematickém profilování, vhodném schématu paralelizace (DDP/FSDP/ZeRO/PP/TP), disciplinovaném ukládání checkpointů a bezpečném nakládání s daty. Při dodržení těchto principů lze výrazně zkrátit dobu potřebnou k dosažení požadované přesnosti (time-to-accuracy), snížit náklady a dodat modely, které jsou výkonné, stabilní a připravené k nasazení v produkci.
