Proiect deschis publicat NBD-VRAM, care permite utilizarea unei părți din memoria video a GPU-ului NVIDIA ca spațiu swap în Linux. Proiectul este orientat în principal către laptopuri cu memorie RAM lipită, unde RAM nu poate fi extinsă, dar în sistem există o placă grafică dedicată NVIDIA RTX/GTX cu VRAM neutilizată. Codul este scris în C și shell, fiind distribuit sub licență MIT.
Ideea NBD-VRAM este simplă: dacă sistemul începe deja să utilizeze swap pe SSD, se poate introduce un strat intermediar înainte de SSD - memoria video. Autorul oferă un exemplu cu un laptop pe RTX 3070 Laptop: din 8 GB VRAM, 7 GB au fost alocați pentru swap, iar împreună cu RAM, zram și swap SSD, sistemul a obținut aproximativ 46 GB de memorie adresabilă. Ordinea prognozată de umplere este următoarea: mai întâi se utilizează RAM, apoi VRAM ca swap rapid, apoi zram, și abia apoi SSD.
Din punct de vedere tehnic, NBD-VRAM nu adaugă un nou driver de kernel. Un mic demon alocă memoria plăcii video prin CUDA Driver API, apoi o returnează kernel-ului Linux ca dispozitiv bloc prin NBD — Network Block Device — deasupra unui socket Unix. După conectare, clientul nbd standard apare în sistem ca /dev/nbdX, care poate fi partajat ca un swap obișnuit prin mkswap și activat prin swapon.
Autorul subliniază că această abordare a fost aleasă din cauza limitărilor plăcilor grafice de consum NVIDIA. O abordare mai directă prin NVIDIA P2P API pe GeForce, conform spuselor sale, întâmpină EINVAL, deoarece funcționalitățile corespunzătoare sunt de fapt disponibile doar pentru modelele profesionale și server. Varianta cu acces direct la BAR1 nu a funcționat nici ea: zona mapată disponibilă este mică, iar citirea din restul zonei returnează zerouri. Abordarea NBD ocolește această limitare, deoarece utilizează copierea obișnuită CUDA cu cuMemcpyHtoD și cuMemcpyDtoH.
Funcționalități
Utilizarea VRAM ca swap obișnuit Linux. După lansare, demonul oferă memoria video ca /dev/nbd0 sau alt dispozitiv NBD, care pentru kernel arată ca un dispozitiv bloc standard.
Funcționare fără un modul de kernel propriu. Proiectul nu necesită scrierea, compilarea și întreținerea unui modul kernel separat, nu folosește simboluri interne ale driverului NVIDIA și ar trebui să supraviețuiască actualizărilor de kernel și driver fără recompilare.
Orientare pe GPU-urile NVIDIA de consum. Cerințele indică GPU NVIDIA cu suport pentru CUDA, inclusiv plăci RTX/GTX pentru consumatori, driverul oficial NVIDIA cu libcuda.so.1, modulul nbd în nucleul Linux, nbd-client, gcc și make. Toolkit-ul CUDA nu este necesar.
Integrarea systemd. Instalarea prin install.sh adaugă serviciul vram-swap-nbd, care poate fi pornit prin systemctl; după instalare, serviciul este activat pentru a porni automat la boot.
Configurarea dimensiunii și priorității swap. În unitatea systemd se pot seta VRAM_SETUP_SIZE_MB, adică limita superioară a VRAM-ului alocat, și VRAM_SWAP_PRIORITY, adică prioritatea dispozitivului swap. Cu cât prioritatea este mai mare, cu atât Linux va folosi acest strat de swap mai devreme.
Reducerea automată a dimensiunii solicitate. Dacă volumul necesar de VRAM nu este disponibil, demonul încearcă să reducă dimensiunea în blocuri de 512 MiB pentru a aloca în continuare volumul disponibil, de exemplu, dacă o parte din memorie este deja ocupată de compositor sau sesiunea grafică.
Scripte de verificare. În depozit există test-nbd.sh pentru un test de tip smoke cu scriere/lectură de 1 MiB și test-fill.sh pentru testarea stresului întregului compartiment VRAM.
Performanța declarată este de aproximativ 1,3 GB/s. Pe RTX 3070 Laptop, autorul a măsurat scrierea secvențială de 7 GB în blocuri de 4 MB la aproximativ 1,3 GB/s.
Scenarii de aplicare
Laptopuri cu RAM lipită. Scenariul principal este laptopurile moderne, unde 16 sau 32 GB de RAM nu sunt suficiente, dar nu pot fi extinse. Dacă o asemenea mașină are o placă RTX discretă, o parte din VRAM poate fi folosită ca strat suplimentar de swap. Acest lucru nu transformă VRAM în RAM complet, dar poate salva sistemul de la o tranziție bruscă pe swap SSD lent sau de la OOM-killer în momentele de vârf.
Mediile de lucru grele ale dezvoltatorului. IDE, un browser cu zeci de tab-uri, containere Docker, baze de date locale, compilări de mari proiecte și medii de testare creează ușor vârfuri temporare ale consumului de memorie. În acest scenariu, NBD-VRAM poate funcționa ca un tampon: nu accelerând munca obișnuită, ci atenuând momentul când RAM-ul a epuizat.
Reducerea încărcării pe swap SSD. Dacă swap-ul pe SSD este folosit frecvent, acesta nu doar că este mai lent, dar generează și scrieri suplimentare pe suport. Swap-ul VRAM poate fi setat cu o prioritate mai mare, astfel încât, la umplerea RAM-ului, sistemul să înlocuiască mai întâi paginile în memoria video, după care se va adresa SSD-ului. Aceasta este cu atât mai relevantă pentru laptopuri, unde SSD-ul este de obicei neînlocuibil sau costisitor de schimbat.
Combinat cu zram. Autorul descrie direct o schemă în care swap-ul VRAM primește o prioritate mai mare și primește prima "revărsare" de memorie, zram este utilizat ca următor nivel, iar SSD-ul rămâne ultima linie de apărare. Această schemă poate fi utilă pentru stații de lucru și laptopuri, unde este mai important să păstrezi reacția sistemului în condiții de memorie insuficientă decât să obții o predictibilitate maximă a întârzierilor.
Sarcini locale AI/LLM în jurul GPU-ului, dar nu în locul VRAM-ului pentru model. NBD-VRAM nu crește memoria video disponibilă unei aplicații CUDA ca VRAM pentru model. Acesta este un scenariu invers: nu RAM este folosit ca VRAM, ci VRAM este folosit ca swap pentru memoria obișnuită Linux. Prin urmare, proiectul nu va permite încărcarea directă în GPU a unui model mai mare. Dar poate fi util pe o mașină unde, alături de inferența LLM, operează un browser, IDE-uri, indexatori, medii Python și containere, iar RAM-ul sistemului începe să se epuizeze.
Stații de lucru de acasă și experimentale. Proiectul este interesant pentru utilizatorii ale căror plăci grafice sunt adesea inactivate în afara jocurilor, randării sau sarcinilor ML. De exemplu, 8-12 GB VRAM pe o GeForce desktop poate fi temporar transformat într-un strat suplimentar swap pentru sarcini grele de compilare, procesare a datelor sau execuție. mașini virtuale.
Limitări
NBD-VRAM nu este un înlocuitor pentru memoria RAM. Accesul la un astfel de swap se face prin lanțul kernel swap → /dev/nbdX → driver nbd → socket Unix → demon → copiere CUDA → VRAM, astfel că întârzierile și comportamentul vor fi diferite față de RAM-ul adevărat. Acesta este mai degrabă un strat de urgență sau intermediar între RAM și SSD, decât o modalitate de "adăuga memorie" fără consecințe.
De asemenea, proiectul este legat de stiva oficială NVIDIA cu CUDA. Nouveau/Nova nu sunt potrivite pentru aceasta, deoarece este necesar libcuda.so.1. Phoronix de asemenea, își notează, că NBD-VRAM a fost creat special pentru GPU-urile NVIDIA consumatorului, unde abordările alternative prin API-ul NVIDIA P2P nu funcționează.
În concluzie, NBD-VRAM este un hack sistemic mic, dar interesant pentru Linux: nu face minuni și nu înlocuiește upgrade-ul RAM, dar permite utilizarea memoriei video neutilizate ca un strat suplimentar de swap înainte de SSD. Pentru laptopurile cu memorie lipită și carte grafică RTX discretă, acesta poate fi o modalitate practică de a face față sarcinilor de vârf fără a face ca aplicațiile să cadă brusc sau să se blocheze pe un stocător lent.
Sursa: linux.org.ru
