virtio-nvgpu:在 KVM 客户机里接近原生地使用英伟达 GPU
nestrilabs 的 virtio-nvgpu 尝试在 KVM 客户机内提供接近原生的英伟达 GPU 访问。本文梳理 GPU 虚拟化几条路线的取舍,以及这个项目目前能确认与不能确认的部分。
虚拟化 GPU 的老难题
想在虚拟机里用上 GPU,过去只有几种选择,每一种都要付出代价。最直接的是 PCIe 直通:把整块显卡交给一台虚拟机独占,性能几乎不掉,代价是这块卡从此只服务那台机器,别人只能排队。SR-IOV 和英伟达的 vGPU 把一块物理卡切成多个实例,缓解了独占的矛盾,但它们依赖特定型号的数据中心卡,还要处理授权。MIG 把切分做到了硬件层,同样限定在较新的加速卡上。另一条路是在 API 层做转发,拦截 CUDA 调用送回宿主机执行,隔离更干净,代价是兼容性要一直追着驱动跑,延迟也不透明。
nestrilabs 的 virtio-nvgpu 把主张写进了名字:在 KVM 客户机内提供接近原生的英伟达 GPU 访问。前缀 virtio 提示了它的技术路线——客户机看到的是一个虚拟设备,物理硬件留在宿主机一侧,由后端代为调度。
virtio 这条路意味着什么
virtio 是 Linux 世界里成熟的半虚拟化框架,设备有公开规范,客户机装对应的前端驱动,宿主机跑后端。virtio-gpu 在显示领域已经用了很多年,把帧缓冲、光标、显示模式这些操作抽象成协议。计算任务完全是另一回事:显存对象、命令提交、同步原语、多进程上下文,每一项都要在前后端之间定义清楚。协议设计得粗糙,损耗就会落在每一次内核启动和每一次张量拷贝上。“接近原生”这四个字,衡量的正是这些环节。
还有一层是英伟达自己的驱动栈。CUDA 闭源,用户态库和内核模块耦合得很紧,宿主机要在中间替客户机执行计算,就得做一层转换。这层转换既要跟上驱动版本的发布节奏,又不能改变程序看到的行为。对一个开源项目来说,能不能长期跟住这条节奏,往往比第一版能不能跑通更决定命运。
现在能确认的与不能确认的
项目在 Hacker News 上得到 95 分和 45 条评论,说明确实有人盯着这个方向。公开信息目前基本停在仓库本身,具体的设备模型、支持的 GPU 型号、性能数字、许可证安排,都需要去看代码和文档,这里不做推测。
可以确定的是它切入的缝隙真实存在。眼下跑推理和微调的团队,很多用容器加直通卡,多租户之间的隔离主要靠信任和调度器,硬件层面的边界并不存在。如果 virtio 这条路能把边界找回来,同时把开销压到可以接受,对私有云和公司内部平台的吸引力会很直接,因为这些场景里,任务的可信度和资源的可回收性,比峰值算力更常被提及。
会不会成为标准,取决于两件事:上游社区愿不愿意接纳一个新的 virtio 设备类型,以及英伟达的态度。前者关乎生态能走多远,后者关乎能不能合法、稳定地维护下去。仓库还年轻,记下来就够了,结论不必现在下。