揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU( 四 )

  • VM 中的 GPU 驱动,收到中断,知道该 workload 已完成、结果在内存中
  • 这就是 nVidia GRID vGPU、Intel GVT-g(KVMGT、XenGT)的基本实现思路 。一般认为 graphics stack 是 OS 中最复杂的,加上虚拟化之后复杂度更是暴增,任何地方出现一个编程错误,调试起来都是无比痛苦 。但只要稳定下来,这种 MPT 方案,就能兼顾 1:N 灵活性、高性能、渲染计算媒体的功能完整性...是不是很完美?
    其实也不是 。
    该方案最大的缺陷,是必须有一个 pGPU 驱动,负责 vGPU 的模拟和调度工作 。逻辑上它相当于一个实现在内核态的 device-model 。而且,由于 GPU 硬件通常并不公开其 PRM,所以事实上就只有 GPU 厂商才有能力提供这样的 Virtualization-Aware pGPU 驱动 。使用了厂商提供的 MPT 方案,事实上就形成了对厂商的依赖 。
    2.3.6 SR-IOV: revisited重新回到 GPU 的 SR-IOV 。AMD 从 S7150 开始、英伟达从 Turing 架构开始,数据中心 GPU 都支持了 SR-IOV 。但是 again,它不是 NIC 那样的 SR-IOV,它需要 Host 上存在一个 vGPU 的 device-model,来模拟从 VM 来的 VF 访问 。
    所以事实上,到目前为止,GPU 的 SR-IOV 仅仅是封装了 PCIe TLP 层的 VF 路由标识、从而规避了 runtime 时的软件 DMA 翻译,除此之外,和基于 MDEV 的 MPT 方案并无本质的不同 。
    2.3.7 谱系表
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    在介绍完了上述的这些方案后,我们重新看下 CUDA 计算、OpenGL 渲染两种场景的软件栈,看看能发现什么:
    CUDA 计算 stack:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    OpenGL 渲染 Stack:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    可以看出,从 API 库开始,直到 GPU 硬件,Stack 中的每一个阶段,都有被截获、转发的可能性 。甚至,一概称之为「API 转发」是不合适的 —— 以 GRID vGPU、GVT-g 为例的 DEV 转发,事实上就是 MPT,和任何 API 都没有关系 。
     
    三、容器 GPU 虚拟化首先,我们这里谈到的,都是 nVidia 生产的 GPU、都只考虑 CUDA 计算场景 。其次,这里的虚拟化指的是 OS 虚拟化的容器技术,不适用于 KATA 这样的、基于系统虚拟化的安全容器 。
    3.1 CUDA 的生态
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    CUDA 开发者使用的,通常是 CUDA Runtime API,它是 high-level 的;而 CUDA Driver API 则是 low-level 的,它对程序和 GPU 硬件有更精细的控制 。Runtime API 是对 Driver API 的封装 。
    CUDA Driver 即是 UMD,它直接和 KMD 打交道 。两者都属于 NVIDIA Driver package,它们之间的 ABI,是 NVIDIA Driver package 内部的,不对外公开 。
    英伟达软件生态封闭:
    • 无论是 nvidia.ko,还是 libcuda.so,还是 libcudart,都是被剥离了符号表的
    • 大多数函数名是加密替换了的
    • 其它的反调试、反逆向手段
    以 nvidia.ko 为例,为了兼容不同版本的 Linux 内核 API,它提供了相当丰富的兼容层,于是也就开源了部分代码:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    其中这个 26M 大小的、被剥离了符号表的 nv-kernel.o_binary,就是 GPU 驱动的核心代码,所有的 GPU 硬件细节都藏在其中 。
    3.2 vCUDA 和友商 cGPU为了让多个容器可以共享同一个 GPU,为了限定每个容器能使用的 GPU 份额,业界出现了不同的方案,典型的如 vCUDA 和 cGPU:
    vCUDA 架构:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    cGPU 架构:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    两者的实现策略不同,cGPU 比 vCUDA 更底层,从而实现了不侵入用户环境 。
    3.3 GPU 池化简介从截获的位置,看 GPU 池化的谱系:
    揭秘GPU虚拟化,算力隔离,和最新技术突破qGPU

    文章插图
     
    以 CUDA API 转发的池化方案、业界某产品为例,它到了 GPU 所在的后端机器上,由于一个 GPU 卡可能运行多个 GPU 任务,这些任务之间,依然需要有算力隔离 。它为了实现这一点,在后端默认启用了 nVidia MPS —— 也就是故障隔离最差的方案 。这会导致什么?一个 VM 里的 CUDA 程序越界访问了显存,一堆风马牛不相及的 VM 里的 CUDA 应用就会被杀死 。
    所以,很显然,GPU 池化也必须以同时满足故障隔离和算力隔离的方案作为基础 。


    推荐阅读