Trénování hlubokých modelů na GPU
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é maticové/algebraické aritmetice 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ž zásadně zkracuje dobu učení vůči CPU. 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 backpropagaci.
Architektura GPU a její dopady na učení
- 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 coalesced access a minimalizace přístupů do globální paměti.
- Tensor Cores: akcelerace FMA pro FP16/BF16/TF32; vyžadují správné tile rozměry a layouty (NHWC/NCHW).
- Propojovací fabric: PCIe, NVLink, NVSwitch – limitují škálování mezi GPU (komunikace 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čet a paměť.
- TF32 (na vybraných GPU): kompromis mezi FP16 a FP32 pro trénink konvolucí/MLP bez zásahu do kódu.
- FP16 s loss scalingem: vyžaduje škálování ztráty (statické/dynamické) kvůli underflow; výborná propustnost na Tensor Cores.
- BF16: širší exponent než FP16, stabilnější numerika bez loss scalingu; často preferováno pro LLM.
- INT8/INT4: primárně pro inference; při tréninku se využívá quantization-aware training nebo QLoRA pro fine-tuning.
Smíšená přesnost (AMP) v praxi
AMP (Automatic Mixed Precision) kombinuje FP16/BF16 pro výpočetně intenzivní části a FP32 pro akumulaci gradientů. Výsledkem je vyšší throughput a menší 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) memory a asynchronní přenosy přes DMA s
non_blocking=True. - Prefetching a více workerů v DataLoaderu (balance 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.
- GPUDirect Storage/RDMA (kde je dostupné) pro snížení latencí a CPU zapojení.
Optimalizace využití paměti
- Gradient checkpointing (aktivace recompute) – výměna výpočtu za menší paměťové nároky.
- FSDP/ZeRO – sharding parametrů, gradientů a stavů optimizeru napříč GPU.
- Fused operace (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, dělení batch mezi GPU; synchronizace gradientů přes NCCL AllReduce.
- Model parallel: rozdělení vrstev/parametrů na GPU (pipeline parallel, tensor/sliced parallel – např. Megatron).
- Hybridní schémata: kombinace DP+TP+PP pro velmi velké modely (LLM, vision transformer haly).
- Overlapping: překryv komunikace s výpočtem (bucketizace gradientů, async kolektivy).
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.
Učení velkých jazykových modelů (LLM) a vision transformerů
- Stabilita: BF16, pre-norm architektury, gradient clipping, správná inicializace (µ, σ) a cosine plánování LR.
- Efektivní fine-tuning: LoRA/QLoRA (low-rank adapters), prefix tuning – paměťová úspora a rychlost.
- Tokenizace a sekvence: FlashAttention/SDPA pro škálování na dlouhé sekvence, fused kernel implementace.
Plánování učení: velikost batch, LR, warmup, regularizace
- Lineární škálování LR s efektivní velikostí batch (Goyal et al.) + warmup pro stabilní začátek.
- Scheduler: cosine decay, OneCycle, exponenciální rozpad; 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 (kernel time, mem BW, host-device sync).
- CUDA Graphs: snížení overheadu spouštění kernelů u stabilních grafů výpočtu.
- Kernel fusion a knihovny (cuDNN heuristiky, CUTLASS, Triton) – volba algoritmů GEMM/conv, autotuning.
- IO a augmentace: on-device augmentace, mixup/cutmix s minimálním overheadem.
Správa checkpointů a obnova po pádu
- Částečné checkpointy: parametry, stavy optimizeru, LR scheduler, RNG stavy pro reprodukovatelnost.
- Sharding checkpointů při FSDP/ZeRO; asynchronní checkpointing do objektového storage.
- Perioda ukládání: podle MTBF clusteru a ceny ztráty práce; kombinace posledních a „long-term“ checkpointů.
Reprodukovatelnost a numerická stabilita
- Seedování (CPU/GPU knihovny), deterministické kernel varianty (za cenu výkonu), kontrola nedeterminismu (AtomicAdd, race conditions).
- Čisté akumulace: FP32 akumulace gradientů, gradient clipping, loss scaling u FP16.
- Kontrola anomálií (NaN/Inf hooks), automatické nan-skip batch.
Bezpečnost, data governance a soukromí
- Šifrování dat v klidu i za 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ů.
- Čistota dat: detekce poisoning/label flipping, robustní validace a kontrola driftu.
Ekonomika a udržitelnost tréninku
- Cost/perf: výběr GPU (HBM kapacita, NVLink), occupancy clusteru, spot instance s checkpointingem.
- Energetická účinnost: smíšená přesnost, kernel fusion, využití chladnějších datacenter, plánování dávkově.
- Green AI: metriky CO2 na epizodu/epochu, early stopping, hyperparameter optimization s ASHA/BOHB.
Praktické vzory (patterns) 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 obří modely; overlap komunikace a výpočtu.
- Fine-tuning LLM/Vision: BF16 + LoRA/QLoRA, FlashAttention, 8-bit optimizer; robustní tokenizer/sharding.
- Time-to-accuracy optimalizace: warmup LR, 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
- Underutilized GPU kvůli I/O – řešit přednačítáním, shardingem a pinned memory.
- Explodující gradienty – gradient clipping, lepší normalizace, správná inicializace.
- Numerické nestability v FP16 – použít BF16 nebo precizní akumulaci a korektní loss scaling.
- Nesprávná komunikace mezi GPU – chybějící overlap, nevhodné bucket size, 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 respektování 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 nasaditelné v produkci.