Публикуван е NBD-VRAM

Публикуван е открит проект 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster