Публикуван открит проект NBD-VRAM, който позволява да се използва част от видеопаметта на NVIDIA GPU като swap пространство в Linux. Проектът е насочен предимно към лаптопи с споена оперативна памет, където RAM не може да се разширява, но системата има дискретна видеокарта NVIDIA RTX/GTX с неизползвана VRAM. Кодът е написан на C и shell, разпространява се под лиценз MIT.
Идеята на NBD-VRAM е проста: ако системата вече започва да се прехвърля на swap на SSD, може да се постави пред SSD още един междинен слой — видеопамет. Авторът дава пример с лаптоп на RTX 3070 Laptop: от 8 ГБ VRAM са отделени 7 ГБ за swap, а общо с RAM, zram и SSD swap системата получава около 46 ГБ адресируема памет. Предполагаемият ред на преливане е следният: първо се използва RAM, след това VRAM като бърз swap, после zram, и само след това SSD.
Технически NBD-VRAM не добавя нов драйвер на ядрото. Малък демон отделя паметта на видеокартата чрез CUDA Driver API, след което я предоставя на ядрото на Linux като блочно устройство чрез NBD — Network Block Device — върху Unix сокет. След свързване с стандартния nbd-client в системата се появява /dev/nbdX, което може да бъде форматирано като обикновен swap чрез mkswap и включено чрез swapon.
Авторът специално подчертава, че такъв подход е избран поради ограниченията на потребителските видеокарти NVIDIA. По-прякия път чрез NVIDIA P2P API на GeForce, по думите му, се натъква на EINVAL, тъй като съответните възможности всъщност са достъпни само за професионални и сървърни модели. Опитът с пряк достъп до BAR1 също не проработи: налична остава само малка отразена област, а четене от останалата част върнат нули. NBD подходът заобикаля това ограничение, тъй като използва обикновени CUDA копия cuMemcpyHtoD и cuMemcpyDtoH.
Възможности
Използване на VRAM като обикновен Linux swap. След стартиране демона предоставя видеопаметта като /dev/nbd0 или друго NBD устройство, което за ядрото изглежда като стандартно блочно устройство.
Работа без собствен модул на ядрото. Проектът не изисква писане, компилиране и поддържане на отделен kernel module, не използва вътрешни символи на NVIDIA драйвера и трябва да издържи актуализации на ядрото и драйвера без повторно компилиране.
Ориентация към потребителските NVIDIA GPU. Изискванията посочват NVIDIA GPU с поддръжка на CUDA, включително потребителски RTX/GTX карти, официален NVIDIA драйвер с libcuda.so.1, модул nbd в ядрото на Linux, nbd-client, gcc и make. CUDA Toolkit не е необходим.
интеграция с systemd. Инсталацията чрез install.sh добавя сервис vram-swap-nbd, който може да се стартира чрез systemctl; след инсталацията сервисът е включен за автоматичен старт при зареждане.
Настройване на размера и приоритета на swap. В systemd-unit можете да зададете VRAM_SETUP_SIZE_MB, тоест горната граница на заделената VRAM, и VRAM_SWAP_PRIORITY, тоест приоритета на swap устройството. Колкото по-висок е приоритетът, толкова по-рано Linux ще използва този swap слой.
Автоматично намаляване на поисканата големина. Ако желаният обем VRAM не е наличен, демонът се опитва да намалява размера на стъпки от 512 МиБ, за да задели наличния обем, например ако част от паметта вече е заета от композитор или графичната сесия.
Тестови сценарии. В репозитория има test-nbd.sh за смоук тест с запис/четене от 1 МиБ и test-fill.sh за стрес тест на целия VRAM дял.
Обявената производителност е около 1,3 ГБ/с. На RTX 3070 Laptop авторът измери последователно записване на 7 ГБ на блокове от 4 МБ, което е около 1,3 ГБ/с.
Сценарии на приложение
Лаптопи с запоена RAM. Основният сценарий е съвременни лаптопи, където 16 или 32 ГБ оперативна памет вече не е достатъчно, но няма възможност за разширяване. Ако в такава машина има дискретна RTX карта, част от VRAM може да се използва като допълнителен swap слой. Това не превръща VRAM в пълноценна RAM, но може да спаси системата от рязко преминаване към бавен SSD swap или от OOM-killer при пикова натовареност.
Тежки работни среди на разработчика. IDE, браузер с десетки табове, Docker контейнери, локални бази данни, компилации на големи проекти и тестови среди лесно създават краткосрочни пикова потребление на памет. В такъв сценарий NBD-VRAM може да работи като буфер: не да ускорява обичайната работа, а да смекчава момента, когато RAM е свършила.
Намаляване на натоварването на SSD swap. Ако swap на SSD се използва често, това е не само по-бавно, но и създава излишно записване на устройството. VRAM-swap може да бъде зададен с по-висок приоритет, така че при пренасищане на RAM системата първо да изсели страниците в видеопаметта, а след това да се обърне към SSD. Това е особено актуално за лаптопи, където SSD също често е несменяем или скъп за подмяна.
Комбинация с zram. Авторът описва схема, при която VRAM swap получава по-висок приоритет и приема първия "разлив" на памет, zram се използва на следващото ниво, а SSD остава последна линия на защита. Тази схема може да бъде полезна за работни станции и лаптопи, където е по-важно да се запази отзивчивостта на системата при недостиг на памет, отколкото да се получи максимална предсказуемост на закъсненията.
Локални AI/LLM задачи около GPU, но не вместо VRAM за модела. NBD-VRAM не увеличава видеопаметта, достъпна за CUDA приложението като VRAM за модела. Това е обратен сценарий: не RAM се използва като VRAM, а VRAM се използва като swap за обикновена памет на Linux. Следователно проектът не позволява директно зареждане в GPU на модел с по-голям размер. Но той може да бъде полезен на машина, където заедно с LLM инференс работят браузър, IDE, индексатори, Python среди и контейнери, а системната RAM започва да свършва.
Домашни и експериментални работни станции. Проектът е интересен за потребители, при които видеокартата често е в режим на изчакване извън игри, рендериране или ML задачи. Например, 8–12 ГБ VRAM на десктопна GeForce може временно да бъде превърнат в допълнителен слой swap за тежки задачи по компилация, обработка на данни или изпълнение. виртуални машини.
Ограничения
NBD-VRAM не е заместител на оперативната памет. Достъпът до такъв swap следва веригата kernel swap → /dev/nbdX → nbd драйвер → Unix сокет → демон → CUDA копиране → VRAM, поради което закъсненията и поведението ще се различават от истинската RAM. Това е по-скоро аварийно или междинно ниво между RAM и SSD, отколкото начин да "добавите памет" без последствия.
Проектът също така е свързан с официалния стек на NVIDIA с CUDA. Nouveau/Nova не са подходящи за това, тъй като изисква libcuda.so.1. Phoronix също така отбелязва, че NBD-VRAM е създаден именно за потребителски NVIDIA GPU, където алтернативните подходи чрез NVIDIA P2P API не работят.
В сухия остатък, NBD-VRAM е малък, но интересен системен хак за Linux: не прави чудеса и не замества ъпгрейда на RAM, но позволява да използвате неизползваемата видеопамет като допълнителна стъпка swap преди SSD. За лаптопи с запоена памет и дискретна RTX графична карта, това може да бъде практичен начин да се справите с пиковите натоварвания без незабавното сриване на приложенията или болезненото преминаване към бавен носител.
Източник: linux.org.ru
