其他分享
首页 > 其他分享> > vGPU device plugin for Kubernetes

vGPU device plugin for Kubernetes

作者:互联网

vGPU device plugin基于NVIDIA官方插件(NVIDIA/k8s-device-plugin),在保留官方功能的基础上,实现了对物理GPU进行切分,并对显存和计算单元进行限制,从而模拟出多张小的vGPU卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器可以安全的共享同一张物理GPU,提高GPU的利用率。此外,插件还可以对显存做虚拟化处理(使用到的显存可以超过物理上的显存),运行一些超大显存需求的任务,或提高共享的任务数,可参考性能测试报告。

GitHub地址: https://github.com/4paradigm/k8s-device-plugin

使用场景

  1. 显存、计算单元利用率低的情况,如在一张GPU卡上运行10个tf-serving。
  2. 需要大量小显卡的情况,如教学场景把一张GPU提供给多个学生使用、云平台提供小GPU实例。
  3. 物理显存不足的情况,可以开启虚拟显存,如大batch、大模型的训练。

性能测试

在测试报告中,我们一共在下面五种场景都执行了ai-benchmark 测试脚本,并汇总最终结果:

测试环境环境描述
Kubernetes version v1.12.9
Docker version 18.09.1
GPU Type Tesla V100
GPU Num 2
测试名称测试用例
Nvidia-device-plugin k8s + nvidia官方k8s-device-plugin
vGPU-device-plugin k8s + VGPU k8s-device-plugin,无虚拟显存
vGPU-device-plugin(virtual device memory) k8s + VGPU k8s-device-plugin,高负载,开启虚拟显存

测试内容

test id名称类型参数
1.1 Resnet-V2-50 inference batch=50,size=346*346
1.2 Resnet-V2-50 training batch=20,size=346*346
2.1 Resnet-V2-152 inference batch=10,size=256*256
2.2 Resnet-V2-152 training batch=10,size=256*256
3.1 VGG-16 inference batch=20,size=224*224
3.2 VGG-16 training batch=2,size=224*224
4.1 DeepLab inference batch=2,size=512*512
4.2 DeepLab training batch=1,size=384*384
5.1 LSTM inference batch=100,size=1024*300
5.2 LSTM training batch=10,size=1024*300

测试结果:img

img

测试步骤:

  1. 安装nvidia-device-plugin,并配置相应的参数
  2. 运行benchmark任务
$ kubectl apply -f benchmarks/ai-benchmark/ai-benchmark.yml

  1. 通过kubctl logs 查看结果
$ kubectl logs [pod id]

功能

实验性功能

产品限制

已知问题

开发计划

安装要求

快速入门

GPU节点准备

以下步骤要在所有GPU节点执行。这份README文档假定GPU节点已经安装NVIDIA驱动和nvidia-docker套件。

注意你需要安装的是nvidia-docker2而非nvidia-container-toolkit。因为新的--gpus选项kubernetes尚不支持。安装步骤举例:

# 加入套件仓库
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker

你需要在节点上将nvidia runtime做为你的docker runtime预设值。我们将编辑docker daemon的配置文件,此文件通常在/etc/docker/daemon.json路径:

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
    "default-shm-size": "2G"
}

如果runtimes字段没有出现, 前往的安装页面执行安装操作nvidia-docker

Kubernetes开启vGPU支持

当你在所有GPU节点完成前面提到的准备动作,如果Kubernetes有已经存在的NVIDIA装置插件,需要先将它移除。然后,你能通过下面指令下载我们的Daemonset yaml文件:

$ wget https://raw.githubusercontent.com/4paradigm/k8s-device-plugin/master/nvidia-device-plugin.yml

在这个DaemonSet文件中, 你能发现nvidia-device-plugin-ctr容器有一共4个vGPU的客制化参数:

完成这些可选参数的配置后,你能透过下面命令开启vGPU的支持:

$ kubectl apply -f nvidia-device-plugin.yml

运行GPU任务

NVIDIA vGPUs 现在能透过资源类型nvidia.com/gpu被容器请求:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: ubuntu-container
      image: ubuntu:18.04
      command: ["bash", "-c", "sleep 86400"]
      resources:
        limits:
          nvidia.com/gpu: 2 # 请求2个vGPUs

现在你可以在容器执行nvidia-smi命令,然后比较vGPU和实际GPU显存大小的不同。

**注意:**如果你使用插件装置时,如果没有请求vGPU资源,那容器所在机器的所有vGPU都将暴露给容器。

测试

以上框架均通过测试。

日志

启动日志:在使用vGPU功能的pod中添加环境变量

LIBCUDA_LOG_LEVEL=5

获取vGPU相关的日志:

kubectl logs xxx | grep libvgpu.so

反馈和参与

标签:显存,Kubernetes,NVIDIA,vGPU,nvidia,device,GPU
来源: https://www.cnblogs.com/9849aa/p/15037772.html