(一)  背景资料

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来实现深度学习应用后,在自己主动驾驶、医疗诊断和机器学习三方面效率提高的十分明显。

(三)  Kubernetes 1.3中支持GPU的实现

在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。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9yc2Vmb290/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="166" width="491" alt="">

在启动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品牌分别进行实现。

(四)  Kubernetes 1.6中支持GPU的实现

在kubernetes1.6中更全面的提供了对Nvidia品牌GPU的支持,保留了kubernetes1.3中针对Nvidia品牌GPU的α特性:alpha.kubernetes.io/nvidia-gpu,可是在启动kubelet的时候。去掉了參数--experimental-nvidia-gpu,改成了通过配置Accelerators为true来启动这个α特性,完整的启动參数是--feature-gates="Accelerators=true"。

在kubernetes1.3中仅仅能利用节点上的一颗NvidiaGPU,可是在kubernetes1.6中会自己主动识别节点上的全部Nvidia GPU,并进行调度。

从上面代码中就能够看出来。在1.6中能够获取节点中全部NvidiaGPU设备。

以下是1.6中在kubelet中添加的Nvidia GPU相关结构体:

在nvidiaGPUManager这个结构体中,allGPUs变量表示这个节点上全部的GPU信息;allocated变量表示这个节点上已经被分配使用的GPU信息,这个allocated变量是一个podGPUs结构体变量,用来表示POD同已使用GPU的相应关系。dockerClient变量是docker接口变量,用来表示全部使用GPU的docker。activePodsLister变量表示这个节点上全部活动状态的POD,通过这个变量,能够释放已经处于终止状态POD所绑定的GPU资源。

在kubernetes中Nvidia GPU这个特性仅仅是在容器是docker的时候才生效。假设容器使用的是rkt,是无法使用到Nvidia GPU的。

在1.6中能够參照以下例子使用Nvidia GPU:

能够看到。在1.6中使用GPU的时候,不同docker之间是无法共享GPU的。也就是说每一个docker都会独占整个GPU,并且事实上还须要kubernetes集群中全部节点上面的NvidiaGPU类型都是同样的,假设在一个集群中有的不同节点上面的Nvidia GPU类型不同。那么还须要给调度器配置节点标签和节点选择器。用来区分不同Nvidia GPU类型的节点。

在节点启动时,能够指明Nvidia GPU类型,而且作为节点标签传递给kubelet。例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9yc2Vmb290/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="81" width="470" alt="">

在使用的时候,能够參考以下例子:

在这个例子中,利用到了节点亲和性规则,保证POD仅仅能使用GPU类型是"TeslaK80"或"Tesla P100"的节点。

假设已经在节点上安装了CUDA(Compute UnifiedDevice Architecture。是显卡厂商NVIDIA推出的运算平台。

CUDA™是一种由NVIDIA推出的通用并行计算架构。该架构使GPU可以解决复杂的计算问题。它包括了CUDA指令集架构以及GPU内部的并行计算引擎),那么POD可以通过hostPath卷插件来訪问CUDA库:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG9yc2Vmb290/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="519" width="306" alt="">

(五)  未来展望

以后会逐渐完好这个α特性,让GPU成为kubernetes中原生计算资源的一部分,并且会提高使用GPU资源的方便性,还会让kubernetes自己主动确保使用GPU的应用能够达到最佳性能。

随着机器学习的火热,为了支撑各种以GPU为主的机器学习计算平台。相信kubernetes在GPU处理上还会继续高速完好,逐渐成为机器学习的底层编排架构。

