Fragmentacija VRAM-a: Kako detektirati i ublažiti tihe OOM-ove na GPU-ima
Kada pokrećemo dugotrajne inferencijske zadatke na potrošačkim GPU-ima, često se susrećemo s podmuklim problemom: tihim Out-of-Memory (OOM) pogreškama. One se ne javljaju naglo, već postupno, kako se fragmentacija VRAM-a povećava tijekom vremena. Naš tim u RiNET-u razvio je pristup koji kombinira praćenje alokatora, memory pooling i defragmentacijsko planiranje kako bi se ovaj problem detektirao i ublažio.
Kako fragmentacija VRAM-a uzrokuje tihe OOM-ove
Kada modeli izvode inferenciju, oni dinamički alociraju i oslobađaju međuspremnike (buffere) za tenzore. S vremenom, ove alokacije stvaraju fragmente - male, neiskorištene dijelove memorije koji su premali za nove zahtjeve. Iako ukupna slobodna memorija može biti dovoljna, fragmentacija sprječava alokaciju kontinuiranih blokova, što dovodi do tihih OOM-ova bez ikakvog upozorenja.
Detekcija kroz custom allocator traceove
Da bismo otkrili fragmentaciju, implementirali smo custom allocator traceove koji bilježe svaku alokaciju i dealokaciju u VRAM-u. Ovi traceovi omogućuju nam da vizualiziramo obrasce korištenja memorije i identificiramo kada fragmentacija postaje kritična. Ključni metrika je fragmentacijski omjer - omjer najvećeg slobodnog bloka prema ukupnoj slobodnoj memoriji. Kada ovaj omjer padne ispod 0.5, rizik od tihog OOM-a naglo raste.
Ublažavanje memory poolingom
Jedna od najučinkovitijih strategija je memory pooling. Umjesto da svaki put alociramo i oslobađamo memoriju za tenzore, koristimo unaprijed alocirani pool blokova fiksne veličine. Ovo smanjuje fragmentaciju jer se alokacije ponovno koriste iz pool-a, a ne stvaraju nove fragmente. U RiNET-u smo implementirali hijerarhijski pool koji podržava više veličina blokova, prilagođen potrebama različitih slojeva modela.
Defragmentacijsko planiranje
Kada fragmentacija ipak dosegne kritičnu razinu, potrebno je aktivno djelovati. Defragmentacijsko planiranje uključuje periodično premještanje aktivnih tenzora u kompaktnije blokove, oslobađajući kontinuirane segmente memorije. Ovo se izvodi u pozadini, tijekom perioda niske aktivnosti inferencije, kako bi se minimizirao utjecaj na performanse. Naš scheduler koristi heuristiku temeljenu na fragmentacijskom omjeru i predviđenom trajanju zadatka.
Rezultati i preporuke
Testiranjem na popularnim modelima poput LLaMA i Stable Diffusion, primijetili smo smanjenje tihih OOM-ova za preko 80% uz korištenje memory poolinga i defragmentacije. Preporučujemo sljedeće korake za implementaciju:
- Integrirajte custom allocator traceove u svoj monitoring sustav.
- Postavite prag za fragmentacijski omjer (npr. 0.5) koji pokreće defragmentaciju.
- Koristite memory pool za često korištene veličine tenzora.
- Planirajte defragmentaciju u periodima niskog opterećenja GPU-a.
Implementacijom ovih tehnika, možete značajno povećati pouzdanost dugotrajnih inferencijskih zadataka na potrošačkim GPU-ima, bez potrebe za skupim enterprise rješenjima.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari