GPU 调度介绍


一、GPU 调度简介

1. 背景

  众所周知,当前对于深度学习的研究十分火热,如果想要取得好的效果,除了数据和算法两个要素外,强大的算力也是必不可少的。但由于目前主流的 NVIDIA GPU 比较昂贵,并且一般情况下独占卡的模式会对 GPU 这种宝贵的计算资源造成浪费,即不同用户对模型的理解深度不同,导致申请了独立的卡却没有把资源用满。因此,为了解决上述问题,通过 GPU 共享的虚拟化技术来提高资源利用率也逐渐成为当下的研究热点。

2. 研究现状

从学术界和工业界的一些实现方式来看,GPU 共享的基本原理主要分为以下两部分:

  • 资源隔离:限制程序使用的 GPU 核数和显存,常见的思路就是劫持调用,具体可以分为用户态劫持或内核态劫持。
  • 并行模式:共享 GPU 情况下应用程序应该能够并行执行,有类似 CPU 的时间片模式和 MPS 模式。

从用户的使用角度来看,GPU 共享这种虚拟化技术主要体现在虚拟机层面和容器层面:

  • 虚拟机层面:将 GPU 硬件设备分割成很多虚拟 GPU 并映射到虚机里面,如 NVIDIA vGPU。
  • 容器层面:容器的本质还是进程,通过对驱动的某些关键接口进行封装劫持从而达到限制进程资源的目的,如 Gaia GPU 和 cGPU 等。

二、术语介绍

