Proč trénovat hluboké modely na GPU
Trénování hlubokých neuronových sítí je výpočetně náročné vzhledem k rozsáhlým maticovým a algebraickým operacím a vysokým požadavkům na propustnost paměti. GPU (Graphics Processing Unit) poskytují tisíce paralelních jader, vysokou propustnost paměti a akcelerované knihovny (cuDNN, cuBLAS, NCCL), což zásadně zkracuje dobu tréninku ve srovnání s CPU. Moderní GPU navíc obsahují specializované akcelerační jednotky (Tensor Cores) optimalizované pro smíšenou přesnost (FP16/BF16) a maticové operace, které jsou klíčové jak při dopředném průchodu, tak při zpětné propagaci chyb.
Architektura GPU a její dopady na trénink
- Masivní paralelismus: tisíce vláken organizovaných do warpů a bloků; efektivita roste při práci s velkými, pravidelnými maticemi.
- Hierarchie paměti: globální paměť (HBM/GDDR), L2 cache, sdílená paměť, registry. Klíčový je coalesced access a minimalizace přístupů do globální paměti.
- Tensor Cores: akcelerace operací FMA pro FP16/BF16/TF32; vyžadují správné tile rozměry a datové rozložení (NHWC/NCHW).
- Propojovací fabric: PCIe, NVLink, NVSwitch – tyto linky limitují škálovatelnost mezi GPU při komunikaci gradientů a parametrů.
Výběr datového typu: FP32, TF32, FP16, BF16 a INT8
- FP32: referenční přesnost, vyšší výpočetní a paměťové nároky.
- TF32 (na vybraných GPU): kompromis mezi FP16 a FP32 pro trénink konvolučních sítí a MLP, bez potřeby úprav kódu.
- FP16 s loss scalingem: vyžaduje škálování ztráty (statické nebo dynamické) kvůli riziku podtečení; nabízí velmi vysokou propustnost na Tensor Corech.
- BF16: širší exponent než FP16, stabilnější numerika bez potřeby loss scalingu; často preferovaný datový typ pro velké jazykové modely (LLM).
- INT8/INT4: primárně využívány pro inference; při tréninku se používá quantization-aware training nebo QLoRA pro jemné doladě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 zvýšený throughput 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é trubky: CPU ↔ GPU bez hladovění
- Pinned (page-locked) paměť a asynchronní přenosy přes DMA s parametrem
non_blocking=True. - Prefetching a více workerů v DataLoaderu (vyvážení I/O a CPU dekomprese).
- Komprese a formáty: binární formáty (WebDataset, TFRecord), sharding, caching v RAM/Redis; minimalizace náhodných I/O operací.
- GPUDirect Storage/RDMA (kde je dostupné) pro snížení latencí a zapojení CPU.
Optimalizace využití paměti
- Gradient checkpointing (přepočítávání aktivací) – výměna dodatečných výpočtů za nižší paměťové nároky.
- FSDP/ZeRO – sharding parametrů, gradientů a stavů optimizeru napříč GPU.
- Slučování (fused) operací (LayerNorm + MatMul + Bias + GELU) – méně průchodů pamětí, vyšší efektivita.
- Optimizační stavy: 8-bit Adam, Adafactor nebo offloading do CPU/NVMe.
- Rozumná velikost batch + gradient accumulation pro dosažení efektivního batch bez přetečení VRAM.
Paralelizace: data, model, tensor, pipeline
- Data parallel (DDP): replikace modelu, rozdělení batch mezi GPU; synchronizace gradientů přes NCCL AllReduce.
- Model parallel: rozdělení vrstev nebo parametrů na GPU (pipeline parallel, tensor/sliced parallel – např. Megatron).
- Hybridní schémata: kombinace DP + TP + PP pro velmi velké modely (LLM, vision transformery).
- Overlap: překryv komunikace s výpočtem (bucketizace gradientů, async kolektivní operace).
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.
- Elastic training a fault tolerance: restart z checkpointu, barrierless škálování, práce se spot instancemi.
Výcvik velkých jazykových modelů (LLM) a vision transformerů
- Stabilita: BF16, pre-norm architektury, clipping gradientů, správná inicializace (µ, σ) a cosine plánování učící rychlosti.
- Efektivní fine-tuning: LoRA/QLoRA (low-rank adapters), prefix tuning – úspora paměti a zrychlení.
- Tokenizace a sekvence: FlashAttention/SDPA pro škálování na dlouhé sekvence, fused kernel implementace.
Plánování tréninku: velikost batch, LR, warmup, regularizace
- Lineární škálování učící rychlosti s efektivní velikostí batch (Goyal et al.) + warmup pro stabilní počátek.
- Scheduler: cosine decay, OneCycle, exponenciální decay; monitorování loss plateaus.
- Regularizace: weight decay, dropout, label smoothing; stochastic depth u transformerů.
Profilace a ladění výkonu
- Profiler (PyTorch Profiler, Nsight Systems/Compute): identifikace úzkých hrdel (doba kernelu, propustnost paměti, synchronizace host-device).
- CUDA Graphs: snížení overheadu uvádění do chodu kernelů u stabilních výpočetních grafů.
- Kernel fusion a knihovny (cuDNN heuristiky, CUTLASS, Triton) – volba algoritmů GEMM/conv, autotuning.
- I/O a augmentace: on-device augmentace, mixup/cutmix s minimálním overheadem.
Správa checkpointů a obnova po výpadcích
- Částečné checkpointy: parametry modelu, stavy optimizeru, plánovač učící rychlosti, RNG stavy pro reprodukovatelnost.
- Sharding checkpointů při FSDP/ZeRO; asynchronní checkpointing do objektového úložiště.
- Frekvence ukládání: podle MTBF clusteru a nákladů na ztrátu práce; kombinace posledních a „long-term“ checkpointů.
Reprodukovatelnost a numerická stabilita
- Seedování (CPU/GPU knihovny), deterministické varianty kernelů (za cenu výkonu), kontrola nedeterminismu (AtomicAdd, závody dat).
- Čisté akumulace: FP32 akumulace gradientů, clipping gradientů, loss scaling u FP16.
- Kontrola anomálií (NaN/Inf hooks), automatický nan-skip batch.
Bezpečnost, správa dat a ochrana soukromí
- Šifrování dat v klidu i během přenosu, řízení přístupu k datasetům a modelům, audit přístupů.
- Differential Privacy (DP-SGD) pro trénink s ochranou soukromí, federated learning s agregací gradientů.
- Kvalita dat: detekce poisoning/label flipping, robustní validace a kontrola driftu dat.
Ekonomika a udržitelnost tréninku
- Poměr cena/výkon: výběr GPU (kapacita HBM, NVLink), obsazenost clusteru, spot instance s checkpointingem.
- Energetická efektivita: smíšená přesnost, kernel fusion, využití chladnějších datových center, dávkové plánování.
- Green AI: metriky CO2 na epizodu/epochu, early stopping, hyperparameter optimization pomocí ASHA/BOHB.
Praktické vzory pro velké projekty
- Single node, multi-GPU: DDP + AMP + gradient accumulation; sdílená NVMe cache pro data.
- Multi-node: DDP s NCCL přes InfiniBand; FSDP/ZeRO pro obrovské modely; překrytí komunikace a výpočtu.
- Fine-tuning LLM/Vision: BF16 + LoRA/QLoRA, FlashAttention, 8-bit optimizer; robustní tokenizer a sharding.
- Optimalizace time-to-accuracy: warmup učící rychlosti, správný scheduler, agresivní AMP, profilace každé fáze.
Kontrolní seznam před spuštěním tréninku
- Je pipeline bez hladovění? (pinned memory, prefetch, dostatečný I/O)
- Je aktivní AMP (BF16/FP16) a správný loss scaling?
- Má model aktivní gradient checkpointing a fused operace, kde to dává smysl?
- Je zvolen správný paralelizační režim (DDP/FSDP/ZeRO/PP/TP) a otestováno škálování?
- Existují pravidelné checkpointy a test obnovy? (disaster rehearsal)
- Proběhla profilace (Nsight/Profiler) a jsou odstraněna úzká hrdla?
- Jsou data zabezpečena (ACL, šifrování) a je nastaven audit přístupů?
Časté chyby a jak se jim vyhnout
- Nízké využití GPU kvůli I/O – řeší se přednačítáním, shardingem a pinned memory.
- Explodující gradienty – řeší clipping gradientů, lepší normalizace, správnou inicializací.
- Numerické nestability u FP16 – použít BF16 nebo přesnou akumulaci a správný loss scaling.
- Nesprávná komunikace mezi GPU – chybějící overlap, nevhodná velikost bucketu, slabá fabric.
- Neúplné checkpointy – vždy ukládat i stavy optimizeru a RNG.
Závěr
Trénování hlubokých modelů na GPU kombinuje správnou volbu numerické přesnosti, efektivní práci s pamětí, zralé datové trubky a škálování komunikace napříč mnoha GPU a uzly. Úspěch stojí na systematické profilaci, vhodném paralelizačním schématu (DDP/FSDP/ZeRO/PP/TP), disciplinovaném checkpointování a bezpečném zacházení s daty. Při dodržení těchto principů lze výrazně zkrátit time-to-accuracy, snížit náklady a doručit modely, které jsou výkonné, stabilní a připravené k nasazení v produkci.