Offentliggjort åpen prosjekt NBD-VRAM, som lar deg bruke en del av minnet til NVIDIA GPU som swap-plass i Linux. Prosjektet er hovedsakelig rettet mot bærbare datamaskiner med loddet RAM, der RAM ikke kan utvides, men systemet har et diskret NVIDIA RTX/GTX grafikkort med ubrukt VRAM. Koden er skrevet i C og shell, og distribueres under lisensen MIT.
Ideen bak NBD-VRAM er enkel: hvis systemet allerede begynner å bruke swap på SSD, kan du sette et mellomlag før SSD—grafikkminnet. Forfatteren gir et eksempel med en bærbar datamaskin med RTX 3070 Laptop: av 8 GB VRAM ble 7 GB tildelt til swap, og totalt med RAM, zram og SSD swap fikk systemet omtrent 46 GB adresserbart minne. Den foreslåtte rekkefølgen for overflod er som følger: først brukes RAM, deretter VRAM som rask swap, deretter zram, og først etter det SSD.
Teknisk sett legger ikke NBD-VRAM til en ny kjerne-driver. En liten daemon tildeler minnet fra grafikkortet via CUDA Driver API, og deretter gir det til Linux-kjernen som en blokk-enhet via NBD — Network Block Device — over en Unix-socket. Etter tilkobling med standard nbd-client vises /dev/nbdX i systemet, som kan partisjoneres som vanlig swap med mkswap og aktiveres med swapon.
Forfatteren understreker spesielt at denne tilnærmingen er valgt på grunn av begrensningene til forbrukergrafikkortene fra NVIDIA. En mer direkte vei gjennom NVIDIA P2P API på GeForce, ifølge ham, møter EINVAL-feil, da de relevante funksjonene i praksis kun er tilgjengelige for profesjonelle og servermodeller. Alternativet med direkte tilgang til BAR1 fungerte heller ikke: det tilgjengelige er bare et lite kartlagt område, og lesing fra resten returnerer nuller. NBD-tilnærmingen omgår denne begrensningen, da den bruker vanlige CUDA-kopieringer cuMemcpyHtoD og cuMemcpyDtoH.
Funksjoner
Bruk av VRAM som vanlig Linux swap. Etter oppstart gir daemonen grafikkminnet som /dev/nbd0 eller en annen NBD-enhet, som for kjernen ser ut som en standard blokk-enhet.
Funksjon uten egen kjerne-modul. Prosjektet krever ikke å skrive, bygge og vedlikeholde en egen kernel-modul, bruker ikke interne symboler fra NVIDIA-driveren og bør overleve kjernens og driverens oppdateringer uten ombygging.
Fokus på forbruker NVIDIA GPU. Kravene inkluderer NVIDIA GPU med støtte for CUDA, deriblant forbruker RTX/GTX-kort, offisiell NVIDIA-driver med libcuda.so.1, nbd-modul i Linux-kjernen, nbd-client, gcc og make. CUDA Toolkit er ikke nødvendig.
systemd-integrasjon. Installasjon gjennom install.sh legger til vram-swap-nbd-tjenesten, som kan kjøres via systemctl; etter installasjonen aktiveres tjenesten for automatisk oppstart ved oppstart.
Konfigurasjon av størrelse og prioritet for swap. I systemd-enheten kan VRAM_SETUP_SIZE_MB, det vil si den øvre grensen for tildelt VRAM, og VRAM_SWAP_PRIORITY, det vil si prioritet for swap-enheten, defineres. Jo høyere prioritet, desto tidligere vil Linux bruke dette swap-laget.
Automatisk reduksjon av forespurt størrelse. Hvis den nødvendige VRAM-kapasiteten ikke er tilgjengelig, prøver demon å redusere størrelsen i blokker på 512 MiB for å fortsatt tildele tilgjengelig kapasitet, for eksempel hvis en del av minnet allerede er opptatt av komposisjon eller grafisk økt.
Testskripter. I depotet finnes test-nbd.sh for røyktesting med lesing/skriving av 1 MiB og test-fill.sh for stresstesting av hele VRAM-partisjonen.
Utsatt ytelse på omtrent 1,3 GB/s. På RTX 3070 Laptop målte forfatteren sekvensiell skriving av 7 GB i blokker på 4 MB på omtrent 1,3 GB/s.
Bruksscenarier
Bærbare datamaskiner med loddet RAM. Hovedscenariet er moderne bærbare datamaskiner hvor 16 eller 32 GB RAM ikke er tilstrekkelig, men som ikke kan oppgraderes. Hvis en slik maskin har et diskret RTX-kort, kan en del av VRAM brukes som et ekstra swap-lag. Dette gjør ikke VRAM til fullverdig RAM, men kan redde systemet fra å gå brått ned til en treg SSD swap eller OOM-killer ved toppbelastninger.
Tunge utviklerarbeidsmiljøer. IDE, nettleser med dusinvis av faner, Docker-containere, lokale databaser, bygg av store prosjekter og testmiljøer skaper lett kortvarige topper i minneforbruket. I et slikt scenario kan NBD-VRAM fungere som en buffer: ikke akselerere den vanlige driften, men dempe øyeblikket når RAM er tom.
Reduksjon av belastning på SSD swap. Hvis swap på SSD brukes ofte, er det ikke bare tregere, men det skaper også unødvendig skriving på lagringsenheten. VRAM-swap kan settes med høyere prioritet, slik at når RAM er full, vil systemet først flytte sider til videominne, og deretter gå til SSD. Dette er særlig relevant for bærbare datamaskiner, der SSD ofte er uavtagbar eller kostbar å bytte.
Kombinasjon med zram. Forfatteren beskriver klart et oppsett der VRAM swap får høyere prioritet og tar den første 'utløpingen' av minnet, zram brukes som neste nivå, og SSD forblir den siste forsvarslinjen. Et slikt oppsett kan være nyttig for arbeidsstasjoner og bærbare datamaskiner, der det er viktigere å opprettholde responsivitet i systemet ved minnemangel enn å oppnå maksimal forutsigbarhet i forsinkelser.
Lokale AI/LLM-oppgaver rundt GPU, men ikke i stedet for VRAM for modellen. NBD-VRAM øker ikke videominne tilgjengelig for CUDA-applikasjoner som VRAM for modellen. Det er motsatt scenario: ikke RAM brukes som VRAM, men VRAM brukes som swap for vanlig Linux-minne. Derfor vil prosjektet ikke tillate direkte lasting av en større modell inn i GPU. Men det kan være nyttig på en maskin hvor nettleser, IDE, indekserere, Python-miljøer og containere jobber ved siden av LLM-inferens, og system-RAM begynner å ta slutt.
Hjemme- og eksperimentelle arbeidsstasjoner. Prosjektet er interessant for brukere som har grafikkort som ofte står stille utenfor spill, rendering eller ML-oppgaver. For eksempel kan 8–12 GB VRAM på en desktop GeForce midlertidig bli gjort om til et ekstra lag med swap for tunge kompilasjonsoppgaver, databehandling eller oppstart. virtual machines.
Begrensninger
NBD-VRAM er ikke en erstatning for RAM. Tilgang til slik swap går gjennom kjede: kernel swap → /dev/nbdX → nbd-driver → Unix-socket → daemon → CUDA-kopiering → VRAM, så forsinkelser og oppførsel vil være forskjellige fra ekte RAM. Dette er mer et nød- eller mellomlag mellom RAM og SSD, enn en måte å 'legge til minne' uten konsekvenser.
Prosjektet er også knyttet til det offisielle NVIDIA-stakken med CUDA. Nouveau/Nova er ikke egnede for dette, da libcuda.so.1 kreves. Phoronix merker også, at NBD-VRAM er laget spesielt for forbruker-NVIDIA GPU-er, hvor alternative tilnærminger via NVIDIA P2P API ikke fungerer.
I den endelige sammenhengen er NBD-VRAM en liten, men interessant systemhack for Linux: den gjør ikke underverker og erstatter ikke RAM-oppgraderinger, men lar deg bruke ubrukt videominne som et ekstra nivå av swap før SSD. For bærbare datamaskiner med fastmontert minne og dedikert RTX-kort kan dette være en praktisk måte å håndtere toppbelastninger på uten at applikasjoner umiddelbart krasjer eller at det blir en plagsom overgang til en treg lagringsenhet.
Kilde: linux.org.ru
