zoukankan      html  css  js  c++  java
  • Kubernetes1.3新特性:支持GPU

    (一)  背景资料

    GPU就是图形处理器,是Graphics Processing Unit的缩写。电脑显示器上显示的图像,在显示在显示器上之前,要经过一些列处理,这个过程有个专有的名词叫“渲染" ,以前计算机上是没有GPU的,都是通过CPU来进行“渲染”处理的,这些涉及到“渲染”的计算工作非常耗时,占用了CPU的大部分时间。之后出现了GPU,是专门为了实现“渲染”这种计算工作的,用来将CPU解放出来,GPU是专为执行复杂的数学和几何计算而设计的,这些计算是“渲染”所必需的。

    下面看看百度百科上CPU同GPU的对比图,其中绿色的是计算单元:


    可以看出来GPU有大量的计算单元,所以GPU是专门为“渲染”这种计算工作设计的。

    (二)  应用领域

    最开始同GPU相关的应用只是简单地停留在图形相关应用上,比如游戏中3D图形“渲染”等图像处理应用,现在GPU的应用已经非常广泛的,在游戏、娱乐、科研、医疗、互联网等涉及到大规模计算的领域都有GPU应用的存在,比如高性能计算应用、机器学习应用、人工智能应用、自动驾驶应用、虚拟现实应用、自然语言处理应用等等。

    1、下面看看Nvidia提供的深度学习领域使用GPU的分析结果:


    可以看出来从2013年到2015年在深度学习领域呈现出爆发性增长的趋势。

    2、下面看看Nvidia提供的资料:


    使用GPU来实现深度学习应用后,在自动驾驶、医疗诊断和机器学习三方面效率提高的十分明显。

    (三)  K8S当前实现

    在kubernetes1.3中提供了对Nvidia品牌GPU的支持,在kubernetes管理的集群中每个节点上,通过将原有的Capacity和Allocatable变量进行扩展,增加了一个针对Nvidia品牌GPU的α特性:alpha.kubernetes.io/nvidia-gpu。其中Capacity变量表示每个节点中实际的资源容量,包括cpu、memory、storage、alpha.kubernetes.io/nvidia-gpu,而Allocatable变量表示每个节点中已经分配的资源容量,同样包括包括cpu、memory、storage、alpha.kubernetes.io/nvidia-gpu。


    在启动kubelet的时候,通过增加参数--experimental-nvidia-gpu来将带有GPU的节点添加到kubernetes中进行管理。这个参数experimental-nvidia-gpu用来告诉kubelet这个节点中Nvidia品牌GPU的个数,如果为0表示没有Nvidia品牌GPU,如果不增加这个参数,那么系统默认为这个节点上没有Nvidia品牌GPU。

    当节点上安装有多块Nvidia品牌GPU的时候,参数experimental-nvidia-gpu是可以输入大于1的数值的,但是对于kubernetes1.3这个版本,GPU还是个α特性,在代码中参数experimental-nvidia-gpu其实只支持两个值,分别是0和1,我们通过下面代码就可以看出来:


    在运行docker的时候,需要映射节点上的设备到docker中,这段代码是在告诉docker,只映射第一块Nvidia品牌GPU。通过上面代码可以看出来,在kubernetes1.3中,GPU这个α特性,参数experimental-nvidia-gpu其实只支持两个值,分别是0和1。通过上面代码也可以看出来,为什么在kubernetes1.3中只支持Nvidia品牌GPU,对于不同品牌的GPU,映射到linux操作系统里面有着不同的设备路径,需要针对不同的GPU品牌分别进行实现。

    在kubernetes1.3中新增了初始化容器,但是这种初始化容器并不支持Nvidia品牌GPU这个功能。

    通过下图可以看到,如何在kubenetes上面使用Nvidia品牌的GPU:


    在上图中,kubernetes在调度的时候会把GPU作为一种资源进行考虑,在Scheduler调度模块中增加了Nvidia品牌GPU这种资源:


    在Scheduler调度模块中的PodFitsResources方法中增加了对Nvidia品牌GPU的处理:


    在Scheduler调度模块中的CheckPodsExceedingFreeResources方法中增加了对Nvidia品牌GPU的处理:


    在Scheduler调度模块中的getResourceRequest方法中增加了对Nvidia品牌GPU的处理:


    (四)  K8S未来计划

    在Scheduler调度模块中的getResourceRequest方法中增加了对Nvidia品牌GPU的处理:

    •       增加自动检测节点上GPU硬件功能

    •       提供一种标准方法,用来防止容器镜像中GPU厂商共享库的绑定

    •       支持多个POD可以共享相同的GPU

    •       支持配置物理裸机

    •       对多个GPU支持按照层次调度和亲和性调度

    •       支持各个GPU厂商新版本,比如CUDA v7.5+

    •       考虑以GPU驱动插件的形式增加到kubelet中

    •       支持更多的GPU厂商

    •       支持OpenCL,让容器镜像同设备无关(2008年6月的WWDC大会上,苹果提出了OpenCL规范,旨在提供一个通用的开放API,在此基础上开发GPU通用计算软件。随后,Khronos Group宣布成立GPU通用计算开放行业标准工作组,以苹果的提案为基础创立OpenCL行业规范。)

  • 相关阅读:
    matlab中padarray函数在numpy、python中的实现
    MAC卸载/删除 Parallels Desktop虚拟机的方法
    CNMeM is disabled
    UbuntuServer14.04+CUDA7.5+CuDNNv3+Caffe+OpenCV3.0+配置
    npy数据的保存与读取
    update_TypeError
    Git操作流程,基本命令演示
    CSS 的优先级机制[总结]
    Git 进阶 —— 远程仓库
    Git实现从本地添加项目到远程仓库
  • 原文地址:https://www.cnblogs.com/hehe520/p/6147720.html
Copyright © 2011-2022 走看看