Pubblicato il progetto open source NBD-VRAM, che consente di utilizzare una parte della memoria video delle GPU NVIDIA come spazio di swap su Linux. Il progetto è principalmente rivolto a laptop con memoria RAM saldata, dove la RAM non può essere espansa, ma con una scheda grafica discreta NVIDIA RTX/GTX in cui è presente VRAM inutilizzata. Il codice è scritto in C e shell ed è distribuito sotto licenza MIT.
L'idea di NBD-VRAM è semplice: se il sistema inizia già a utilizzare lo swap su SSD, è possibile inserire un ulteriore strato intermedio tra la RAM e l'SSD — la memoria video. L'autore fa un esempio con un laptop su RTX 3070 Laptop: da 8 GB di VRAM sono stati assegnati 7 GB per lo swap, ottenendo così, sommando RAM, zram e lo swap su SSD, circa 46 GB di memoria indirizzabile. L'ordine previsto di sfruttamento è il seguente: inizialmente si utilizza la RAM, poi la VRAM come swap veloce, quindi zram, e solo dopo SSD.
Tecnicamente, NBD-VRAM non aggiunge un nuovo driver del kernel. Un piccolo demone assegna la memoria della scheda video tramite CUDA Driver API, poi la passa al kernel di Linux come dispositivo a blocchi tramite NBD — Network Block Device — sopra un socket Unix. Dopo la connessione, il client nbd-standard appare nel sistema come /dev/nbdX, che può essere formattato come uno swap normale tramite mkswap e attivato con swapon.
L'autore sottolinea che questo approccio è stato scelto a causa delle limitazioni delle schede grafiche NVIDIA consumer. Un percorso più diretto attraverso l'API NVIDIA P2P su GeForce, a suo dire, genera un EINVAL, poiché le capacità corrispondenti sono effettivamente disponibili solo per i modelli professionali e server. Anche l'opzione di accesso diretto a BAR1 non ha funzionato: risulta disponibile solo una piccola area mappata, e la lettura dalla parte restante restituisce zeri. L'approccio NBD supera questa limitazione, poiché utilizza le normali operazioni di copia CUDA cuMemcpyHtoD e cuMemcpyDtoH.
Capacità
Utilizzo della VRAM come normale swap Linux. Dopo l'avvio, il demone fornisce la memoria video come /dev/nbd0 o un'altra unità NBD, che per il kernel appare come un normale dispositivo a blocchi.
Funzionamento senza un proprio modulo del kernel. Il progetto non richiede la scrittura, la compilazione e la manutenzione di un modulo kernel separato, non utilizza simboli interni del driver NVIDIA e deve sopportare aggiornamenti del kernel e del driver senza ricompilazione.
Orientamento verso le GPU NVIDIA per consumatori. Le specifiche richiedono GPU NVIDIA con supporto CUDA, incluse le schede RTX/GTX per consumatori, il driver NVIDIA ufficiale con libcuda.so.1, il modulo nbd nel kernel Linux, nbd-client, gcc e make. Il toolkit CUDA non è necessario.
Integrazione con systemd. L'installazione tramite install.sh aggiunge il servizio vram-swap-nbd, che può essere avviato tramite systemctl; dopo l'installazione, il servizio viene attivato per l'avvio automatico all'avvio.
Configurazione delle dimensioni e della priorità dello swap. Nell'unità systemd, è possibile specificare VRAM_SETUP_SIZE_MB, cioè il limite superiore della VRAM allocata, e VRAM_SWAP_PRIORITY, cioè la priorità del dispositivo swap. Maggiore è la priorità, prima Linux utilizzerà questo layer di swap.
Riduzione automatica della dimensione richiesta. Se la quantità di VRAM richiesta non è disponibile, il demone tenta di ridurre la dimensione a blocchi di 512 MiB, per allocare comunque la quantità disponibile, ad esempio se una parte della memoria è già occupata dal compositore o da una sessione grafica.
Scripting di verifica. Nel repository è disponibile test-nbd.sh per il test di smoke con scrittura/lettura di 1 MiB e test-fill.sh per il collaudo stressivo dell'intera partizione VRAM.
La performance dichiarata è di circa 1,3 GB/s. Su RTX 3070 Laptop, l'autore ha misurato una scrittura sequenziale di 7 GB in blocchi da 4 MB a circa 1,3 GB/s.
Scenari d'uso
Laptop con RAM saldata. Il principale scenario è rappresentato dai laptop moderni, dove 16 o 32 GB di RAM non sono più sufficienti, ma non è possibile espanderla. Se in tale macchina è presente una scheda RTX dedicata, parte della VRAM può essere utilizzata come ulteriore strato di swap. Questo non trasforma la VRAM in RAM vera e propria, ma può salvare il sistema dall'andare in swap SSD lento o dall'oom-killer in caso di carichi di lavoro elevati.
Ambienti di lavoro pesanti per sviluppatori. IDE, browser con decine di schede, container Docker, database locali, build di grandi progetti e ambienti di test creano facilmente picchi temporanei di consumo della memoria. In questo scenario, NBD-VRAM può funzionare come un buffer: non accelerare il lavoro ordinario, ma smussare il momento in cui la RAM è esaurita.
Riduzione del carico sullo swap SSD. Se lo swap su SSD viene utilizzato frequentemente, non solo è più lento, ma crea anche un'ulteriore registrazione sul supporto. È possibile impostare lo swap della VRAM con una priorità più alta, in modo che, in caso di esaurimento della RAM, il sistema espella prima le pagine nella memoria video e solo dopo accede all'SSD. Questo è particolarmente rilevante per i laptop, dove l'SSD è spesso non rimovibile o costoso da sostituire.
Combinazione con zram. L'autore descrive direttamente uno schema in cui lo swap della VRAM riceve una priorità più alta e gestisce per primo il 'fuoriuscita' della memoria, mentre zram viene utilizzato come secondo livello e l'SSD rimane l'ultima linea di difesa. Questo schema può essere utile per workstation e laptop, dove è più importante mantenere la reattività del sistema in condizioni di carenza di memoria piuttosto che ottenere la massima prevedibilità dei ritardi.
Compiti locali di AI/LLM intorno alla GPU, ma non al posto della VRAM per il modello. NBD-VRAM non aumenta la memoria video disponibile per le applicazioni CUDA come VRAM per il modello. Questo è uno scenario inverso: non è la RAM a essere utilizzata come VRAM, ma la VRAM è impiegata come swap per la memoria normale di Linux. Pertanto, il progetto non consente di caricare direttamente nel GPU un modello di dimensioni maggiori. Tuttavia, può rivelarsi utile su una macchina dove, accanto all'inferenza LLM, operano browser, IDE, indicizzatori, ambienti Python e contenitori, e la RAM di sistema sta per esaurirsi.
Postazioni di lavoro domestiche ed esperimentali. Il progetto è interessante per gli utenti la cui scheda video rimane spesso inattiva al di fuori di giochi, rendering o compiti di ML. Ad esempio, 8–12 GB di VRAM su una GeForce desktop possono essere temporaneamente convertiti in un ulteriore strato di swap per compiti pesanti di compilazione, elaborazione dati o esecuzione. di macchine virtuali.
Limitazioni
NBD-VRAM non è un sostituto della memoria RAM. L'accesso a tale swap avviene attraverso la catena kernel swap → /dev/nbdX → driver nbd → socket Unix → demone → copia CUDA → VRAM, pertanto le latenze e il comportamento differiranno dalla vera RAM. È più un layer di emergenza o intermedio tra RAM e SSD, piuttosto che un modo per "aggiungere memoria" senza conseguenze.
Il progetto si basa anche sullo stack ufficiale di NVIDIA con CUDA. Nouveau/Nova non sono adatti, poiché è necessario libcuda.so.1. Phoronix nota anche, che NBD-VRAM è stato creato specificamente per le GPU NVIDIA consumer, dove gli approcci alternativi tramite API P2P di NVIDIA non funzionano.
In sintesi, NBD-VRAM è un piccolo, ma interessante hack di sistema per Linux: non compie miracoli e non sostituisce un aggiornamento della RAM, ma consente di utilizzare la memoria video inattiva come ulteriore livello di swap prima del SSD. Per i laptop con memoria saldata e una scheda RTX dedicata, questo può rivelarsi un modo pratico per affrontare picchi di carico senza il immediato crash delle applicazioni o il doloroso passaggio a un'unità lenta.
Fonte: linux.org.ru
