Projeto aberto publicado NBD-VRAM, permitindo que uma parte da VRAM da GPU NVIDIA seja utilizada como espaço de swap no Linux. O projeto é focado principalmente em notebooks com memória RAM soldada, onde a RAM não pode ser expandida, mas, ao mesmo tempo, o sistema possui uma GPU NVIDIA RTX/GTX com VRAM ociosa. O código é escrito em C e shell, e é distribuído sob a licença MIT.
A ideia do NBD-VRAM é simples: se o sistema já começa a usar swap no SSD, pode-se colocar uma camada intermediária antes do SSD — a VRAM. O autor traz como exemplo um notebook com RTX 3070 Laptop: dos 8 GB de VRAM, 7 GB foram alocados para swap, e, somando com a RAM, zram e swap SSD, o sistema obteve cerca de 46 GB de memória endereçável. A ordem presumida de preenchimento é a seguinte: primeiro usa-se a RAM, depois a VRAM como swap rápido, então a zram, e só então o SSD.
Tecnicamente, o NBD-VRAM não adiciona um novo driver do kernel. Um pequeno daemon aloca a memória da GPU através da CUDA Driver API, que então a fornece ao kernel Linux como um dispositivo de bloco através do NBD — Dispositivo de Bloco de Rede — sobre um socket Unix. Após a conexão, o cliente nbd padrão aparece no sistema como \/dev\/nbdX, que pode ser formatado como um swap comum através de mkswap e ativado através de swapon.
O autor enfatiza que essa abordagem foi escolhida devido às limitações das placas de vídeo NVIDIA para consumidores. Um caminho mais direto através da NVIDIA P2P API nas GeForce, segundo ele, esbarra em EINVAL, já que as funcionalidades correspondentes estão disponíveis apenas para modelos profissionais e servidores. A opção de acesso direto ao BAR1 também não funcionou: apenas uma pequena área mapeada está disponível, e a leitura de outras partes retorna zeros. A abordagem NBD contorna essa limitação, pois utiliza as cópias CUDA comuns cuMemcpyHtoD e cuMemcpyDtoH.
Recursos
Uso da VRAM como swap Linux comum. Após a inicialização, o daemon fornece a VRAM como \/dev\/nbd0 ou outro dispositivo NBD, que para o kernel parece um dispositivo de bloco padrão.
Operação sem um módulo de kernel próprio. O projeto não requer a escrita, compilação ou manutenção de um módulo do kernel separado, não utiliza símbolos internos do driver NVIDIA e deve suportar atualizações do kernel e do driver sem recompilação.
Foco em GPUs NVIDIA para consumidores. Os requisitos incluem GPU NVIDIA com suporte a CUDA, incluindo placas RTX/GTX para consumidores, driver oficial da NVIDIA com libcuda.so.1, módulo nbd no núcleo do Linux, nbd-client, gcc e make. O CUDA Toolkit não é necessário.
Integração com systemd. A instalação via install.sh adiciona o serviço vram-swap-nbd, que pode ser iniciado através do systemctl; após a instalação, o serviço é habilitado para iniciar automaticamente na inicialização.
Configuração do tamanho e prioridade do swap. No unit do systemd, pode-se definir VRAM_SETUP_SIZE_MB, ou seja, o limite superior da VRAM alocada, e VRAM_SWAP_PRIORITY, que determina a prioridade do dispositivo de swap. Quanto maior a prioridade, mais cedo o Linux usará essa camada de swap.
Redução automática do tamanho solicitado. Se o volume de VRAM necessário não estiver disponível, o daemon tentará reduzir o tamanho em blocos de 512 MiB, para ainda alocar o volume disponível, por exemplo, se parte da memória já estiver ocupada por um compositor ou sessão gráfica.
Scripts de verificação. No repositório, há test-nbd.sh para um teste de fumaça com leitura/escrita de 1 MiB e test-fill.sh para estresse em toda a partição de VRAM.
Desempenho declarado em torno de 1,3 GB/s. Na RTX 3070 Laptop, o autor mediu gravação sequencial de 7 GB em blocos de 4 MB, aproximadamente em 1,3 GB/s.
Cenários de aplicação
Notebooks com RAM embutida. O principal cenário é notebooks modernos, onde 16 ou 32 GB de RAM já não são suficientes, mas a expansão não é possível. Se tal máquina possui uma placa RTX discreta, parte da VRAM pode ser utilizada como camada de swap adicional. Isso não transforma VRAM em RAM completa, mas pode salvar o sistema de uma transição abrupta para o swap lento em SSD ou de OOM-killer sob cargas máximas.
Ambientes de trabalho pesados para desenvolvedores. IDE, navegador com várias abas, contêineres Docker, bancos de dados locais, compilações de grandes projetos e ambientes de teste facilmente geram picos temporários de consumo de memória. Nesse cenário, o NBD-VRAM pode atuar como um buffer: não acelera o trabalho habitual, mas suaviza o momento em que a RAM acabou.
Redução da carga no swap do SSD. Se o swap no SSD for utilizado com frequência, isso não só é mais lento, mas também cria gravações desnecessárias no dispositivo. O swap de VRAM pode ser configurado com uma prioridade mais alta, para que, ao esgotar a RAM, o sistema primeiro mova as páginas para a memória de vídeo antes de recorrer ao SSD. Isso é especialmente relevante para notebooks, onde o SSD também costumava ser não removível ou caro para substituição.
Combinação com zram. O autor descreve diretamente um esquema onde o swap de VRAM recebe prioridade mais alta e aceita a primeira "descarga" de memória, com o zram sendo utilizado em seguida, enquanto o SSD permanece como a última linha de defesa. Esse esquema pode ser útil para estações de trabalho e notebooks, onde é mais importante manter a responsividade do sistema em situações de falta de memória do que obter a máxima previsibilidade nos atrasos.
Tarefas locais de AI/LLM em torno da GPU, mas não substituindo a VRAM para o modelo. O NBD-VRAM não aumenta a memória de vídeo disponível para a aplicação CUDA como VRAM para o modelo. Este é um cenário inverso: não é a RAM que é utilizada como VRAM, mas a VRAM que é utilizada como swap para a memória comum do Linux. Portanto, o projeto não permitirá carregar diretamente no GPU um modelo de maior tamanho. Porém, pode ser útil em uma máquina onde, junto ao LLM-inferência, trabalham navegador, IDE, indexadores, ambientes Python e containers, e a RAM do sistema começa a acabar.
Estações de trabalho domésticas e experimentais. O projeto é interessante para usuários cuja placa de vídeo frequentemente fica ociosa fora de jogos, renderização ou tarefas de ML. Por exemplo, 8–12 GB de VRAM em uma GeForce desktop podem ser temporariamente convertidos em uma camada adicional de swap para tarefas pesadas de compilação, processamento de dados ou execução. máquinas virtuais.
Restrições
O NBD-VRAM não substitui a memória RAM. O acesso a esse swap segue a cadeia kernel swap → /dev/nbdX → driver nbd → soquete Unix → daemon → cópia CUDA → VRAM, portanto, as latências e o comportamento serão diferentes da verdadeira RAM. É mais uma camada de emergência ou intermediária entre RAM e SSD do que uma maneira de "adicionar memória" sem consequências.
O projeto também está vinculado ao stack oficial da NVIDIA com CUDA. Nouveau/Nova não são adequados para isso, pois requerem libcuda.so.1. A Phoronix também observa, que o NBD-VRAM foi criado especificamente para GPUs NVIDIA de consumo, onde abordagens alternativas através do NVIDIA P2P API não funcionam.
No final, o NBD-VRAM é um hack de sistema pequeno, mas interessante para Linux: ele não realiza milagres e não substitui um upgrade de RAM, mas permite utilizar a memória de vídeo ociosa como um nível adicional de swap antes do SSD. Para laptops com memória soldada e placas RTX discretas, isso pode ser uma forma prática de suportar picos de carga sem que os aplicativos falhem imediatamente ou que o sistema fique lento ao acessar o armazenamento.
Fonte: linux.org.ru
