上周有个客户找我,说他们要在一台物理机上同时跑4个模型推理的虚拟机,每个实例大概要12G显存,机器上插的是一张24G显存的卡。我听完觉得这事儿挺简单一张卡切4份,每份6G,不就完了?
结果第一台虚拟机一启动就报显存不足,第二台干脆连驱动都起不来。折腾了大半天才发现,我把「切分份数」和「每份能看到的显存」当成了同一件事,而它们根本就是两回事。这篇就把 vGPU 切分这件事从头捋一遍,坑在哪儿、怎么选、怎么排,都写在下面。
如果你也在考虑用一张物理显卡切分成多份给不同虚拟机或容器用,或者需要先找一台带 GPU 的机器把环境搭起来跑通验证,可以先看看这几家的报价和技术说明:interserver(云与裸金属基础设施)

先纠正一个特别常见的误解。切分份数说的是「这块卡能被几个客户同时用」,显存配额说的是「每个客户最多能用多少显存」,这两件事在不同的层面上。
举个最典型的例子:一张 24G 的 A 系列卡,切成 4 份给 4 台虚拟机。每份的显存配额大概是 6G 上下,其中一部分要给虚拟化引擎、显示服务和帧缓冲留位置,真正能给计算用的还要再减一点。所以 4 份 × 6G 这种「完美均分」在现实里基本不存在,你规划容量的时候必须按打完折的数来算。
更麻烦的是,不同的切分档位差别非常大。有的档位给 2G,有的能给 8G,中间还有 3G、4G、5G 这种零碎的档。你要 12G 显存,而这张卡在某个切分模式下最多只能切出 8G 的规格,那这个方案从根上就不成立不管你把驱动重装多少遍都没用。

我第一次配好之后,在虚拟机里跑 nvidia-smi,看到的显存数字是对的:8G 总量,占用统计也对。但客户那边反馈,跑同一个模型时显存会莫名其妙涨上去,最后 OOM。
后来查了一圈才搞明白:在 vGPU 模式下,显存的使用统计和物理上真实隔离是两回事。有的版本里,某个虚拟机短暂用超了配额不会立刻报错,而是会借用其他分区的显存,直到驱动检测到越界才把它打回去。这种行为在测试时看不出来,压测一上来就现原形。
所以我的做法是:给每个实例的容器都设上硬性的显存上限,比如用 CUDA 的 memory fraction 或者框架自带的 max_memory 参数卡死,别指望虚拟化层来兜底。虚拟化层负责分配,业务层负责自律,两边都设才稳。

这是最容易混的地方。vGPU 是虚拟机层面的方案一个 hypervisor 把物理卡切给多台虚拟机,每台里面装的是完整的 NVIDIA 驱动栈,看起来就是「我有一张独立的显卡」。
MIG 是硬件层面的方案A100、H100 这类卡在物理上就带了这个能力,芯片内部可以把 SM(流处理器)和显存控制器真的切成几个互不干扰的物理分区。每个分区有自己独立的显存控制器和缓存,隔离是硬件保证的,不是软件约定出来的。
差别体现在稳定性上。MIG 分区之间基本不会互相影响,一个分区跑崩了不会拖垮另一个。而 vGPU 靠的是驱动层的调度,隔离强度弱一些,出问题的时候你更难定位到底是哪一层出的锅。
如果客户要求的场景是多租户、强隔离、或者要跑延迟敏感的服务,我会优先推 MIG。如果客户只是想把一张卡的成本摊开、跑几个不需要硬隔离的推理任务,vGPU 的性价比和灵活度更好。
说到找机器,如果你需要一台现成的 GPU 主机先把切分环境跑通验证,vpckr(面向 AI 的云与 GPU 基础设施) 这类专注 AI 算力的方案也可以一并看看,节点和网络配置下单前都能先问清楚。

这一条我踩得最冤。前面配置全对,hypervisor 里能看到设备,虚拟机也识别到了,可一启动就报驱动握手失败,日志里全是些看不懂的初始化错误。
排查方向其实很明确:vGPU 的宿主机驱动、虚拟机内的客户机驱动、以及 vGPU Manager 这三者的版本必须严格配套。宿主机升级了驱动,虚拟机里的镜像还是老版本,就必然握手不上。客户那边的虚拟机模板是几个月前做的,宿主机上周刚升级过,这就是根因。
解决办法也不复杂,但很花时间:把所有在跑的虚拟机模板统一升级一遍驱动,打上对应的 guest driver 包,重启验证。宁可一开始就把模板版本统一,也别等到故障了再一台台去修。顺便提一句,虚拟化环境的升级永远要在维护窗口做,因为宿主机驱动升级会触发所有虚拟机的 GPU 设备重挂载。
我现在的判断顺序是这样的:
第一,先确认卡型和切分档位。买之前就把每档的显存配额查清楚,算一下每个实例真正能拿到多少,别拿标称值做规划。
第二,确认隔离需求。真需要硬件级隔离就直接上 MIG 支持的卡型,别在 vGPU 上死磕。
第三,确认驱动版本矩阵,并把它写进文档。这东西不写下来,换个人接手必踩。
第四,业务侧自己也要设显存上限,别指望虚拟化层兜底。
做到这四步,切分这件事基本不会再翻车。我那个客户后来换成了一次性把显存配额调宽的方案,跑了两周稳定得很。
说句实话,vGPU 切分是个挺吃细节的技术。它真正的门槛不在命令怎么敲,而在「哪些参数是可以调的、哪些是硬件定死的」这件事上你得知道自己踩的是哪个坑,才能对症下药。