1. GPU

  GPU 图形处理器(graphics processing unit),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。我们日常讨论 GPU 和显卡时,经常混为一谈,严格来说是有所区别的。GPU 是显卡(Video card、Display card、Graphics card)最核心的部件,但除了 GPU,显卡还有扇热器、通讯元件、与主板和显示器连接的各类插槽。

  GPU 使显卡减少了对 CPU 的依赖,并进行部分原本 CPU 的工作,尤其是在 3D 图形处理时。GPU 所采用的核心技术有硬件 T&L(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素 256 位渲染引擎等,而硬件 T&L 技术可以说是 GPU 的标志。GPU 的生产商主要有 NVIDIA,AMD 和 Intel。

2. CUDA

  CUDA (Compute Unified Device Architecture),通用并行计算架构,是一种运算平台。它包含 CUDA 指令集架构以及 GPU 内部的并行计算引擎。你只要使用一种类似于 C 语言的 CUDA C 语言,就可以开发 CUDA 程序,从而可以更加方便的利用 GPU 强大的计算能力,而不是像以前那样先将计算任务包装成图形渲染任务,再交由 GPU 处理。
注意:并不是所有 GPU 都支持 CUDA。

3. 流处理器

  流处理器单元是统一架构 GPU 内通用标量着色器的称谓。流处理单元直接影响处理能力,因为流处理单元是显卡的核心。流处理单元个数越多则处理能力越强,一般成正比关系,但这仅限于 NVIDIA 自家的核心或者 AMD 自家的核心比较范畴。NVIDIA 和 AMD 的流处理单元比较不可采取近似比较,实际上 AMD 的应该叫流处理器单元,它每 5 个单元配一个数据收发的,这才是一个完整的流处理器,这样算一个流处理器。而 NVIDIA 1 个流处理单元却只有 1 个单元。这是 A 卡与 N 卡的构造区别。形象点说,这个流处理单元相当于神经元,神经元越多大脑越发达,流处理单元越多显卡处理性能也就越强。

4. 显存调度

  GPU 调度插件使得不同的服务能够共享同一个 GPU 卡上的显存,能够让使用者通过 API 描述实现对于集群显存池中显存资源的申请, 并能实现显存资源的调度。

5. 显存隔离

  显存隔离是指将 GPU 的显存资源进行隔离,按部署服务的配置文件中所声明的资源定义分配给对应服务,每个服务所分配的显存资源之间互不影响。

6. 算力隔离

  算力隔离是指将 GPU 的计算能力进行隔离,按比例分配给共享 GPU 的任务上,对任务的性能产生影响。

三、GPU 共享调度方案

1. 腾讯 GaiaGPU

  腾讯提供了一整套 GPU 共享解决方案 GaiaGPU,是完全开源的 GPU 共享方案。GaiaGPU 中的 vCUDA(virtual CUDA)是 GPU 资源限制组件,属于 CUDA 劫持。vCUDA 通过劫持 CUDA 的显存申请和释放请求,为每个容器管理它的显存使用量,进而实现了显存隔离。唯一需要注意的是申请 context 并不通过 malloc 函数,因此无法知道进程在 context 使用了多少显存。因此 vcuda 每次都去向 GPU 查询当前的显存使用量。在算力隔离方面,使用者可以指定容器的 GPU 利用率。vCUDA 将会监控利用率,并在超出限制利用率时做一些处理。此处可以支持硬隔离和软隔离。两者的不同点是,如果有资源空闲,软隔离允许任务超过设置,而硬隔离不允许。由于使用的是监控调节的方案,因此无法在短时间内限制算力,只能保证长时间的效率公平。所以不适合推理等任务时间极短的场景。
  GaiaGPU 也提供了 Device plugin GPU manager 和调度器 GPU admission,GPU admission 既允许用户申请一张虚拟卡,也允许用户像之前一样申请一机多卡,这可能可以满足一些小型集群的需要。GPU manager 除实现了 device plugin 该实现的,也做了很多繁杂的功能,使得 apiserver 的负担更重了。

2. 腾讯 qGPU

  腾讯在内核劫持类 GPU 共享方向上,也推出了资源隔离方案 qGPU(qos GPU)。从架构图中就可以看出,qGPU 和同属于内核劫持方案的 cGPU 类似。但值得注意的是,qGPU 效仿 Nvidia vGPU 在必要时 context switch,实现了强算力隔离,这也是其名字的由来。出于某些考虑未开源。

3. NVIDIA - deploying-nvidia-gpu-device-plugin

NVIDIA device plugin 通过 k8s daemonset 的方式部署到每个 k8s 的 node 节点上,实现了 Kubernetes device plugin 的接口。

提供以下功能:

  • 暴露每个节点的 GPU 数量给集群
  • 跟踪 GPU 的健康情况
  • 使在 k8s 的节点可以运行 GPU 容器

Github:github.com

4. GPU MOUNTER

GPU Mounter 是一个支持动态调整运行中 Pod 可用 GPU 资源的 Kubernetes 插件,已经开源在 GitHub:

  • 支持 Pod 可用 GPU 资源的动态调整
  • 兼容 Kubernetes 调度器
  • 无侵入式修改
  • REST API 接口
  • 一键部署

官网:pokerfaceSad/GPUMounter: A kubernetes plugin which enables dynamically add or remove GPU resources for a running Pod (github.com)

5. 阿里 GPU Sharing

阿里云介绍:链接

Github 地址:链接

优点:

  • 能够让更多的预测服务共享同一个 GPU 卡上,能够让使用者通过 API 描述对于一个可共享资源的申请, 并能实现该种资源的调度。

缺点:

  • 不支持该共享资源的隔离

前提条件:

  • 延用 Kubernetes Extended Resource 定义,但是衡量维度最小单位从 1 个 GPU 卡变为 GPU 显存的 MiB
  • 用户申请的 GPU 资源上限不会超过一张卡,也就是申请的资源上限为单卡

6. 阿里 cGPU(container GPU)

  阿里的 cGPU 是最早提出的通过内核劫持来实现容器级 GPU 共享的方案。cGPU 实现了一个内核模块 cgpu_km,该模块可以对一个物理 GPU 虚拟出 16 个虚拟 GPU 设备。在容器挂载设备时,修改后的 container runtime 将挂载虚拟 GPU 设备,而不是真实 GPU 设备。通过这种方式实现了 GPU 劫持。当用户程序的请求下发至内核模块 cgpu_km 时,模块通过修改请求及回复来限制 GPU 显存资源。同时,内核模块也实现了简单的算力调度,通过限制每个容器可下发 kernel 的时间片来隔离算力资源。可以提供公平/抢占/权重三种算力分配模式。值得注意的是,cGPU 目前不能中止已经发送到 GPU 上的请求,因此如追求算力隔离,需要延长时间片的长度,会造成一定的算力浪费。出于某些考虑未开源。

  既然是容器级的 GPU 共享,接入到 K8s 的组件是必不可少的。阿里开源了相应的 device plugin 和调度器。设计的 device plugin 提供的核心资源是显存,这和 cGPU 是一脉相承的。另外由于当前 K8s 支持的资源类型是一维的,而 GPU 共享资源是二维的。为了实现调度能力,应用了一些 tricky 的技巧,也让 device plugin 不得不和 APIServer 直接通信。

链接

四、共享调度方案对比

调度方案 显存调度 显存隔离 算力隔离 资源Quota
nvidia-device-plugin × × ×
阿里云 GPU Sharing × ×
阿里云 cGPU
腾讯 qGPU
腾讯 GaiaGPU

posted @ 2022-07-18 14:09  公博义  阅读(4306)  评论(1编辑  收藏  举报