提到 GPU 虚拟化,不得不提及的当然是 NVIDIA GRID vGPU 方案,vGPU 大量应用于远程桌面和渲染场景的虚拟化。
大多数场合我们只会引用 vGPU 这个概念或技术,其底层实现往往语焉不详。最近在查找资料过程中发现 NVIDIA 在 2016 年初举办过一场为期两天的 GRID Days,在那次研讨会上揭露了不少 vGPU 的底层实现细节[1][2][3]

GRIDDays 的现场笔记 —— Barry Coombs, VMWare 技术专家

本篇文章,就以当年参会者的一些博客为参考,尝试深度解析 vGPU 内部的实现原理。

通过阅读本篇文章,你将会了解:

  1. vGPU 解决了什么问题;
  2. vGPU 的组成架构和实现原理;
  3. vGPU 的资源调度和显存管理;
  4. vGPU 的性能和适用场景;

vGPU 解决了什么问题

GPU 虚拟化按[4]实现层次大概分为 API 层虚拟化(API Hook、API Remoting)、驱动层虚拟化(Fixed pass-through、Mediated pass-through)、硬件层虚拟化(SRIOV、MIG)这三类方案,详细的介绍和优缺点对比可以参考我之前的文章 极致压榨GPU算力:开发、训练、推理 AI 全链路如何提效

虚拟机(VM)场景下大量采用 PCIe pass-through 技术(也是目前大多数云计算提供商普遍使用的 GPU 虚拟化方案)。pass-through 技术直接将 PCIe 设备映射到虚机中,最大程度的降低了虚拟化带来的开销,但它的缺点也非常明显——只能做单卡粒度的映射,不能在多个虚机上共享一张卡[2],无法满足多租户渲染或远程桌面的需求。

NVIDIA GPU 虚拟化发展史

基于上述需求 NVIDIA 提出了 GRID vGPU 方案。GRID 方案结合硬件、软件和驱动技术,实现了 VM 环境下的 GPU 虚拟化。GRID 方案为不同的 guest 提供不同的虚拟地址空间[4],每个 guest 通过 IOMMU 在 hypervisor 控制下直接访问物理设备。该技术是一类硬件辅助实现的虚拟化方案,驱动控制设备上下文信息的暴露程度来控制 gust 可以直接使用的 API 范围。一方面在关键的 API 上实现了权限管理,另一方面在开销较大的 API 上实现了直接访问。从而在整体性能上可以接近原生水平(独占情况下)。

vGPU 的组成架构和实现原理

GPU 虚拟化的架构师 Andy Currid 介绍 vGPU 的底层实现

vGPU 资源调度和显存管理

vGPU 的性能和适用场景

参考

  1. ^ a b griddays-part1 https://thevirtualhorizon.com/2016/08/02/griddays-followup-understanding-nvidia-grid-vgpu-part-1/
  2. ^nvidia-grid-days-day2 https://www.definetomorrow.co.uk/blog/2016/3/4/nvidia-grid-days-day-2
  3. ^abGPU_virtualization https://en.wikipedia.org/wiki/GPU_virtualization