Skip to main content

1. 背景介绍

1.1 为什么需要vGPU?

在当下的AI/ML应用实践中,我们能明显感受到两股趋势的并行发展:

小模型推理场景:传统的小模型推理与部署方兴未艾,它们在推荐系统、实时预测、路径优化等业务中依然有着广阔的应用场景。然而,这类服务往往只需要2-4GB显存,却独占24GBGPU卡,导致资源利用率低下,造成严重的资源浪费。

大模型部署场景:以大语言模型为代表的大模型部署正在快速兴起,对GPU多卡资源算力弹性的要求越来越高。在多租户环境下,缺乏有效的资源隔离机制,资源碎片化导致大任务无法调度。

这两个场景共同面临的核心问题是:如何在云原生环境下实现GPU资源的高效利用、精细化共享与隔离?

1.2 vGPU的核心价值

vGPU(虚拟GPU)技术通过将物理GPU虚拟化为多个逻辑GPU,具有以下优势:

  • 资源利用率显著提升:通过将单张GPU卡虚拟化为多个逻辑GPU,让多个小任务可以共享同一张物理GPU卡,大幅提高GPU的实际使用率,减少资源闲置。

  • 成本优化:在相同的工作负载下,通过提高单卡利用率,可以减少所需的物理GPU数量,从而降低硬件采购和运维成本。

  • 灵活的资源管理:支持为每个任务精确分配显存和算力配额,实现细粒度的资源控制。可以根据业务需求动态调整资源分配策略,提高资源使用的灵活性。

  • 多租户隔离保障:提供硬件级或软件级的资源隔离机制,确保不同租户或任务之间互不干扰。配合完善的配额管理和监控能力,为生产环境提供可靠的多租户支持。

vGPU的核心价值

2. 业界主流vGPU方案对比

2.1 主流方案分类

业界vGPU方案目前可划分为以下几类:

分类代表方案实现层次开源情况
NVIDIA官方方案MPSMIG硬件 + 驱动层闭源
用户态API劫持HAMiCUDA Runtime开源
内核态API劫持阿里云cGPU、腾讯云qGPU内核驱动层闭源
硬件虚拟化NVIDIA vGPU硬件虚拟化层闭源商业

以英伟达的GPU为例,GPU虚拟化技术从硬件到软件的实现可以分为三个层次:用户态、内核态和硬件层。

GPU虚拟化技术

  • 用户态:应用程序通过CUDA API编写并行计算任务,并通过CUDA APIGPU的用户态驱动进行通信。在这个层次,用户态虚拟化可以通过拦截和转发标准接口(如CUDA APIOpenGL等)来实现。
  • 内核态:此层主要运行GPU的内核态驱动程序,它与操作系统内核紧密集成,受到操作系统以及CPU硬件的保护。内核态虚拟化方案通常通过拦截如ioctlmmapreadwrite 等内核态接口来实现GPU资源的虚拟化。
  • 硬件层:硬件虚拟化层,如英伟达的MIGMulti-Instance GPU),可以直接在硬件级别进行GPU资源的划分与管理。

2.1.1 用户态虚拟化

用户态虚拟化利用标准的接口(如CUDAOpenGL),通过拦截和转发API调用,将请求解析并转发给硬件厂商提供的用户态库中的相应函数。

用户态虚拟化

优点:

  • 兼容性强:基于CUDA Runtime APIOpenGL等标准化接口实现,无需修改内核或依赖特定硬件特性,适用于NVIDIA Pascal架构及以上的各类GPU(包括数据中心级和消费级),同时支持多厂商异构算力(如华为昇腾、寒武纪、海光等)。
  • 安全性高:运行在用户态空间,通过LD_LIBRARY_PATHLD_PRELOAD机制注入劫持库,不涉及内核态代码修改,避免了系统级安全漏洞和kernel panic风险,符合企业安全合规要求。
  • 最小侵入性:部署方式对现有环境零侵入,无需重启节点或修改操作系统内核,仅需在容器运行时注入劫持库,支持热部署和快速回滚,适合企业生产环境的敏捷迭代。
  • 跨平台兼容性好:不依赖特定Linux内核版本,可在CentOSRHELUbuntuDebianKylin等主流操作系统上无缝运行,无需针对不同内核版本单独适配。
  • 部署和维护成本低:不破坏现有IT基础架构,无需专业内核开发团队维护,运维人员仅需掌握容器和Kubernetes知识即可管理,降低了人力成本和技术门槛。
  • 开源生态成熟:以HAMi为代表的开源项目拥有活跃社区支持,用户可自主定制和优化,避免厂商锁定,且与KubernetesVolcano等云原生生态深度集成。
  • 支持统一内存:通过劫持CUDA Unified Memory API,支持GPU显存与主机内存的动态交换,突破单卡显存限制,提升大模型推理场景下的资源利用率。
  • 灵活的资源配置:支持任意粒度的显存和算力分配(如3000MB显存 + 50%算力),不受硬件固定规格限制(如MIG的固定切分比例),适应多样化的业务需求。

