NBD-VRAM 已发布

一个开源项目已经发布 NBD-VRAM这样,您就可以将部分 NVIDIA GPU 视频内存用作交换空间。 Linux该项目主要针对内存焊接在主板上的笔记本电脑,这类笔记本电脑的内存无法扩展,但系统配备了独立NVIDIA RTX/GTX显卡,且显存有剩余空间。代码使用C语言和shell脚本编写,并以特定许可证发布。 麻省理工学院简介.

NBD-VRAM 的原理很简单:如果系统已经开始使用 SSD 进行数据交换,那么就可以在 SSD 前面添加一个中间层——显存。作者以笔记本电脑为例进行了说明。 RTX 3070 笔记本电脑8GB显存中,7GB分配给了交换空间。加上RAM、zRAM和SSD交换空间,系统总共拥有约46GB可寻址内存。预计溢出顺序如下:首先使用RAM,然后是用作快速交换空间的显存,接着是zRAM,最后才是SSD。

从技术上讲,NBD-VRAM 并没有添加新的内核驱动程序。一个小型守护进程通过内核分配显卡内存。 CUDA 驱动程序 API然后将其交给核心 Linux 作为块设备通过 新开发银行 — 网络块设备 — 通过 Unix 套接字连接。使用标准 nbd-client 连接后,/dev/nbdX 会出现在系统中,可以使用 mkswap 将其映射为常规交换驱动器,并使用 swapon 启用它。

作者强调,之所以选择这种方法,是因为NVIDIA消费级显卡存在局限性。他指出,如果使用NVIDIA GeForce的P2P API进行更直接的访问,会遇到EINVAL错误,因为相应的功能实际上仅适用于专业级和服务器级显卡。直接访问BAR1也失败了:只能访问映射的一小部分区域,读取其余部分则返回零。NBD方法通过使用标准的CUDA复制操作cuMemcpyHtoD和cuMemcpyDtoH来规避这一限制。

机会

  • 正常使用显存 Linux 交换。 一旦启动,守护进程会将视频内存暴露为 /dev/nbd0 或其他 NBD 设备,内核会将其视为标准块设备。

  • 无需自带内核模块即可运行。 该项目不需要编写、构建和维护单独的内核模块,不使用 NVIDIA 内部驱动程序符号,并且应该能够在内核和驱动程序更新后无需重新构建即可继续运行。

  • 专注于消费级NVIDIA GPU。 要求包括支持 CUDA 的 NVIDIA GPU(包括消费级 RTX/GTX 显卡)、带有 libcuda.so.1 的官方 NVIDIA 驱动程序以及 nbd 内核模块。 Linux需要 nbd-client、gcc 和 make。不需要 CUDA 工具包。

  • systemd 集成。 通过 install.sh 安装会添加 vram-swap-nbd 服务,该服务可以通过 systemctl 启动;安装后,该服务将设置为在启动时自动启动。

  • 设置交换空间大小和优先级。 在 systemd-unit 中,您可以设置 VRAM_SETUP_SIZE_MB(分配的显存上限)和 VRAM_SWAP_PRIORITY(交换设备的优先级)。优先级越高,交换设备越早被使用。 Linux 将使用此交换层。

  • 自动减小请求的大小。 如果所需的 VRAM 量不足,守护进程会尝试以 512 MiB 为单位减少大小,以便仍然分配可用量,例如,如果某些内存已被合成器或图形会话占用。

  • 测试场景。 该存储库包含 test-nbd.sh,用于进行 1 MiB 读/写操作的冒烟测试;以及 test-fill.sh,用于对整个 VRAM 分区进行压力测试。

  • 宣称的性能约为 1,3 GB/s。 在 RTX 3070 笔记本电脑上,作者测量了以 4MB 块连续写入 7GB 的数据,速度约为 1,3GB/s。

应用场景

内存条焊接在主板上的笔记本电脑。 主要应用场景是现代笔记本电脑,它们通常配备 16 或 32 GB 的内存,但又无法扩展。如果这类机器配备了独立 RTX 显卡,则可以将部分显存用作额外的交换层。这虽然不能将显存完全转化为内存,但可以防止系统在高负载下突然切换到速度较慢的 SSD 交换层,或避免因内存不足 (OOM) 而导致的系统崩溃。

繁重的开发人员工作环境。 集成开发环境 (IDE)、打开数十个标签页的浏览器、Docker 容器、本地数据库、大型项目构建以及测试环境都容易造成短期内存消耗峰值。在这种情况下,NBD-VRAM 可以起到缓冲作用:它不会加速日常工作,而是缓解内存耗尽时的冲击。

降低固态硬盘交换负载。 频繁使用固态硬盘 (SSD) 的交换分区不仅会降低系统速度,还会造成不必要的写入操作。可以将显存交换分区的优先级设置为更高,这样当内存 (RAM) 已满时,系统会先将页面刷新到显存,然后再访问 SSD。这对于笔记本电脑尤其重要,因为笔记本电脑的 SSD 通常不可拆卸或更换成本很高。

与 zram 结合。 作者清晰地描述了一种方案:VRAM 交换分区优先级更高,优先处理内存“溢出”;其次使用 zRAM;最后,SSD 作为最后一道防线。这种方案适用于工作站和笔记本电脑,因为在这些应用中,保持系统在内存压力下的响应速度比实现最大程度的延迟可预测性更为重要。

在 GPU 周围执行局部 AI/LLM 任务,但不会取代模型的 VRAM。 NBD-VRAM 不会增加 CUDA 应用程序可用的显存,也不会增加模型的显存容量。情况恰恰相反:不是将 RAM 用作显存,而是将显存用作普通内存的交换空间。 Linux因此,该项目不允许直接将大型模型加载到 GPU 上。但是,对于运行浏览器、IDE、索引器、Python 环境和容器以及 LLM 推理,且系统内存开始不足的机器来说,它可能很有用。

家庭和实验工作站。 该项目对那些显卡在游戏、渲染或机器学习任务之外经常处于闲置状态的用户来说很有价值。例如,桌面 GeForce 显卡上的 8-12 GB 显存可以临时转换为额外的交换层,用于编译、数据处理或运行虚拟机等高负载任务。

限制

NBD-VRAM 并非 RAM 的替代品。访问此交换空间遵循以下流程:内核交换空间 → /dev/nbdX → nbd 驱动程序 → Unix 套接字 → 守护进程 → CUDA 复制 → VRAM,因此其延迟和行为与真正的 RAM 有所不同。它更像是 RAM 和 SSD 之间的备用方案或中间层,而不是一种可以无损“添加内存”的方法。

该项目还依赖于 NVIDIA 的官方 CUDA 堆栈。Nouveau/Nova 不适用于此,因为它们需要 libcuda.so.1。Phoronix 另注NBD-VRAM 是专门为消费级 NVIDIA GPU 设计的,而通过 NVIDIA P2P API 的替代方法在这些 GPU 上不起作用。

总之,NBD-VRAM 是一个虽小但很有趣的系统技巧。 Linux它并不能创造奇迹,也不能取代内存升级,但它的确允许你将闲置的显存用作固态硬盘之前的额外交换空间。对于采用板载内存和独立 RTX 显卡的笔记本电脑来说,这可能是一种应对峰值负载的实用方法,避免应用程序立即崩溃或因硬盘速度慢而导致的内存损耗。

来源: linux.org.ru

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster