vGPU架构

要设置NVIDIA vGPU设备,需要:

  • 为GPU设备获取和安装对应的NVIDIA vGPU驱动

  • 创建 mediated (协调) 设备

  • 将mediated设备分配给虚拟机

  • 在虚拟机中安装guest驱动

要使用 NVIDIA Virtual GPU (vGPU) ,物理主机和操作系统需要 激活 虚拟化扩展 (Virtualization extensions):

要使用 NVIDIA Virtual GPU (vGPU) ,物理主机和操作系统需要 激活 虚拟化扩展 (Virtualization extensions),这样才能达到足够大虚拟化性能:

  • 对于Intel硬件Virtualization extensions 是 Intel VT(Virtualization Technology)

  • 对于AMD硬件Virtualization extensions 是 AMD-V

  • 注意核对CPU和主板都支持硬件虚拟化(现代CPU应该都支持,但要注意BIOS开启虚拟化),并且在启动内核参数添加:

    intel_iommu=on iommu=pt
    

软件准备

备注

NVIDIA® Virtual GPU (vGPU) Software Documentation 提供了NVIDIA发布的vGPU版本对照表:

  • NVIDIA每个vGPU软件系列都有配套的软件版本:

    • vGPU Manger

    • Linux Driver

    • Windows Driver

例如vGPU软件12.2版本于2021年4月发布,包含(对应于 Virtual Machine with vGPU Unlock for single GPU desktop 提供的 NVIDIA-Linux-x86_64-460.73.01-grid-vgpu-kvm-v5.run ):

  • vGPU Manager 460.73.02

  • Linux Driver 460.73.01

  • Windows Driver 462.31

  • 一些GPU支持 display-offdisplay-enabled 模式,但是对于NVIDIA vGPU,则必须部署在 display-off 模式,所以此时需要做模式切换(我理解就是不能有物理显示输出,必须切换成类似Tesla这样的无显示输出数据计算卡模式): Tesla M60 and M6 GPU 支持计算模式和显示模式,可以通过vGPU软件包中的 gpumodeswitch 工具进行切换(其他型号GPU卡没有这个功能和需求,例如我的 Nvidia Tesla P10 GPU运算卡 就只有计算模式,没有图形模式,所以无需切换)

NVIDIA vGPU使用方式

按照NVIDIA官方技术方案,是将 vGPU 使用方式分为3种:

  • NVIDIA vGPU: 在vGPU模式下,多个虚拟机并发使用同一个物理GPU,在物理服务器上安装了NVIDIA显卡驱动(GRID驱动),而虚拟机也使用物理服务器上相同的显卡驱动

  • GPU Pass-Through: 实际上就是 IOMMUVFIO - Virtual Function I/O 技术,你甚至可以不 安装NVIDIA Virtual GPU Manager 就能通过 Open Virtual Machine Firmware(OMVF) 方式获得。不过NVIDIA官方的 vGPU Manager方便了GPU Pass-Through的管理(不需要类似 采用OVMF实现passthrough GPU和NVMe存储 通过内核参数来passthrough)

    • 限制: 需要将整块GPU卡直通给 一个 虚拟机,所以不能在多个VM间共享GPU

  • Bare-Metal部署: 在裸金属部署模式,通过vWS和vApps licenses 来使用NVIDIA vGPU软件驱动,可以提供远程虚拟机桌面和应用。对于这种模式,可以直接使用Tesla卡而无需hypervisor配合,此时只需要NVIDIA vGPU软件图形驱动即可(其实就是在物理主机安装NVIDIA驱动)

补充(新技术及硬件结合):

  • GPU for MIG-Backed vGPU: 采用MIG模式配置GPU可以实现 Sigle Root I/O Virtualization(SR-IOV) 方式,但是需要采用 NVIDIA Ampere 以上架构(最新的 Ampere架构A100 / Hopper架构H100),目前对个人来说遥不可及(实际上2022年中美摩擦已经对中国禁止了)

备注

作为物理主机的主显示输出的GPU卡不能使用NVIDIA vGPU部署或者GPU Pass-Through,否则会导致显示无输出。也就是说,实际上vGPU部署都是需要在第二块显示卡上才可以配置。

备注

NVIDIA的vGPU是一种封闭的私有 GPU虚拟化 技术,实际上 NVIDIA GPU 也支持 Sigle Root I/O Virtualization(SR-IOV) ,称为 NVIDIA Multi-Instance GPU (MIG) ,但现定于目前最高端的Ampere为架构数据中心卡 A30, A100, H100 (中美冲突已禁售)

vGPU配置示例

../../_images/mig-with-vgpu-overview.png