缺点:

  • 性能开销相对较高:每次CUDA API调用都需要经过劫持库的拦截、解析和转发,相比内核态方案增加了用户态函数调用开销,性能损耗约10%(内核态约5%),在高频API调用场景(如小算子密集型推理)下影响更明显。
  • 算力隔离为软限制:通过时间片轮转或CUDA Stream优先级实现算力限制,无法像MIG那样在硬件层面预留专用SM(流式多处理器),极端情况下可能出现算力抢占或饥饿问题。
  • 部分CUDA特性支持受限:对于直接操作硬件的底层CUDA Driver API(如cuMemMapcuMemAddressReserve等)或特殊特性(如CUDA Graphs的某些高级用法),劫持库可能无法完全覆盖,存在兼容性风险。
  • 调试复杂度增加:劫持库的引入使得应用调用栈变长,当出现CUDA错误或性能问题时,需要同时排查应用代码、劫持库和CUDA驱动三层逻辑,增加了故障定位难度。

2.1.2 内核态虚拟化

内核态API拦截和转发方案的核心机制为:在内核空间新增驱动模块,为容器虚拟化GPU设备,通过劫持容器对GPU Driver的原生调用(如ioctlmmapreadwrite 等),严格限制显存,时分复用算力,实现多任务共享同一物理GPU。这种技术方案主要运行在操作系统的内核态中,因此其安全性和稳定性较为复杂。

内核态虚拟化

优点:

  • 性能开销更低:在内核态直接拦截ioctl等系统调用,相比用户态方案减少了一层API解析和转发开销,性能损耗约5%(用户态约10%)。
  • 更底层的资源控制:直接在内核驱动层实现资源管理,能够更精细地控制显存分配、算力调度和GPU上下文切换。
  • 强隔离能力:通过内核态的权限隔离机制,能够提供更强的资源隔离保障,防止容器间的资源竞争和越界访问。
  • 硬件无关性:不依赖特定GPU硬件特性(如MIG),理论上可支持各类数据中心级和消费级GPU

缺点:

  • 极高的系统侵入性:需要在Linux内核中插入自定义驱动模块,直接修改内核态代码路径,对操作系统的侵入性极大,可能引入系统级安全漏洞和稳定性风险。
  • 内核版本兼容性问题:不同Linux内核版本(如3.x4.x5.x6.x)的内核API和数据结构差异巨大,需要针对每个版本单独适配和维护,开发和测试成本极高。
  • 企业环境落地困难:国央企、金融、能源等行业的IT架构复杂,操作系统版本多样化(CentOSRHELUbuntuKylin等),内核定制化程度高,统一部署和管理难度极大。
  • 安全合规风险:内核态代码需要root权限加载,在金融、医疗、政府等高安全性行业难以通过安全审计和合规认证(如等保三级、PCI-DSS等)。
  • 法律和可持续性风险:部分方案涉及对NVIDIA专有驱动的逆向工程,存在知识产权侵权风险,可能被GPU厂商通过驱动更新封堵,影响长期可用性和商业化落地。
  • 维护成本高昂:需要持续跟进操作系统内核更新、GPU驱动版本升级,以及不同云平台(公有云、私有云、混合云)的环境适配,运维团队需要具备深厚的内核开发能力。
  • 故障排查复杂:内核态代码出现bug可能导致系统崩溃(kernel panic)、死锁或数据损坏,排查和修复难度远高于用户态方案,影响生产环境稳定性。
  • 开源生态缺失:目前主流内核态方案(如阿里云cGPU、腾讯云qGPU)均为闭源商业产品,缺乏开源社区支持,用户无法自主定制和优化,存在厂商锁定风险。

2.1.3 远程资源调用

近年来,远程GPU调用(Remote GPU)方案备受关注,它允许用户在一台CPU服务器上远程访问另一台服务器上的GPU资源,看上去能解决资源碎片化问题。

远程GPU资源调用

然而,在现代 AI 应用(尤其是大模型、小模型混合训练和推理)背景下,远程GPU资源调用几乎不可用,原因包括:

  • 数据传输瓶颈: 大模型训练涉及PB级数据,远程调用GPU需要在CPUGPU之间频繁传输数据,带宽和延迟问题导致性能严重下降。远程GPU调用需要通过网络传输数据,特别是对于计算密集型任务(如大规模的神经网络推理),网络延迟将极大影响性能,甚至导致任务无法及时完成。此外,大模型和小模型的训练过程中需要高效的同步机制,远程调用会导致数据同步效率低下,影响模型训练的效果与效率。
  • 计算密集型任务难以拆分: AI 训练任务通常需要多GPU互相通信(如AllReducePipeline 并行),远程GPU之间的通信成本远超本地GPU。远程调用GPU资源意味着大量数据需要在网络中传输,对于带宽要求极高。尤其是在大规模训练和推理任务中,带宽瓶颈往往会成为性能的瓶颈。
  • 小模型推理的实时性要求: 对于小模型的推理任务,远程调用的通信延迟远大于计算时间,导致整体效率大幅下降。

因此,尽管远程GPU调用在某些场景下具有一定的吸引力,但在实际操作中,它通常会面临性能瓶颈和资源调度问题,特别是在现代AI应用中,几乎不可行。

2.2 详细方案对比

2.2.1 常见虚拟化方案比较

说明:本方案对比不包含阿里云cGPU、腾讯云qGPU等内核态API劫持方案,由于其数据不明,且存在一定的使用限制,不纳入考虑范围。NVIDIA MPS仅考虑Volta MPS,不考虑旧版本的Pre-Volta MPS

维度NVIDIA MPS (Volta)NVIDIA MIGHAMi
隔离性
显存隔离⚠️ 地址空间隔离✅ 硬件隔离✅ 软件硬隔离
算力隔离⚠️ 软限制(不预留专用SM)✅ 硬件隔离⚠️ 软限制
进程崩溃影响⚠️ 有限隔离✅ 完全隔离✅ 仅影响自身
内存越界保护✅ 有保护✅ 硬件保护✅ 有保护
性能
性能开销⚠️ 约5%✅ 极低( < 3%)⚠️ 约10%
上下文切换✅ 快速✅ 极快⚠️ 中等
并发效率✅ 高⚠️ 中等✅ 高
易用性
部署复杂度✅ 简单⚠️ 需要配置⚠️ 需安装组件
容器化支持✅ 原生支持✅ 原生支持✅ 原生支持
配置灵活性⚠️ 支持资源配额⚠️ 固定规格✅ 非常灵活
监控可观测性⚠️ 有限(仅看到MPS Server)✅ 完善✅ 完善
兼容性
GPU型号支持⚠️ Volta+⚠️ A100/H100+Pascal+
CUDA版本要求✅ 无特殊要求⚠️ 11.0+⚠️ 特定版本
应用兼容性✅ 透明✅ 透明⚠️ 大部分兼容
客户端连接数⚠️ 最多48个⚠️ 取决于MIG配置✅ 无限制
成本
软件成本✅ 免费✅ 免费✅ 开源免费
硬件要求⚠️ Volta+架构⚠️ 特定GPU✅ 无特殊要求
维护成本⚠️ 中等✅ 低✅ 低
其他
开源情况❌ 闭源❌ 闭源✅ 开源
社区活跃度⚠️ 官方支持⚠️ 官方支持✅ 活跃

性能测试参考数据来源:

  • NVIDIA MPS: 基于NVIDIA官方GROMACS测试,在8-GPU DGX A100上运行多个模拟可提升1.3-1.8倍吞吐量,性能开销<5%来源
  • NVIDIA MIG: 某些场景下MIG+MPS组合比纯MPS高约7%,但存在5-15%的硬件分区开销。来源
  • HAMi: 基于ai-benchmarkTesla V100上的测试数据,用户态API劫持性能开销约10%来源

注意: 不同方案之间缺乏统一标准的直接对比测试,实际性能因工作负载类型、GPU型号和配置而异,上述数据仅供参考。

2.2.2 NVIDIA MPS的缺点

NVIDIA MPS的核心是在CUDA RuntimeCUDA Driver之上引入了MPS服务层,把多个进程的CUDA内核请求合并并下发给GPU,使得多个CUDA进程(或多个容器内的进程)能够共享GPUSM(即算力部分),从而避免了CUDA Context频繁上下文切换,实现GPU利用率的提升。

NVIDIA MPS流程

NVIDIA MPS分为两个版本:

  • Pre-Volta MPS:适用于Volta架构之前的GPU(如PascalKepler等)
  • Volta MPS:从Volta架构开始引入(如V100A100H100等),提供了增强的隔离能力

Volta架构是NVIDIA2017年推出的GPU架构。一些消费级显卡如4090/4090D均是属于Volta以后的架构。以下均以Volta MPS技术方案为介绍。

Volta MPS虽然相比Pre-Volta MPS在隔离性方面有显著改进(提供了完全的地址空间隔离和有限的错误隔离),但在实际生产环境中仍存在以下关键限制:

  • 显存配额管理复杂

    • 虽然支持通过CUDA_MPS_PINNED_DEVICE_MEM_LIMIT环境变量设置显存硬限制(超过限制会返回OOM错误)
    • 但需要在客户端启动前通过环境变量或MPS控制接口预先配置,无法动态调整
    • 根据 NVIDIA MPS官方文档,配置管理复杂,需要为每个客户端单独设置,不适合大规模多租户场景
  • 算力隔离是软限制

    • 根据官方文档明确说明:Setting the limit does not reserve dedicated resources(设置限制不会预留专用资源)
    • 不同客户端的内核可能在同一SM上执行,无法保证严格的算力配额
    • 不适合需要SLA保障的商业场景
  • 客户端故障隔离不完善

    • 单个客户端的致命错误(如非法内存访问、内核崩溃)会影响与故障GPU有共同客户端的所有GPU
    • 例如:系统有GPU 0/1/2,客户端A使用GPU 0,客户端B使用GPU 0+1,客户端C使用GPU 1,客户端D使用GPU 2。如果客户端A触发故障:
      • 故障会被隔离在GPU 0GPU 1(因为它们共享客户端B
      • 客户端ABC都会收到故障通知(无法指明是A触发的)
      • 客户端D不受影响,继续正常运行
      • MPS Server状态变为FAULT,拒绝新客户端连接(返回CUDA_ERROR_MPS_SERVER_NOT_READY
      • 必须等待ABC全部退出后,Server才能重建GPU 0GPU 1的上下文并恢复服务
    • 根据 NVIDIA MPS官方文档,这种设计意味着一个有bug的客户端可能导致多个GPU上的所有任务失败,不适合多租户生产环境
  • 资源监控困难

    • nvidia-smi只能看到MPS Server进程,无法查看各客户端的实际资源使用
    • 缺少细粒度的资源使用监控和告警能力

适用场景

  • ✅ 适合:可信任的单一应用多进程、开发测试环境、对隔离性要求不高的场景、使用Volta+架构GPU的环境。
  • ❌ 不适合:多租户生产环境、关键业务推理服务、需要严格资源配额和故障隔离的场景、需要硬件级隔离保障的场景。

2.2.3 NVIDIA MIG的缺点

NVIDIA MIGNVIDIAA100H100等新一代GPU提供的一种软硬件一体化的GPU/显存隔离技术。硬件层面,可以将SM + L2 Cache + 内存控制器 + IO 通道切割成多个独立MIG单元,每个单元就是一个独立的GPU实例,从应用和容器视角看就获得一张小GPU资源;从软件层面,在nvidia driver中增加了MIG driver,实现对支持隔离的硬件的调用,从而实现端到端的GPU虚拟化

该方案在多租户场景下,虽然能够保证显存和算力的强隔离,但仅支持部分高端GPU(如A100/H100),对常见的T4A10不适用。

NVIDIA MIG演进

其主要缺点如下:

  • 硬件支持受限:仅支持A100H100等高端GPU型号,对于使用V100T4等较早型号GPU的用户无法使用。
  • 分区规格固定MIG实例的划分规格是预定义的(如1g.5gb2g.10gb等),无法根据实际需求灵活调整显存和算力比例。
  • 配置复杂度高:需要在GPU驱动层面进行MIG模式配置,涉及GPU重启和实例创建,操作相对复杂。
  • 资源利用率问题:由于分区规格固定,可能出现资源碎片化,例如剩余的小规格实例无法满足大任务需求。
  • 动态调整困难MIG实例一旦创建,调整配置需要销毁重建,不支持在线动态调整资源分配。

适用场景

  • ✅ 适合:多租户生产环境、需要强隔离保障的场景、高端GPU集群。
  • ❌ 不适合:需要灵活资源配置的场景、使用非A100/H100系列GPU的环境、频繁调整资源配额的场景。

3. HAMi开源项目介绍

具体请参考:HAMi vGPU介绍及原理分析

4. 参考资料