Ein veröffentlichtes Open-Source-Projekt NBD-VRAM, das es ermöglicht, einen Teil des Grafikspeichers der NVIDIA GPU als Swap-Speicher in Linux zu verwenden. Das Projekt richtet sich in erster Linie an Laptops mit fest verlötetem RAM, bei denen der RAM nicht erweitert werden kann, aber im System eine NVIDIA RTX/GTX-Grafikkarte mit ungenutztem VRAM vorhanden ist. Der Code ist in C und Shell geschrieben und wird unter der Lizenz veröffentlicht MIT.
Die Idee von NBD-VRAM ist einfach: Wenn das System bereits beginnt, auf SSD zu swapen, kann man ein zusätzliches Zwischenlayer vor der SSD einfügen — den Grafikspeicher. Der Autor führt ein Beispiel mit einem Laptop an RTX 3070 Laptop: Von 8 GB VRAM wurden 7 GB für Swap reserviert, so dass das System insgesamt mit RAM, zram und SSD-Swap etwa 46 GB adressierbaren Speicher erhielt. Die vermutete Überlaufreihenfolge ist wie folgt: Zuerst wird RAM verwendet, dann VRAM als schneller Swap, dann zram und schließlich die SSD.
Technisch gesehen fügt NBD-VRAM keinen neuen Kernel-Treiber hinzu. Ein kleiner Daemon reserviert den Grafikspeicher über CUDA Driver API, und übergibt ihn anschließend dem Linux-Kernel als Blockgerät über NBD — Network Block Device — über einen Unix-Socket. Nach der Verbindung erscheint im System mit dem standardmäßigen nbd-client /dev/nbdX, das wie ein gewöhnliches Swap mit mkswap partitioniert und mit swapon aktiviert werden kann.
Der Autor betont speziell, dass dieser Ansatz aufgrund der Einschränkungen von Verbrauchergrafikkarten von NVIDIA gewählt wurde. Ein direkterer Weg über die NVIDIA P2P API bei GeForce stößt, seiner Aussage nach, auf EINVAL, da die entsprechenden Möglichkeiten faktisch nur für professionelle und Server-Modelle verfügbar sind. Die Variante mit direktem Zugriff auf BAR1 funktionierte ebenfalls nicht: Es war nur ein kleiner abgebildeter Bereich verfügbar, während das Lesen aus dem restlichen Teil nullen zurückgibt. Der NBD-Ansatz umgeht diese Einschränkung, da er gewöhnliche CUDA-Kopieroperationen cuMemcpyHtoD und cuMemcpyDtoH verwendet.
Funktionen
Verwendung von VRAM als gewöhnlicher Linux-Swap. Nach dem Start stellt der Daemon den Grafikspeicher als /dev/nbd0 oder ein anderes NBD-Gerät zur Verfügung, das für den Kernel wie ein standardmäßiges Blockgerät aussieht.
Betrieb ohne eigenes Kernel-Modul. Das Projekt erfordert nicht, dass ein separates Kernel-Modul geschrieben, kompiliert und gewartet wird, verwendet keine internen Symbole des NVIDIA-Treibers und sollte Kern- und Treiber-Updates ohne Neuerstellung überstehen.
Ausrichtung auf Verbrauchergrafikkarten von NVIDIA. In den Anforderungen sind NVIDIA-GPUs mit CUDA-Unterstützung aufgeführt, einschließlich der Verbraucher-RTX/GTX-Karten, des offiziellen NVIDIA-Treibers mit libcuda.so.1, des nbd-Moduls im Linux-Kernel, nbd-client, gcc und make. Das CUDA Toolkit ist dabei nicht erforderlich.
systemd-Integration. Die Installation über install.sh fügt den Dienst vram-swap-nbd hinzu, der über systemctl gestartet werden kann; nach der Installation wird der Dienst für den automatischen Start beim Booten aktiviert.
Konfiguration der Größe und Priorität des Swap. In der systemd-Einheit können VRAM_SETUP_SIZE_MB, also die obere Grenze des zugewiesenen VRAM, und VRAM_SWAP_PRIORITY, also die Priorität des Swap-Geräts, festgelegt werden. Je höher die Priorität, desto früher wird Linux diese Swap-Schicht verwenden.
Automatische Reduzierung der angeforderten Größe. Wenn der erforderliche VRAM nicht verfügbar ist, versucht der Daemon, die Größe in Schritten von 512 MiB zu reduzieren, um trotzdem den verfügbaren Raum zuzuweisen, beispielsweise wenn ein Teil des Speichers bereits vom Kompositor oder einer grafischen Sitzung belegt ist.
Test-Skripte. Im Repository gibt es test-nbd.sh für einen Smoke-Test mit Lese-/Schreibvorgängen von 1 MiB und test-fill.sh für einen Stresstest des gesamten VRAM-Volumes.
Die angegebene Leistung beträgt etwa 1,3 GB/s. Auf der RTX 3070 Laptop hat der Autor sequentielle Schreibvorgänge von 7 GB in 4 MB-Blöcken mit einer Geschwindigkeit von etwa 1,3 GB/s gemessen.
Anwendungsszenarien
Laptops mit verlöteter RAM. Das Hauptszenario sind moderne Laptops, bei denen 16 oder 32 GB RAM bereits nicht ausreichen, aber eine Erweiterung unmöglich ist. Wenn in einem solchen Gerät eine dedizierte RTX-Karte vorhanden ist, kann ein Teil des VRAM als zusätzliche Swap-Schicht genutzt werden. Dies verwandelt den VRAM nicht in vollwertigen RAM, kann jedoch das System vor dem abrupten Umgehen auf langsames SSD-Swap oder vor OOM-Killer bei Spitzenlasten retten.
Ressourcenintensive Entwicklungsumgebungen. IDE, Browser mit Dutzenden von Tabs, Docker-Container, lokale Datenbanken, Builds großer Projekte und Testumgebungen verursachen leicht vorübergehende Spitzen im Speicherverbrauch. In diesem Szenario kann NBD-VRAM als Puffer arbeiten: nicht die normale Arbeit beschleunigen, sondern den Moment mildern, wenn der RAM aufgebraucht ist.
Reduzierung der Belastung des SSD-Swaps. Wenn Swap auf SSD häufig verwendet wird, ist es nicht nur langsamer, sondern es erzeugt auch unnötige Schreibvorgänge auf dem Speicher. VRAM-Swap kann mit höherer Priorität eingestellt werden, sodass das System bei RAM-Überlastung zuerst Seiten in den Videospeicher auslagert und erst dann auf die SSD zugreift. Dies ist besonders relevant für Laptops, bei denen SSDs oft nicht austauschbar oder teuer in der Ersetzung sind.
Kombination mit zram. Der Autor beschreibt direkt ein Schema, bei dem VRAM-Swap höhere Priorität erhält und den ersten "Überlauf" des Speichers übernimmt, zram wird auf der nächsten Ebene verwendet, und SSD bleibt die letzte Verteidigungslinie. Solch ein Schema kann nützlich sein für Workstations und Laptops, bei denen es wichtiger ist, die Reaktionsfähigkeit des Systems bei Speichermangel zu bewahren, als maximale Vorhersagbarkeit der Latenzen zu erreichen.
Lokale AI/LLM-Aufgaben rund um die GPU, aber nicht anstelle von VRAM für das Modell. NBD-VRAM erhöht nicht den für CUDA-Anwendungen verfügbaren Videospeicher wie VRAM für das Modell. Es handelt sich um ein umgekehrtes Szenario: nicht RAM wird als VRAM benutzt, sondern VRAM wird als Swap für den normalen Linux-Speicher verwendet. Daher wird es nicht möglich sein, ein größeres Modell direkt in die GPU zu laden. Es kann jedoch nützlich sein auf einer Maschine, auf der parall mit LLM-Inferenz Browser, IDEs, Indexer, Python-Umgebungen und Container arbeiten und der Systemspeicher zu Ende geht.
Heim- und experimentelle Workstations. Das Projekt ist interessant für Nutzer, deren Grafikkarten häufig außerhalb von Spielen, Rendering oder ML-Aufgaben im Leerlauf sind. Zum Beispiel kann man 8–12 GB VRAM auf einer Desktop-GeForce vorübergehend in eine zusätzliche Layer-Swap für anspruchsvolle Aufgaben wie Kompilierung, Datenverarbeitung oder Ausführung verwandeln. virtuelle Maschinen.
Einschränkungen
NBD-VRAM ist kein Ersatz für den Arbeitsspeicher. Der Zugriff auf solches Swap erfolgt über die Kette Kernel-Swap → /dev/nbdX → nbd-Treiber → Unix-Socket → Daemon → CUDA-Kopie → VRAM, daher werden Latenzen und Verhalten von echtem RAM abweichen. Es handelt sich eher um eine Notfall- oder Zwischenebene zwischen RAM und SSD als um einen Weg, "Speicher ohne Folgen" hinzuzufügen.
Das Projekt basiert auch auf dem offiziellen NVIDIA-Stack mit CUDA. Nouveau/Nova sind dafür nicht geeignet, da libcuda.so.1 benötigt wird. Phoronix merkt auch an,, dass NBD-VRAM speziell für Consumer-NVIDIA-GPUs geschaffen wurde, bei denen alternative Ansätze über die NVIDIA P2P API nicht funktionieren.
Im Kern ist NBD-VRAM ein kleiner, aber interessanter System-Hack für Linux: Er vollbringt keine Wunder und ersetzt kein RAM-Upgrade, ermöglicht jedoch die Nutzung ungenutzter Grafikspeicher als zusätzliche Swap-Ebene vor SSDs. Für Laptops mit verlöteter RAM und einer dedizierten RTX-Grafikkarte kann dies eine praktische Lösung sein, um Spitzenlasten zu bewältigen, ohne sofortige Abstürze von Anwendungen oder schmerzhafte Übergänge zu langsameren Speichern zu erleben.
Quelle: linux.org.ru
