Projet ouvert publié NBD-VRAM, permettant d'utiliser une partie de la mémoire vidéo du GPU NVIDIA comme espace d'échange sous Linux. Le projet est principalement destiné aux ordinateurs portables avec de la mémoire RAM soudée, où la RAM ne peut pas être étendue, mais où le système dispose d'une carte graphique NVIDIA RTX/GTX avec de la VRAM inutilisée. Le code est écrit en C et shell, et est distribué sous licence MIT.
L'idée de NBD-VRAM est simple : si le système commence déjà à utiliser l'échange sur SSD, on peut placer une couche intermédiaire devant le SSD — la mémoire vidéo. L'auteur cite un exemple avec un ordinateur portable équipé d'un RTX 3070 Laptop: sur 8 Go de VRAM, 7 Go ont été alloués à l'échange, et au total, avec la RAM, zram et l'échange sur SSD, le système a obtenu environ 46 Go de mémoire adressable. L'ordre présumé de débordement est le suivant : d'abord la RAM est utilisée, puis la VRAM comme échange rapide, ensuite zram, et enfin le SSD.
Techniquement, NBD-VRAM n'ajoute pas de nouveau pilote de noyau. Un petit démon alloue la mémoire de la carte graphique via CUDA Driver API, puis la restitue au noyau Linux comme un dispositif bloc via NBD — Network Block Device — sur un socket Unix. Après connexion avec le client nbd standard, un /dev/nbdX apparaît dans le système, qui peut être formaté comme un échange standard via mkswap et activé via swapon.
L'auteur souligne séparément que cette approche a été choisie en raison des limitations des cartes graphiques NVIDIA grand public. Un chemin plus direct via l'API NVIDIA P2P sur GeForce, selon lui, aboutit à EINVAL, car les capacités correspondantes ne sont en fait disponibles que pour les modèles professionnels et serveurs. L'option d'un accès direct à BAR1 n'a également pas fonctionné : seule une petite zone mappée est accessible, et la lecture dans le reste renvoie des zéros. L'approche NBD contourne cette limitation, car elle utilise les copiages CUDA normaux cuMemcpyHtoD et cuMemcpyDtoH.
Fonctionnalités
Utiliser la VRAM comme échange Linux standard. Après le démarrage, le démon fournit la mémoire vidéo comme /dev/nbd0 ou un autre dispositif NBD, qui pour le noyau ressemble à un dispositif bloc standard.
Fonctionnement sans module de noyau propre. Le projet ne nécessite pas d'écrire, de compiler et d'entretenir un module de noyau distinct, n'utilise pas les symboles internes du pilote NVIDIA et doit survivre aux mises à jour du noyau et du pilote sans recompilation.
Orientation vers les GPU NVIDIA grand public. Les exigences incluent des GPU NVIDIA avec support CUDA, y compris les cartes RTX/GTX grand public, le pilote NVIDIA officiel avec libcuda.so.1, le module nbd dans le noyau Linux, nbd-client, gcc et make. Le toolkit CUDA n'est pas nécessaire.
Intégration systemd. L'installation via install.sh ajoute le service vram-swap-nbd, qui peut être démarré via systemctl ; après l'installation, le service est activé pour démarrer automatiquement au démarrage.
Configuration de la taille et de la priorité du swap. Dans le fichier unit systemd, vous pouvez définir VRAM_SETUP_SIZE_MB, c'est-à-dire la limite supérieure de la VRAM allouée, et VRAM_SWAP_PRIORITY, c'est-à-dire la priorité de l'appareil swap. Plus la priorité est élevée, plus Linux utilisera tôt cette couche de swap.
Réduction automatique de la taille demandée. Si la quantité requise de VRAM n'est pas disponible, le démon essaie de réduire la taille par blocs de 512 MiB pour allouer la quantité disponible, par exemple si une partie de la mémoire est déjà occupée par le compositeur ou la session graphique.
Scripts de vérification. Dans le dépôt, il y a test-nbd.sh pour un test de fumée avec écriture/lecture de 1 MiB et test-fill.sh pour un test de stress de toute la partition VRAM.
Performances annoncées d'environ 1,3 Go/s. Sur un RTX 3070 Laptop, l'auteur a mesuré une écriture séquentielle de 7 Go par blocs de 4 Mo, atteignant environ 1,3 Go/s.
Scénarios d'application
Ordinateurs portables avec RAM soudée. Le principal scénario est les ordinateurs portables modernes où 16 ou 32 Go de RAM ne suffisent plus, mais il est impossible de l'étendre. Si une telle machine a une carte RTX dédiée, une partie de la VRAM peut être utilisée comme une couche de swap supplémentaire. Cela ne transforme pas la VRAM en RAM complète, mais peut sauver le système d'un passage brutal au swap SSD lent ou d'un OOM-killer lors de charges de pointe.
Environnements de travail lourds pour les développeurs. IDEs, navigateurs avec des dizaines d'onglets, conteneurs Docker, bases de données locales, compilations de grands projets et environnements de test créent facilement des pics temporaires de consommation de mémoire. Dans un tel scénario, NBD-VRAM peut agir comme un tampon : il ne va pas accélérer le travail habituel, mais atténuer le moment où la RAM est épuisée.
Réduction de la charge sur le swap SSD. Si le swap sur SSD est utilisé fréquemment, cela n'est pas seulement plus lent, mais cela crée également une écriture supplémentaire sur le stockage. Le swap VRAM peut être défini avec une priorité plus élevée, de sorte qu'en cas de surcharge de la RAM, le système déplace d'abord les pages vers la mémoire vidéo, puis accède au SSD. Cela est particulièrement pertinent pour les ordinateurs portables, où le SSD est souvent non amovible ou coûteux à remplacer.
Combinaison avec zram. L'auteur décrit explicitement un schéma où le swap VRAM reçoit une priorité plus élevée et est le premier à subir une « décharge » de mémoire, le zram est utilisé au niveau suivant, et le SSD reste la dernière ligne de défense. Ce schéma peut être utile pour les stations de travail et les ordinateurs portables où il est plus important de maintenir la réactivité du système en cas de manque de mémoire que d'obtenir la prévisibilité maximale des latences.
Tâches locales AI/LLM autour du GPU, mais pas à la place de la VRAM pour le modèle. NBD-VRAM n'augmente pas la mémoire vidéo accessible à l'application CUDA comme VRAM pour le modèle. C'est le scénario inverse : ce n'est pas la RAM utilisée comme VRAM, mais la VRAM utilisée comme swap pour la mémoire ordinaire de Linux. Par conséquent, le projet ne permettra pas de charger directement un modèle plus grand dans le GPU. Mais il peut être utile sur une machine où, en parallèle de l'inférence LLM, fonctionnent un navigateur, un IDE, des indexeurs, des environnements Python et des conteneurs, tandis que la RAM système commence à s'épuiser.
Stations de travail domestiques et expérimentales. Le projet intéresse les utilisateurs dont la carte graphique reste souvent inactive en dehors des jeux, du rendu ou des tâches ML. Par exemple, 8 à 12 Go de VRAM sur une GeForce de bureau peuvent temporairement être transformés en une couche swap supplémentaire pour les lourdes tâches de compilation, de traitement de données ou d'exécution. machines virtuelles.
Restrictions
NBD-VRAM n'est pas un substitut de la mémoire vive. L'accès à ce swap se fait en chaîne kernel swap → /dev/nbdX → pilote nbd → socket Unix → démon → copie CUDA → VRAM, donc les latences et le comportement seront différents de ceux de la vraie RAM. C'est plutôt une couche d'urgence ou de transition entre la RAM et le SSD, qu'un moyen d'« ajouter de la mémoire » sans conséquences.
Le projet est également lié à la pile officielle de NVIDIA avec CUDA. Nouveau/Nova ne conviennent pas, car libcuda.so.1 est requise. Phoronix note également, que NBD-VRAM est spécifiquement conçu pour les GPU NVIDIA grand public, où les approches alternatives via l'API P2P de NVIDIA ne fonctionnent pas.
En fin de compte, NBD-VRAM est un petit mais intéressant hack système pour Linux : il ne fait pas de miracles et ne remplace pas une mise à niveau de la RAM, mais permet d'utiliser la mémoire vidéo inutilisée comme un niveau supplémentaire de swap avant le SSD. Pour les ordinateurs portables avec de la mémoire soudée et une carte RTX discrète, cela peut s'avérer être une solution pratique pour gérer des charges de travail intensives sans que les applications ne s'effondrent immédiatement ou ne ralentissent considérablement vers un support de stockage lent.
Source : linux.org.ru
