houminz / paper-reading

Paper Reading:涉及分布式、虚拟化、网络、机器学习
https://houmin.cc/papers
22 stars 0 forks source link

GaiaGPU: Sharing GPUs in Container Clouds #1

Open houminz opened 3 years ago

houminz commented 3 years ago

论文:https://ieeexplore.ieee.org/document/8672318

来源:腾讯TEG数据平台部Gaia团队

概述:实现容器间的GPU资源共享,其中 GPUManager 已在Github开源

在KubeCon 2018上,腾讯对GaiaStack的介绍在 这里

houminz commented 3 years ago

背景:容器在云计算中因为其轻量性和可扩展性而得到广泛应用,GPU在深度学习等场景下被广泛用于加速计算,如何在容器间共享GPU资源,提高GPU利用率得到广泛研究。GaiaGPU 通过将虚拟的GPU分割成若干虚拟GPU,实现GPU memory和计算资源的隔离与共享

GaiaGPU的实现主要分为两个部分:Kubernetes 部分 和 vCUDA 部分

image

houminz commented 3 years ago

下面对这几个组件依次分析,首先是 GPU Manager,实际上就是一个 Device Plugin,负责创建 vGPUS 和与 kubelet 通信。如果对Device Plugin不了解可以先看看这里

image

houminz commented 3 years ago

接下来是vGPU的管理,对应论文中的 vGPU Manager 和 vGPU Library,其中 vGPU Library实际实现的是 vcuda-controller

vGPU Manager 最后从属于 GPU Manager项目的一部分,作为DaemonSet会运行在每个Node之上。当一个容器申请了 Container 资源,论文图中的 GPU Manager 会将 容器配置比如申请的GPU资源大小,容器的名字发送给 vGPU Manager。 vGPU Manager 收到 容器的配置之后,会为这个容器在Host上创建一个独特的以容器名命名的目录,并且会将这个目录返回到 AllocateResponse 里面,最终返回给 kubelet。

vGPU Manager 和 vGPU Library通过 server-client 的 模式通信。vGPU Manager保存了一个容器list,这个list中是那些使用了GPU并且还Alive的容器。vGPU Manager 会周期性的检查这个列表,如果有容器销毁,那么会从列表中将其移除,并删除其在本地的目录。

houminz commented 3 years ago

接下来是最关键的部分,vCUDA Library的实现,它通过劫持 vCUDA API 的调用来做资源隔离,具体劫持的API如下表所示

image

这里的问题是,vCUDA Library 是如何做到注射到容器之内的呢?

               Host                     |                Container
                                        |
                                        |
 .-----------.                          |
 | allocator |----------.               |             ___________
 '-----------'   PodUID |               |             \          \
                        v               |              ) User App )--------.
               .-----------------.      |             /__________/         |
    .----------| virtual-manager |      |                                  |
    |          '-----------------'      |                                  |
$VirtualManagerPath/PodUID              |                                  |
    |                                   |       read /proc/self/cgroup     |
    |  .------------------.             |       to get PodUID, ContainerID |
    '->| create directory |------.      |                                  |
       '------------------'      |      |                                  |
                                 |      |                                  |
                .----------------'      |       .----------------------.   |
                |                       |       | fork call gpu-client |<--'
                |                       |       '----------------------'
                v                       |                   |
   .------------------------.           |                   |
  ( wait for client register )<-------PodUID, ContainerID---'
   '------------------------'           |
                |                       |
                v                       |
  .--------------------------.          |
  | locate pod and container |          |
  '--------------------------'          |
                |                       |
                v                       |
  .---------------------------.         |
  | write down configure and  |         |
  | pid file with containerID |         |
  | as name                   |         |
  '---------------------------'         |
                                        |
                                        |
                                        v
houminz commented 3 years ago

把这部分论文分析总结在了博客里面