Kubernetes1.6新特性:全面支持多颗GPU的更多相关文章

  1. [置顶] Kubernetes1.7新特性:支持绕过docker,直接通过containerd管理容器

    背景情况 从Docker1.11版本开始,Docker依赖于containerd和runC来管理容器,containerd是控制runC的后台程序,runC是Docker公司按照OCI标准规范编写的一 ...

  2. kubernetes1.4新特性:支持两种新的卷插件

    背景介绍 在Kubernetes中卷的作用在于提供给POD持久化存储,这些持久化存储可以挂载到POD中的容器上,进而给容器提供持久化存储. 从图中可以看到结构体PodSpec有个属性是Volumes, ...

  3. kubernetes1.4新特性:支持sysctl命令

    背景介绍 sysctl是一个允许改变正在运行中的Linux系统内核参数的接口.可以通过sysctl修改Linux系统内核中的TCP/IP 堆栈和虚拟内存系统的高级选项,而且不需要重新启动Linux系统 ...

  4. kubernetes1.4新特性:支持Docker新特性

    (一)背景资料 在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dockerremote API,这个项目在https:// ...

  5. Kubernetes1.3新特性:支持GPU

    (一)  背景资料 GPU就是图形处理器,是Graphics Processing Unit的缩写.电脑显示器上显示的图像,在显示在显示器上之前,要经过一些列处理,这个过程有个专有的名词叫" ...

  6. kubernetes1.5新特性跟踪(续)

    Kubernetes发布历史回顾 Kubernetes 1.0 - 2015年7月发布 Kubernetes 1.1 - 2015年11月发布 Kubernetes 1.2 - 2016年3月发布 K ...

  7. Linux环境下Eclipse对C++新特性的支持设置

    Linux环境下Eclipse对C++新特性的支持设置     今天写一个简单的关于C11中的array容器的测试程序如下, #include <iostream> #include &l ...

  8. kubernetes1.5新特性跟踪

    Kubernetes发布历史回顾 Kubernetes 1.0 - 2015年7月发布 Kubernetes 1.1 - 2015年11月发布 Kubernetes 1.2 - 2016年3月发布 K ...

  9. kubernetes1.4新特性(一):支持sysctl命令

    sysctl是一个允许改变正在运行中的Linux系统内核参数的接口.可以通过sysctl修改Linux系统内核中的TCP/IP 堆栈和虚拟内存系统的高级选项,而且不需要重新启动Linux系统,就可以实 ...

随机推荐

  1. CodeForces 766D Mahmoud and a Dictionary

    并查集. 将每一个物品拆成两个,两个意义相反,然后并查集即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #i ...

  2. 洛谷P1414 又是毕业季 [数论]

    题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...

  3. 倚天屠龙(一):妙用IDA Pro--利用IDAPython编写调试插件

    一:前言 虽然静态分析有Radare2,Hopper这种新星之秀,动态调试有Ollydbg,Windbg这种老牌霸主,但是IDA Pro仍然是大部分二进制安全工程师最喜爱的工具,除了价格过于昂贵,基本 ...

  4. 浮生半日:探究Python字节码

    好吧!“人生苦短,请用Python”,作为python爱好者以及安全从业者,而且最近也碰到了一些这方面的问题,懂点python字节码还是很有必要的. Python是一门解释性语言,它的具体工作流程如下 ...

  5. 子查询在UPDATE 语句中的应用

    在UPDATE语句中可以在更新列表中以及WHERE语句使用子查询.下面演示一个将图书的出版日期全部更新为所有图书中的最新出版日期,SQL语句如下: UPDATE T_Book SET FYearPub ...

  6. 【推导】Codeforces Round #364 (Div. 2) D. As Fast As Possible

    一种方法是二分总时间,复杂度O(nlogn). 另外我们可以证明,当所有人同时到达终点的时候,是最优的,因为没有人的时间“浪费”了. 我们又发现,每个人的运动过程总是两段,要么是走路,要么是坐车.于是 ...

  7. 【构造】CDOJ1607 大学生足球联赛

    请自行百度逆时针轮转法 //单循环赛 逆时针轮转法 #include<cstdio> using namespace std; int n,a[70]; int main(){ scanf ...

  8. 【预处理】【分类讨论】Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains

    分几种情况讨论: (1)仅用C或D买两个 ①买两个代价相同的(实际不同)(排个序) ②买两个代价不同的(因为买两个代价相同的情况已经考虑过了,所以此时对于同一个代价,只需要保存美丽度最高的喷泉即可)( ...

  9. String类的compareTo()和compareToIgnoreCase()

    compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序) 1.如果字符串相等返回值0 2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值 ...

  10. 获取dataset结果集的第一行第一列字段

    DataSet fileNameDs = DbHelper.excuteSqlResultDataSet(strSql); ) { DataTable fileNameDt = fileNameDs. ...