Fragmentacija VRAM-a: Tihi OOM na potrošačkim GPU-ima u inferenciji
Kada pokrećete dugotrajne inferencije na potrošačkim GPU-ima, poput NVIDIA GeForce ili AMD Radeon serija, možete naići na podmukao problem: tihi Out-of-Memory (OOM) koji se javlja nakon sati rada. Ovaj problem nije uzrokovan nedostatkom ukupnog VRAM-a, već fragmentacijom memorije – procesom u kojem se memorijski blokovi različitih veličina raspršuju, ostavljajući nedovoljno kontinuiranog prostora za nove alokacije.
Zašto dolazi do fragmentacije VRAM-a?
Moderni deep learning okviri, poput PyTorch i TensorFlow, dinamički alociraju i oslobađaju memoriju tijekom inferencije. Na potrošačkim GPU-ima, koji nemaju napredne mehanizme za defragmentaciju poput enterprise modela (npr. NVIDIA A100 s unified memory), ovo dovodi do postupnog nakupljanja fragmenata. Nakon više stotina ili tisuća iteracija, čak i ako je ukupna iskorištenost VRAM-a ispod 90%, može doći do OOM-a jer nema dovoljno velikog kontinuiranog bloka.
Kako detektirati fragmentaciju VRAM-a?
Najjednostavniji način je praćenje VRAM-a kroz nvidia-smi ili rocm-smi alate. No, oni pokazuju samo ukupnu iskorištenost, ne i fragmentaciju. Za precizniju detekciju koristite:
- PyTorch memory profiler:
torch.cuda.memory_summary()prikazuje detaljnu alokaciju po blokovima. - CUDA API:
cudaMemGetInfodaje slobodnu i ukupnu memoriju, ali ne i fragmentaciju. Za to koristitecudaMemPoolTrimToili alate poput nsys (NVIDIA Nsight Systems). - Prilagođeni skripti: Mjerite maksimalnu veličinu alociranog bloka u redovitim intervalima. Ako ona opada, fragmentacija raste.
Kako izmjeriti fragmentaciju VRAM-a?
Fragmentacija se može kvantificirati omjerom najvećeg slobodnog kontinuiranog bloka i ukupne slobodne memorije. Na primjer, ako imate 2 GB slobodno, ali najveći blok je samo 256 MB, fragmentacija je visoka. Alati poput gpustat (Python paket) ili nvtop (terminalni monitor) mogu prikazati ove podatke u stvarnom vremenu.
Kako spriječiti OOM zbog fragmentacije VRAM-a?
Postoji nekoliko strategija:
- Povećajte batch size: Veći batchovi smanjuju broj alokacija, ali zahtijevaju više VRAM-a.
- Koristite memory pooling: Okviri poput PyTorch imaju opciju
torch.cuda.empty_cache()koja oslobađa neiskorištene blokove, ali ne rješava fragmentaciju u potpunosti. - Implementirajte periodično oslobađanje: Nakon svakih N iteracija, ručno oslobodite i ponovno alocirajte memoriju (npr.
model.cpu(); torch.cuda.empty_cache(); model.cuda()). - Koristite
torch.cuda.set_per_process_memory_fraction: Ograničite maksimalnu količinu VRAM-a koju proces može koristiti, ostavljajući prostor za fragmentaciju. - Prebacite na enterprise GPU: Ako je problem kroničan, razmislite o GPU-ima s podrškom za unified memory ili SR-IOV.
Primjer detekcije fragmentacije VRAM-a u Pythonu
Evo jednostavne skripte koja prati fragmentaciju:
import torch
import time
def check_fragmentation():
free, total = torch.cuda.mem_get_info()
# Simulirajte alokaciju velikog bloka
try:
test_tensor = torch.empty((free // 4,), dtype=torch.float32, device='cuda')
max_block = test_tensor.numel() * test_tensor.element_size()
del test_tensor
except RuntimeError:
max_block = 0
fragmentation = 1 - (max_block / free) if free > 0 else 1
return fragmentation
while True:
frag = check_fragmentation()
print(f'Fragmentacija: {frag:.2%}')
time.sleep(60)Ova skripta pokušava alocirati veliki blok i mjeri koliko je uspješna. Ako fragmentacija prelazi 50%, vrijeme je za intervenciju.
Zaključak
Tihi OOM na potrošačkim GPU-ima nije neizbježan. Redovitim praćenjem fragmentacije i primjenom gore navedenih tehnika možete značajno produžiti stabilnost dugotrajnih inferencija. Ne zaboravite testirati svoje modele na stvarnim radnim opterećenjima prije produkcije.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari