在 AI 基础设施领域,NVIDIA HGX B200 平台代表了当前最高性能的 GPU 计算架构。然而,其紧密集成的 NVLink/NVSwitch 互连架构在为多 GPU 通信提供极致带宽的同时,也为多租户环境下的 GPU 内存隔离带来了前所未有的挑战。Ubicloud 作为开源云平台,在实现 B200 GPU 虚拟化的过程中,深入探索了从硬件辅助虚拟化到软件栈协同的完整内存隔离技术栈。
HGX B200 架构特点与内存隔离挑战
HGX B200 采用 SXM 模块设计,8 个 GPU 通过 NVLink 直接连接到共享基板,再经由 NVSwitch 模块形成全互联拓扑。这种架构与传统的 PCIe GPU 有着本质区别:在 PCIe 架构中,每个 GPU 是相对独立的设备,可以通过标准的 IOMMU(Input-Output Memory Management Unit)技术实现内存隔离;而在 HGX 架构中,GPU 通过高速互连形成统一的计算单元,内存访问模式更加复杂。
Ubicloud 工程师 Benjamin Satzger 在博客中指出:"B200 HGX 平台的高带宽架构对性能极为有利,但对虚拟化却不如独立的 PCIe GPU 友好。" 这一观察揭示了问题的核心:如何在保持 NVLink 全带宽优势的同时,实现严格的多租户内存隔离。
三种虚拟化模式的内存隔离机制差异
Ubicloud 评估了三种主要的 GPU 虚拟化模式,每种模式在内存隔离方面有着截然不同的实现机制:
1. 完全直通模式(Full Passthrough Mode)
在这种模式下,虚拟机获得对分配 GPU 的直接访问权。对于多 GPU 配置,虚拟机还接管相关的 NVSwitch fabric。内存隔离完全依赖于硬件分区:要么将全部 8 个 GPU 分配给单个 VM,要么禁用 NVLink 并将每个 GPU 作为独立的 PCIe 设备传递。这种模式的隔离性最强,但灵活性最差。
2. 共享 NVSwitch 多租户模式(Shared NVSwitch Multitenancy Mode)
这是 Ubicloud 选择的模式。GPU 被分组到分区中,每个分区就像一个隔离的 NVSwitch 岛。租户可以获得 1、2、4 或 8 个 GPU。分区内的 GPU 保持完整的 NVLink 带宽,而不同分区之间的 GPU 无法交换流量。Fabric Manager 负责路由管理和分区间的隔离执行。
3. vGPU 多租户模式(vGPU-based Multitenancy Mode)
vGPU 使用中介设备切片技术,允许多个 VM 共享单个物理 GPU。GPU 的内存和计算资源被分区,NVLink/NVSwitch 不暴露给客户机。这种模式针对轻量计算工作负载进行了优化,而不是高性能推理或训练工作负载。
GPU 显存页表虚拟化与 DMA 重映射实现
在硬件层面,GPU 内存隔离依赖于多个关键技术组件的协同工作:
GPU 内存页表虚拟化
现代 GPU 拥有自己的内存管理单元(MMU),支持多级页表结构。在虚拟化环境中,需要实现 GPU 页表的嵌套虚拟化:客户机操作系统维护自己的 GPU 页表(gPT),而 hypervisor 维护影子页表(sPT)或使用硬件辅助的第二级地址转换(SLAT)。对于 B200 这样的高性能 GPU,页表转换的性能开销必须最小化。
Ubicloud 在实现中发现,B200 GPU 拥有巨大的 Base Address Registers(BAR),特别是 Region 2 达到了 256GB。当传递 8 个 GPU 时,QEMU 需要映射约 2TB 的虚拟地址空间。早期版本的 QEMU(如 Ubuntu 24.04 中的 8.2 版本)映射这些巨大 BAR 的速度极慢,导致 VM 启动延迟长达数小时。解决方案包括升级到 QEMU 10.1 + 或使用x-no-mmap=true参数禁用 BAR 的 mmap 映射。
DMA 重映射技术
DMA 重映射是确保设备只能访问分配给它的内存区域的关键技术。在传统的 PCIe 环境中,IOMMU 通过将设备发起的 DMA 地址转换为物理地址来实现隔离。但在 HGX B200 的 NVLink 架构中,情况更加复杂:
-
NVLink DMA 隔离:NVSwitch fabric 需要确保来自一个分区的 DMA 请求不能访问另一个分区的内存。这通过在 NVSwitch 路由表中配置访问控制列表(ACL)来实现。
-
Fabric Manager 的角色:Fabric Manager 不仅管理 NVLink 连接,还负责 DMA 重映射策略的执行。当激活一个分区时,Fabric Manager 会配置相应的路由规则,确保分区内的 GPU 可以相互访问,但无法访问其他分区的内存。
-
模块 ID 映射:一个关键细节是,Fabric Manager 使用的 GPU ID 不是 PCI 总线地址,也不是 lspci 列出设备的顺序。相反,GPU ID 源自驱动程序报告的 "Module Id" 字段。Ubicloud 工程师发现:"当将设备传递给 VM 时,必须映射 Fabric Manager GPU 模块 ID→PCI 设备,而不是假设 PCI 顺序。"
内存带宽 QoS 控制与性能隔离策略
内存带宽隔离是多租户 GPU 环境中的另一个关键挑战。即使内存访问在地址空间上是隔离的,如果不同租户的工作负载竞争有限的内存带宽资源,仍然会导致性能干扰。
内存带宽分配机制
NVIDIA GPU 支持内存带宽服务质量(QoS)控制,通过以下机制实现:
-
带宽分区:可以将可用的内存带宽划分为多个逻辑通道,每个通道分配给特定的租户或工作负载。这确保了即使在高负载情况下,每个租户也能获得保证的最小带宽。
-
优先级队列:内存请求可以根据来源进行优先级排序。例如,计算核心的请求可能比 DMA 传输具有更高的优先级,或者关键租户的工作负载可能获得比后台任务更高的优先级。
-
令牌桶算法:通过令牌桶机制限制每个租户的内存访问速率,防止任何一个租户独占所有可用带宽。
CDMM 模式的内存管理创新
对于硬件一致性平台(如 GH200、GB200、GB300),NVIDIA 引入了相干驱动内存管理(CDMM)模式。与传统的 NUMA 模式不同,CDMM 模式让 NVIDIA 驱动程序直接管理 GPU 内存,而不是操作系统。
CDMM 模式对内存隔离有重要影响:
- GPU 内存不暴露给操作系统:在 CDMM 模式下,GPU 内存不会作为软件 NUMA 节点暴露给操作系统,这防止了操作系统意外使用 GPU 内存。
- 驱动程序级隔离:NVIDIA 驱动程序对 GPU 内存拥有完全控制权,可以实现更细粒度的隔离策略。
- Kubernetes 兼容性:CDMM 模式解决了 Kubernetes 中 GPU 内存管理的问题,如内存过度报告、Pod 内存限制错误应用于 GPU 内存等。
Ubicloud 的实践表明,在 Shared NVSwitch Multitenancy 模式下,结合 CDMM 内存管理,可以实现既保持高性能又确保严格隔离的多租户 GPU 环境。
工程实践中的关键参数与监控要点
基于 Ubicloud 的实际部署经验,以下是实现有效 GPU 内存隔离的关键工程参数:
1. PCI 拓扑配置参数
# QEMU配置示例,确保GPU位于PCIe桥后面
-device pcie-root-port,id=rp1 \
-device vfio-pci,host=0000:17:00.0,bus=rp1
# 对于大BAR问题,可选的解决方案
-device vfio-pci,host=0000:17:00.0,bus=rp1,x-no-mmap=true
2. Fabric Manager 分区配置
# 查看所有分区
fmpm -l
# 激活分区3(包含GPU 5-8)
fmpm -a 3
# 停用分区
fmpm -d 3
3. 驱动版本对齐检查
# 主机端检查
dpkg -l nvidia-fabricmanager
# 客户机端检查
dpkg -l nvidia-open
4. 内存隔离监控指标
- GPU 内存使用率:每个分区的独立内存使用统计
- NVLink 带宽利用率:分区内和分区间的带宽监控
- DMA 错误计数:未经授权的内存访问尝试
- 页表转换命中率:GPU MMU 性能指标
性能与隔离的权衡策略
在实际部署中,需要在性能与隔离之间找到平衡点。Ubicloud 的经验提供了以下指导原则:
-
工作负载特征分析:对于需要最高性能的训练工作负载,优先选择 Shared NVSwitch 模式;对于轻量级推理或开发环境,可以考虑 vGPU 模式。
-
分区大小优化:根据工作负载的内存需求动态调整分区大小。B200 的 192GB 显存可以灵活分配给不同规模的 VM。
-
热迁移考虑:在需要 VM 热迁移的场景中,需要考虑内存状态的迁移策略和性能影响。
-
安全边界定义:明确不同租户之间的安全边界,确保即使在一个分区被攻破的情况下,其他分区仍然安全。
未来发展方向
随着 GPU 虚拟化技术的不断发展,GPU 内存隔离机制也在持续演进:
-
硬件增强的隔离:未来的 GPU 架构可能会集成更强大的硬件隔离功能,如加密内存区域、硬件强制访问控制等。
-
动态资源调整:支持在不重启 VM 的情况下动态调整分配给 GPU 的内存大小。
-
跨节点内存池化:在多个 GPU 节点之间实现内存池化,同时保持严格的隔离保证。
-
AI 工作负载感知的隔离:根据 AI 工作负载的特征(如训练、推理、微调)自动优化隔离策略。
结论
NVIDIA HGX B200 平台的多租户 GPU 内存隔离是一个复杂但至关重要的技术挑战。Ubicloud 的开源实现展示了如何通过硬件辅助虚拟化技术、精细的软件栈配置和创新的内存管理策略,在保持高性能的同时实现严格的多租户隔离。
从 GPU 显存页表虚拟化到 DMA 重映射,从内存带宽 QoS 控制到 CDMM 模式的应用,每一层技术都为实现安全、高效的 GPU 云服务提供了关键支撑。随着 AI 工作负载的不断增长和多样化,对这些底层隔离机制的深入理解和优化将变得越来越重要。
对于计划部署多租户 GPU 基础设施的组织,Ubicloud 的经验提供了宝贵的实践指导:从 PCI 拓扑的正确配置到 Fabric Manager 分区的精细管理,从驱动版本对齐到性能监控体系的建立,每一个细节都影响着最终的安全性和性能表现。
资料来源
-
Ubicloud 博客文章:Virtualizing NVidia HGX B200 GPUs with Open Source - 详细介绍了 Ubicloud 在 B200 GPU 虚拟化中的实践经验和技术细节。
-
NVIDIA 技术博客:Understanding Memory Management on Hardware-Coherent Platforms - 深入解析了 CDMM 模式及其在 GPU 内存隔离中的应用。
-
NVIDIA 官方文档:MIG User Guide 和 Fabric Manager 配置指南 - 提供了 GPU 分区和 NVSwitch 管理的技术规范。