Opublikowano otwarty projekt NBD-VRAM, umożliwiający wykorzystanie części pamięci wideo GPU NVIDIA jako przestrzeni swap w Linux. Projekt jest przede wszystkim skierowany do laptopów z wlutowaną pamięcią RAM, gdzie RAM nie może być rozszerzona, ale w systemie znajduje się dedykowana karta graficzna NVIDIA RTX/GTX z nieużywaną pamięcią VRAM. Kod napisany jest w C i shell, rozpowszechniany na licencji MIT.
Idea NBD-VRAM jest prosta: gdy system zaczyna przechodzić na swap na SSD, można wprowadzić dodatkową warstwę przed SSD — pamięć wideo. Autor podaje przykład laptopa na RTX 3070 Laptop: z 8 GB VRAM przeznaczono 7 GB na swap, a całkowicie z RAM, zram i swap SSD system uzyskał około 46 GB dostępnej pamięci. Przewidywana kolejność wypełnienia jest następująca: najpierw wykorzystywana jest RAM, następnie VRAM jako szybki swap, potem zram, a dopiero potem SSD.
Technicznie NBD-VRAM nie dodaje nowego sterownika jądra. Mały demon przydziela pamięć karty graficznej przez CUDA Driver API, a następnie przekazuje ją do jądra Linux jako urządzenie blokowe przez NBD — Network Block Device — nad gniazdem Unix. Po połączeniu standardowym nbd-client w systemie pojawia się /dev/nbdX, który można sformatować jako zwykły swap przez mkswap i włączyć przez swapon.
Autor szczególnie podkreśla, że takie podejście zostało wybrane z powodu ograniczeń konsumenckich kart graficznych NVIDIA. Bardziej bezpośrednia droga przez NVIDIA P2P API na GeForce, według niego, kończy się błędem EINVAL, ponieważ odpowiednie możliwości są dostępne jedynie dla modeli profesjonalnych i serwerowych. Opcja bezpośredniego dostępu do BAR1 również nie zadziałała: dostępna jest jedynie niewielka, odwzorowana przestrzeń, a odczyt z pozostałej części zwraca zera. Podejście NBD omija to ograniczenie, ponieważ wykorzystuje standardowe kopiowanie CUDA cuMemcpyHtoD i cuMemcpyDtoH.
Możliwości
Użycie VRAM jako zwykłego swap Linuxa. Po uruchomieniu demon udostępnia pamięć wideo jako /dev/nbd0 lub inne urządzenie NBD, które dla jądra wygląda jak standardowe urządzenie blokowe.
Działanie bez własnego modułu jądra. Projekt nie wymaga pisania, kompilowania i utrzymywania osobnego modułu jądra, nie wykorzystuje wewnętrznych symboli sterownika NVIDIA i powinien przetrwać aktualizacje jądra i sterownika bez rekompilacji.
Skupienie na konsumenckich GPU NVIDIA. W wymaganiach wskazano GPU NVIDIA z obsługą CUDA, w tym karty RTX/GTX dla konsumentów, oficjalny sterownik NVIDIA z libcuda.so.1, moduł nbd w jądrze Linux, nbd-client, gcc i make. Zestaw narzędzi CUDA nie jest wymagany.
Integracja z systemd. Instalacja przez install.sh dodaje usługę vram-swap-nbd, którą można uruchomić za pomocą systemctl; po instalacji usługa jest uruchamiana automatycznie przy starcie systemu.
Ustawienie rozmiaru i priorytetu swapu. W jednostce systemd można określić VRAM_SETUP_SIZE_MB, czyli górny limit przydzielanej VRAM, oraz VRAM_SWAP_PRIORITY, czyli priorytet urządzenia swap. Im wyższy priorytet, tym wcześniej Linux zacznie korzystać z tej warstwy swap.
Automatyczne zmniejszanie żądanego rozmiaru. Jeśli wymagany rozmiar VRAM jest niedostępny, demon próbuje zmniejszyć rozmiar w blokach po 512 MiB, aby przydzielić dostępny rozmiar, na przykład jeśli część pamięci jest już zajęta przez kompozytor lub sesję graficzną.
Skrypty testowe. W repozytorium znajduje się test-nbd.sh do testu dymnego z zapisem/odczytem 1 MiB oraz test-fill.sh do testu obciążeniowego całej partycji VRAM.
Zgłoszona wydajność wynosi około 1,3 GB/s. Na RTX 3070 Laptop autor zmierzył sekwencyjny zapis 7 GB w blokach po 4 MB na poziomie około 1,3 GB/s.
Scenariusze zastosowania
Laptopy z lutowaną RAM. Głównym scenariuszem są nowoczesne laptopy, w których 16 lub 32 GB pamięci RAM już nie wystarcza, ale nie można jej rozszerzyć. Jeśli w takiej maszynie znajduje się dedykowana karta RTX, część VRAM może być użyta jako dodatkowa warstwa swap. To nie zmienia VRAM w pełnoprawną RAM, ale może uratować system przed nagłym przejściem na wolny swap na SSD lub przed OOM-killerem w przypadku szczytowych obciążeń.
Ciężkie środowiska pracy dla programistów. IDE, przeglądarka z dziesiątkami zakładek, kontenery Docker, lokalne bazy danych, kompilacje dużych projektów i środowiska testowe łatwo tworzą krótkotrwałe szczyty zapotrzebowania na pamięć. W takim scenariuszu NBD-VRAM może działać jako bufor: nie przyspiesza zwykłej pracy, ale łagodzi moment, w którym RAM się kończy.
Zmniejszenie obciążenia SSD swap. Jeśli swap na SSD jest używany często, jest to nie tylko wolniejsze, ale również generuje nadmierny zapis na dysku. Swap VRAM można ustawić z wyższym priorytetem, aby przy przepełnieniu RAM system najpierw przenosił strony do pamięci wideo, a dopiero potem zwracał się do SSD. Jest to szczególnie istotne dla laptopów, gdzie SSD często jest również niedemontowalny lub kosztowny w wymianie.
Kombinacja z zram. Autor bezpośrednio opisuje schemat, w którym swap VRAM ma wyższy priorytet i przyjmuje pierwszy 'przelew' pamięci, zram jest używany jako następny poziom, a SSD pozostaje ostatnią linią obrony. Taki schemat może być przydatny dla stacji roboczych i laptopów, gdzie ważniejsze jest zachowanie responsywności systemu przy niedoborze pamięci, niż uzyskanie maksymalnej przewidywalności opóźnień.
Lokalne zadania AI/LLM wokół GPU, ale nie zamiast VRAM dla modelu. NBD-VRAM nie zwiększa ilości pamięci wideo dostępnej dla aplikacji CUDA jako VRAM dla modelu. To odwrotny scenariusz: nie RAM jest używany jako VRAM, a VRAM jest używane jako swap dla zwykłej pamięci Linux. Dlatego projekt nie pozwoli bezpośrednio załadować do GPU modelu większego rozmiaru. Może być jednak przydatny na maszynie, gdzie obok inferencji LLM działają przeglądarka, IDE, indykatory, środowiska Pythona i kontenery, a RAM systemowy zaczyna się kończyć.
Domowe i eksperymentalne stacje robocze. Projekt jest interesujący dla użytkowników, których karta graficzna często pozostaje nieużywana poza grami, renderowaniem lub zadaniami ML. Na przykład 8–12 GB VRAM na desktopowej GeForce można tymczasowo przekształcić w dodatkową warstwę swap do ciężkich zadań kompilacji, przetwarzania danych czy uruchamiania. maszyn wirtualnych.
Ograniczenia
NBD-VRAM nie jest zamiennikiem pamięci operacyjnej. Dostęp do takiego swapu odbywa się przez łańcuch kernel swap → /dev/nbdX → sterownik nbd → gniazdo Unix → demon → kopiowanie CUDA → VRAM, dlatego opóźnienia i zachowanie będą różne od prawdziwego RAM. Jest to raczej awaryjna lub pośrednia warstwa między RAM a SSD, niż sposób na 'dodanie pamięci' bez konsekwencji.
Projekt opiera się również na oficjalnym stosie NVIDIA z CUDA. Nouveau/Nova do tego się nie nadają, ponieważ wymagana jest libcuda.so.1. Phoronix również zauważa, że NBD-VRAM stworzono właśnie dla konsumenckich GPU NVIDIA, gdzie alternatywne podejścia przez NVIDIA P2P API nie działają.
W efekcie, NBD-VRAM to niewielki, ale ciekawy hack systemowy dla Linuksa: nie czyni cudów i nie zastępuje ulepszenia RAM, ale pozwala wykorzystać nieużywaną pamięć wideo jako dodatkowy poziom swap przed SSD. Dla laptopów z wlutowaną pamięcią i dedykowaną kartą RTX może to być praktyczny sposób na radzenie sobie z szczytowymi obciążeniami bez natychmiastowego spadku wydajności aplikacji lub bolesnego przejścia na wolniejszy dysk.
Źródło: linux.org.ru
