virtio-nvgpu 是一个实验性的开源项目,它让 Linux 虚拟机(VM)能够以非同寻常的直接方式访问主机上的 NVIDIA 图形处理器(GPU)。它不会逐条翻译 Vulkan 或 OpenGL 命令,而是在虚拟机与主机之间转发发往 NVIDIA 内核驱动程序的请求。这样,客户机便能运行 NVIDIA 自家的用户态驱动,包括在虚拟机之外使用的相同 Vulkan 和 NVENC 库。

virtio-nvgpu 项目图示:为 KVM 虚拟机提供接近原生性能的 NVIDIA GPU 访问
virtio-nvgpu 项目图片展示了这个用于在 Linux 虚拟机之间共享 NVIDIA GPU 的实验性设备。github.com

开篇段落介绍了 virtio-nvgpu,以及它在 Linux 客户机与主机之间转发 NVIDIA 内核驱动请求的作用。

该设计面向无头流式传输:虚拟机内的合成器在 GPU 上渲染并编码视频,然后只把压缩后的视频流发送给远程客户端。在该项目针对一块 RTX 3060 进行的基准测试中,耗时至少约 2 毫秒的帧与裸机性能相差不超过 2%;一次 12 秒的测试在客户机中使用了 0.37 秒的 CPU 时间,而主机为 0.40 秒。作者还同时运行了四个 720p vkcube 客户机,每个都以 60 Hz 编码 H.264,合并后的速率接近单个客户机的速率。

这一机制比这些数字本身更重要。客户机驱动通过 virtqueue 传递控制请求,而内存映射则让 NVIDIA 的用户态驱动能够提交渲染工作,无需让每次绘制调用都跨越虚拟机边界。主机端设备会翻译驱动请求参数,并把客户机句柄映射到主机设备文件。这不同于 API 级翻译,因为后者必须序列化并重放大量图形调用;也不同于把整块 GPU 专门分配给一个虚拟机。

现有证据范围很窄,而且来自该项目的 README。它覆盖的是一种合成负载,主要使用 RTX 3060 和驱动 595.99.02;RTX A2000 能够渲染,但没有进行基准测试。作者表示,除设备枚举之外的 CUDA 尚未经过测试,尚未尝试超过四个客户机,八个客户机的情况仍属未知。用于承载真实设备访问的、按客户机隔离的 helper 目前只是设计说明,因此当前后端运行在虚拟机监视器的进程内。

驱动兼容性是另一项限制。NVIDIA 内核驱动程序的应用二进制接口(ABI)——驱动请求所依赖的二进制契约——会随版本发布而变化。因此,virtio-nvgpu 为选定的驱动范围提供显式配置文件,并拒绝任何低于 535.129.03 的版本,而不是猜测未知请求的布局。其实际前景是面向流式传输的高效 GPU 共享,但 README 并未证明其具备生产级隔离能力、广泛的应用程序兼容性,或有限测试之外的性能。