NVIDIA vGPU配置示例

NVIDIA vGPU软件功能:

NVIDIA vGPU支持多种主要的API:

  • Open Computing Language (OpenCL™ software) 3.0

  • OpenGL® 4.6

  • Vulkan® 1.3

  • DirectX 11

  • DirectX 12 (Windows 10)

  • Direct2D

  • DirectX Video Acceleration (DXVA)

  • NVIDIA® CUDA® 12.0

  • NVIDIA vGPU software SDK (remote graphics acceleration)

  • NVIDIA RTX (on GPUs based on the NVIDIA Volta graphic architecture and later architectures)

备注

当使用NVIDIA vGPU软件的图形驱动时,一定要避免安装针对软件发行版的独立安装软件包,也就是不能同时 安装NVIDIA Linux驱动

NVIDIA的硬件对API和Debugger的支持是有特定型号要求,需要参考官方文档 NVIDIA CUDA Toolkit and OpenCL Support on NVIDIA vGPU Software

vGPU架构

../../_images/architecture-grid-vgpu-overview.png

NVIDIA vGPU架构

  • NVIDIA Virtual GPU Manager是运行在hypervisor中,物理GPU能够支持多个虚拟GPU设备(vGPUs)被直接分配给guest虚拟机

  • 对于Guest虚拟机所使用的vGPU就像物理GPU一样被hypervisor直通进虚拟机,此时在虚拟机中加载NVIDIA驱动来访问GPU

  • 对于NVIDIA Virtual GPU Manager的paravirtualized接口用于无需转换的管理操作

对于每个vGPU:

  • 有一个固定的GPU缓存

  • 有一个或多个虚拟的显示输出(heads)

  • 当vGPU创建时也会从物理GPU分配对应的vGPU缓存,这个分配的缓存可以被vGPU一直使用直到vGPU被销毁

注意,对于不同的GPU硬件,vGPU有以下类型:

  • 所有支持NVIDIA vGPU软件的GPU设备,可以创建分时(time-sliced) vGPU

  • 对于支持 NVIDIA Multi-Instance GPU (MIG) 功能的GPU,则创建 MIG-backed vGPU(需要GPU硬件是Ampere架构)

分时(Time-Sliced)NVIDIA vGPU内部架构

../../_images/architecture-grid-vgpu-internal.png

分时(Time-Sliced)NVIDIA vGPU架构

  • 分时(time-sliced) vGPU 其实是vGPU 共享相同的一块物理GPU,此时物理GPU并没有被分区成多个GPU实例

  • 所有的分时 vGPU 共享相同的GPU引擎(图形,视频解码和编码引擎)

  • 你可以将分时vGPU视为一个软件vGPU实现,也就是说实际只有一个物理GPU,只不过有一个NVIDIA Virtual GPU Manager帮助实现了GPU任务的调度,通过类似CPU时间片调度的技术不断在物理GPU引擎上切换

备注

从上述架构图来看,软件实现的 分时(Time-Sliced) vGPU 应该是存储在一定的软件开销的,也就是说单块物理GPU通过软件分时切分成多个vGPU的总体性能是不如一块物理GPU的

对于大模型的训练和推理,一般能够将整个物理GPU资源全部吃掉,所以切分vGPU可能收益不大。不过,对于云计算切分vGPU可能可以销售给较小规模的互联网用户,还是具有一定使用价值。

我的目标是模拟多GPU的并发 Machine Learning Atlas ,所以不追求性能,仅作为技术挑战。

备注

对于GPU卡上具备多个物理GPU的设备,同一张卡上不同物理GPU可以托管具有不同framebuffer数量的vGPU,但是同一个物理GPU则必须是相同数量的framebuffer

MIG-Backed NVIDIA vGPU内部架构

../../_images/architecture-grid-vgpu-mig-backed-internal.png

NVIDIA Multi-Instance GPU (MIG) NVIDIA vGPU架构

NVIDIA Multi-Instance GPU (MIG) 后端的vGPU是真正的物理级别划分的vGPU技术:

  • 每个MIG-Backed NVIDIA vGPU实例是物理GPU中完全独立的GPU引擎(图形,视频解码和编码引擎)

  • vGPU之间是独立的并发运行,你可以将 MIG-Backed vGPU视为物理分割的GPU,此时不需要 Virtual GPU Manager 做GPU的任务调度,所以大大简化了软件堆栈,也极大降低了分时cGPU的软件开销

  • 支持 NVIDIA Multi-Instance GPU (MIG) 的GPU(Ampere微架构及更高) 的GPU在使用vGPU功能时,需要配置服务器BIOS和内核:

部署

参考