作者: 郑晓, 龙欣, 弹性计算异构计算项目组
让各位久等了, 阿里小二这就开始上新菜:"GPU 分片虚拟化".
对于 "分片" 的理解, 相信大家已经不陌生了. 此处的分片从两个维度上来定义: 其一, 是对 GPU 在时间片段上的划分, 与 CPU 的进程调度类似, 一个物理 GPU 的计算 engine 在几个 vGPU 之间共享, 而调度时间片一般都在 1ms-10ms 左右, 其二, 是对 GPU 资源的划分, 主要是指对 GPU 显存的划分, 以 NVIDIA 为例, 一个物理 GPU 带有 16GB 的显存, 那么按照 16 个 vGPU 来划分, 每个 vGPU 得到 1GB 的显存. 由于安全隔离的要求, 每个 vGPU 独享分配给它的显存, 不会与其他 vGPU 共享.
技术上讲 GPU 分片虚拟化, 就是指基于 VFIO mediated passthrough framework 的 GPU 虚拟化方案. 该方案由 NVIDIA 提出, 并联合 Intel 一起提交到了 Linux kernel 4.10 代码库, 该方案的 kernel 部分代码简称 mdev 模块. 随后 Redhat Enterprise,centos 最新的发行版花了不少力气又 backporting 到了 3.10.x kernel. 所以如果目前采用最新的 Redhat 发行版 (企业版或者 centos7.x) 等都已经自带 mdev 模块. 而如果采用 ubuntu17.x 以后版本的话, 不但自带 mdev 功能, 连 Intel GPU 驱动 (i915) 也已经更新到支持 vGPU. 无需任何代码编译就可以直接体验 vGPU 虚拟机功能.
那么什么叫 mediated passthrough 呢? 它与 pass through 的区别是什么呢? 一句话解释: 把会影响性能的访问直接 passthrough 给虚拟机, 把性能无关, 功能性的 MMIO 访问做拦截并在 mdev 模块内做模拟. 太过细节的东西详见后续篇章.
GPU 分片虚拟化框架
GPU 分片虚拟化的方案被 NVIDIA 与 Intel 两家 GPU 厂家所采用. NVIDIA GRID vGPU 系列与 Intel 的 GVT-g(XenGT or KVMGT).
当然光有内核的支持还不够, 需要加上 qemu v2.0 以后版本, 加上 Intel 或者 NVIDIA 自带的 GPU mdev 驱动(也就是对 GPU MMIO 访问的模拟), 那么 GPU 分片虚拟化的整个路径就全了. 而 GPU 厂家的 mdev 驱动是否开源取决于自己. 按照一贯的作风, Intel 开源了其绝大部分代码, 包括最新的基于 mdev 的 GPU 热迁移技术, 而 NVIDIA 也保持其一贯作风: 不公开.
GPU 分片虚拟化看起来整个框架就如下图一样(以 KVMGT 作为例子):
- https://github.com/intel/GVT-linux https://github.com/intel/gvt-linux
- qemu:
- https://github.com/intel/IGVTg-qemu https://github.com/intel/Igvtg-qemu
来源: https://yq.aliyun.com/articles/599189