腾讯gpu-manager

基本原理

vCUDA通过劫持CUDA的显存申请和释放请求,为每个容器管理它的显存使用量,进而实现了显存隔离。唯一需要注意的是申请context并不通过malloc函数,因此无法知道进程在context使用了多少显存。因此vcuda每次都去向GPU查询当前的显存使用量。在算力隔离方面,使用者可以指定容器的GPU利用率。vCUDA将会监控利用率,并在超出限制利用率时做一些处理。此处可以支持硬隔离和软隔离。两者的不同点是,如果有资源空闲,软隔离允许任务超过设置,而硬隔离不允许。

由于使用的是监控调节的方案,因此无法在短时间内限制算力,只能保证长时间的效率公平。所以不适合推理等任务时间极短的场景。

显存隔离是属于硬隔离,容器实际使用量不能超出限制值;算力隔离属于软隔离,其实际使用量会在限制值上下波动,但是平均值基本满足限制条件。

缺陷

不适合推理等任务时间极短的场景
由于该方案是依赖cuda库函数,对少部分cuda版本支持不足

似乎不怎么维护了,issue较多没什么回应

优点

不需要修改默认runc运行时
同时支持碎片和整卡调度,提高GPU资源利用率
支持同一张卡上容器间GPU和显存的使用隔离

参数

  • tencent.com/vcuda-core 和tencent.com/vcuda-memory 是新增的针对单卡共享的一个资源标记,core对应的是使用率,单张卡有100个core,memory是显存,每个单位是256MB的显存。
  • 如果申请的资源为50%利用率,7680MB显存。tencent.com/vcuda-core 填写50,tencent.com/vcuda-memory 填写成30。
  • 当然我们也同样支持原来的独占卡的方式,只需要在core的地方填写100的整数倍,memory值填写大于0的任意值即可。

部署

kubectl label node master01 nvidia-device-enable=enable

kubectl apply -f gpu-manager-svc.yaml gpu-manager.yaml

# kubectl describe node master01 | grep tencent
  tencent.com/vcuda-core:    100
  tencent.com/vcuda-memory:  32
  tencent.com/vcuda-core:    100
  tencent.com/vcuda-memory:  32
  tencent.com/vcuda-core    0            0
  tencent.com/vcuda-memory  0            0

验证

apiVersion: v1
kind: Pod
metadata:
  name: test-gpu
  annotations:
    tencent.com/vcuda-core-limit: "50"
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda
      image: nvidia/cuda:10.0-base
      imagePullPolicy: IfNotPresent
      tty: true
      resources:
        requests:
          tencent.com/vcuda-core: 30
          tencent.com/vcuda-memory: 10
        limits:
          tencent.com/vcuda-core: 30
          tencent.com/vcuda-memory: 10

版权声明:本文为qq_26572567原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。