#开源GPU显存虚拟化项目,你的2080Ti还能救一下

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 测试脚本,并汇总最终结果:

测试内容

测试步骤:

  1. 安装nvidia-device-plugin,并配置相应的参数
  2. 运行benchmark任务
$ kubectl apply -f benchmarks/ai-benchmark/ai-benchmark.yml
  1. 通过kubctl logs 查看结果
$ kubectl logs [pod id]

功能

  • 指定每张物理GPU切分的vGPU的数量
  • 限制vGPU的显存
  • 限制vGPU的计算单元
  • 对已有程序零改动

实验性功能

  • 虚拟显存 vGPU的显存总和可以超过GPU实际的显存,这时候超过的部分会放到内存里,对性能有一定的影响。

产品限制

  • 分配到节点上任务所需要的vGPU数量,不能大于节点实际GPU数量

已知问题

  • 开启虚拟显存时,如果某张物理GPU的显存已用满,而这张GPU上还有空余的vGPU,此时分配到这些vGPU上的任务会失败。
  • 目前仅支持计算任务,不支持视频编解码处理。

开发计划

  • 支持视频编解码处理
  • 支持Multi-Instance GPUs (MIG)

安装要求

  • NVIDIA drivers >= 384.81
  • nvidia-docker version > 2.0
  • docker已配置nvidia作为默认runtime
  • Kubernetes version >= 1.10

快速入门

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的客制化参数:

  • fail-on-init-error: 布尔类型, 预设值是true。当这个参数被设置为true时,如果装置插件在初始化过程遇到错误时程序会返回失败,当这个参数被设置为false时,遇到错误它会打印信息并且持续阻塞插件。持续阻塞插件能让装置插件即使部署在没有GPU的节点(也不应该有GPU)也不会抛出错误。这样你在部署装置插件在你的集群时就不需要考虑节点是否有GPU,不会遇到报错的问题。然而,这么做的缺点是如果GPU节点的装置插件因为一些原因执行失败,将不容易察觉。现在预设值为当初始化遇到错误时程序返回失败,这个做法应该被所有全新的部署采纳。
  • device-split-count: 整数类型,预设值是2。NVIDIA装置的分割数。对于一个总共包含N张NVIDIA GPU的Kubernetes集群,如果我们将device-split-count参数配置为K,这个Kubernetes集群将有K * N个可分配的vGPU资源。注意,我们不建议将NVIDIA 1080 ti/NVIDIA 2080 ti device-split-count参数配置超过5,将NVIDIA T4配置超过7,将NVIDIA A100配置超过15。
  • device-memory-scaling: 浮点数类型,预设值是1。NVIDIA装置显存使用比例,可以大于1(启用虚拟显存,实验功能)。对于有M显存大小的NVIDIA GPU,如果我们配置device-memory-scaling参数为S,在部署了我们装置插件的Kubenetes集群中,这张GPU分出的vGPU将总共包含 S * M显存。每张vGPU的显存大小也受device-split-count参数影响。在先前的例子中,如果device-split-count参数配置为K,那每一张vGPU最后会取得 S * M / K 大小的显存。
  • device-cores-scaling: 浮点数类型,预设值与device-split-count数值相同。NVIDIA装置算力使用比例,可以大于1。如果device-cores-scaling参数配置为S device-split-count参数配置为K,那每一张vGPU对应的一段时间内 sm 利用率平均上限为S / K。属于同一张物理GPU上的所有vGPU sm利用率总和不超过1。
  • enable-legacy-preferred: 布尔类型,预设值是false。对于不支持 PreferredAllocation 的kublet(<1.19)可以设置为true,更好的选择合适的device,开启时,本插件需要有对pod的读取权限,可参看 legacy-preferred-nvidia-device-plugin.yml。对于 kubelet >= 1.9 时,建议关闭。

完成这些可选参数的配置后,你能透过下面命令开启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-containerimage: ubuntu:18.04command: ["bash", "-c", "sleep 86400"]resources:limits:nvidia.com/gpu: 2 # 请求2个vGPUs
  • 现在你可以在容器执行nvidia-smi命令,然后比较vGPU和实际GPU显存大小的不同。

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

测试

  • TensorFlow 1.14.0-1.15.0/2.2.0-2.6.2
  • torch1.1.0-1.8.0
  • mxnet 1.4.0
  • mindspore 1.1.1
  • xgboost 1.0-1.4
  • nccl 2.4.8-2.9.9

以上框架均通过测试。

日志

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

LIBCUDA_LOG_LEVEL=5

获取vGPU相关的日志:

kubectl logs xxx | grep libvgpu.so

反馈和参与

  • bug、疑惑、修改欢迎提在 Github Issues
  • 想了解更多或者有想法可以参与到Discussions和slack交流

开源GPU显存虚拟化项目,你的2080Ti还能救一下相关推荐

  1. ubuntu服务器常见使用技巧及-kill掉后GPU显存不释放进程-

    如何解决python进程被kill掉后GPU显存不释放的问题 1 重新开一个shell,然后输入: ps aux|grep user_name|grep python.所有该用户下的python程序就 ...

  2. pytorch 优化GPU显存占用,避免out of memory

    pytorch 优化GPU显存占用,避免out of memory 分享一个最实用的招: 用完把tensor删掉,pytorch不会自动清理显存! 代码举例,最后多删除一个,gpu显存占用就会下降,训 ...

  3. 模型占用GPU显存计算

    相关博客: https://blog.csdn.net/wz22881916/article/details/81054036 https://blog.csdn.net/sweetseven_/ar ...

  4. 【Ubuntu-Tensorflow】程序结束掉GPU显存没有释放的问题

    笔者在ubuntu上跑Tensorflow的程序的时候,中途使用了Win+C键结束了程序的进行,但是GPU的显存却显示没有释放,一直处于被占用状态. 使用命令 watch -n 1 nvidia-sm ...

  5. ubuntu安装nvidia显卡驱动+cuda9.0+cudnn7.0+查看cuda版本+安装tensorrt+python查看gpu显存

    一,驱动安装 显卡驱动和cuda版本关系 卸载原先驱动 sudo apt-get remove --purge nvidia-\* ubuntu-drivers devices  查看显卡类型 Nvi ...

  6. nvidia-smi 显示无进程,但GPU显存被占用

    问题场景 训练网络时,未等网络训练完,中途按了:ctrl + c结束网络训练.当再次进行训练网络时,提示GPU显存不足,使用nvidia-smi查看GPU,无进程占用,但GPU显存被占满. 问题分析 ...

  7. 矩池云中Tensorflow指定GPU及GPU显存设置

    矩池云中Tensorflow指定GPU及GPU显存设置 指定GPU 查看机器上GPU情况 命令: nvidia-smi 功能:显示机器上gpu的情况 命令: nvidia-smi -l 功能:定时更新 ...

  8. 解决矩池云GPU显存未释放问题

    很多用户反馈说终止程序之后,显存依然被占用,这里我们提供了两种解决方案,帮助用户解决这个问题. nvidia-smi查看 我们可以先用如下命令 nvidia-smi 查看一下当前GPU进程情况. _ ...

  9. 解决Ubuntu系统找不到进程,但是GPU显存占满问题

    Ubuntu系统有时候会出现GPU显存显示占满,但是使用top命令和nvidia-smi命令都查找不到进程. fuser -v /dev/nvidia* 通过上条命令查找进程,然后使用 sudo ki ...

最新文章

  1. 共享一个查找IP所在交换机端口的方法
  2. P2354,jzoj3757-[NOI2014]随机数生成器【贪心,暴力】
  3. 猜数字游戏 : 共给玩家10次机会,若第一次就猜对了,显示‘您真是个天才’,若10也没猜对,显示“您太笨了,下次努力吧!”, 若是第2-10次猜对了,只简单的显示:“恭喜您猜对了”。
  4. 日常生活开支记账明细_中小企业真的需要代理记账吗?
  5. 我如何学习:开篇 先提升下肾上腺素
  6. Wireless工具配置
  7. 分数阶灰色模型的python实现
  8. 用大数据与可视化分析有钱任性的瑞幸咖啡,看它和浑水谁在说谎
  9. ctfshow(菜狗杯)
  10. 开源H5棋牌 cocos creator微信棋牌小游戏 点球科技服务端分析笔记
  11. FairGuard游戏Lua加密方案解析
  12. r语言进行go富集分析_好用的在线GO富集分析工具
  13. Java 的三种技术架构
  14. 趣图:程序员的真实写照!这也太形象了吧!
  15. 手把手的 git 降伏指南——阿龙咸鱼经
  16. 期货贴水如何交割(期货交割升贴水)
  17. PDF Editor 6 Pro for Mac(pdf编辑器)
  18. Spring定时器之翘楚-Quartz
  19. mac 安装homebrew 报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refu
  20. Linux 资源清理

热门文章

  1. [英语]ab/abs/ac/acr词根讲解
  2. Arduino_OLED-0.96游戏机
  3. 2.微处理器:8088功能结构图【BIU 和 EU】 + 8088【内部各寄存器】的解释
  4. uniapp使用ucharts图表及问题汇总
  5. 基于Python实现Jacobi迭代法、Gauss-Seidel迭代法和SOR法方程组(二)
  6. 跟sky学数字IC/FPGA设计学习培训课程:全集已出
  7. java生僻字解决方案
  8. 速来了解头条号的推荐机制,让你的自媒体内容收下更多数据量!
  9. 学会这招,妈妈再也不担心我的排名上不去了
  10. 用matlab画同心圆,求同心圆的同心度