杭州2016年12月30日电 /美通社/ -- Kubernetes上游计划在其1.6 发行版本中加入GPU功能,提升应用程序运行效率。因为很多应用使用GPU可以提升效率,比如大数据平台应用TensorFlow通过使用GPU效率可以提升几十甚至几百倍。
那么,GPU是如何应用在Docker/K8S/TensorFlow这些平台上起到提升效率的作用的呢?近日,才云新晋大神赵慧智用本篇文章给出了答案。在文中,赵慧智主要描写了GPU在Docker、Kubernetes、TensorFlow以及Kubernetes+TensorFlow领域中的应用,并介绍了在开发领域的实践经验,希望给大家带来借鉴和指导意义,原文如下:
赵慧智
2016 年下旬加入才云,他是前HPE的Container team的Tech Lead,Kubernetes Member,在软件研发领域有10多年的经验。曾在HP和HPE工作五年多,先前负责过Linux Kernel及driver开发,后负责Container在HPE Server上的性能及团队管理工作,之后负责Kubernetes/Mesos在HPE服务器上的硬件enablement及开源工作。
为什么离开惠普,加入才云?
2016年下旬,前惠普Kubernetes技术领域的GPU专家赵慧智加盟才云。赵慧智从国内Kubernetes现状、未来发展趋势几个方面大致说了一下加入才云的原因:“当时自己对Kubernetes有很多想法,觉得在云平台里面其实有很多有意思的事情。比方说,如何提供稳定的中间层来让企业的业务更加的稳定和安全;如何降低硬件的成本;如何应对业务的突飞猛进和弹性支持,诸如此类。一开始喜欢Kubernetes,觉得在这两个技术以后将在技术领域大有作为。在技术领域,了解到才云研发实力很强,并且在Kubernetes里面有影响力,来到公司体验之后感觉工作氛围很好,于是就过来了。”
对于Kubernetes1.6中GPU功能的想法
赵慧智说:“关于Kubernetes1.6,我是希望把GPU的功能加进去,因为目前很多应用都能在GPU上跑出比CPU高很多的性能,而在云里面一个很好的地方是通用化,例如一个应用迁移到另外一个VM 或者Server上可以继续运行,但是通用化也导致了一些硬件特性被屏蔽了,GPU就是其中之一,所以在Kubernetes这样一种container编排的环境中如果能支持GPU,那么将会对一些应用的性能产生质的影响,例如深度学习、AI 等。”
以下是赵慧智GPU分享具体内容:
GPU
图形处理器(英语:graphics processing unit,缩写:GPU),又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上运行绘图运算工作的微处理器。
GPU较大的好处就在于可以通过远远多于CPU的core数量来达到并行计算。
CUDA(Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称。通过这个技术,用户可利用NVIDIA的GeForce 8以后的GPU和较新的QuadroGPU进行计算。亦是首次可以利用GPU作为C-编译器的开发环境。NVIDIA营销的时候,往往将编译器与架构混合推广,造成混乱。实际上,CUDA可以兼容OpenCL或者NVIDIA的C- 编译器。
CUDA提供了对于一般性通用需求的大规模并发编程模型,使用户可以对NVIDIA GPU方便的对于 GPU进行并发性编程。
CUDA编程模型与传统编程模型比较:
样例:将数组a与数组b相加,并将结果赋值给c
传统方式:
数组会按照从a[0] + b[0] 一直顺序执行到a[n] + b[n]。
多核计算方式:
如果进行编译优化会在特定操作系统里面把这个数组的相加分配到不同的core里面执行,这样所有的计算就会按照core的数量进行并发,那么我们可以看到在数组操作中,效率的高低取决于core的多少。而通常个人的计算机一般会有2-8个core不等,而大部分服务器也很少会超过100个core。然而,一个GPU很容易就可以达到上千个core,这样在进行并行计算的时候可以实现十几甚至上百上千倍的效率提升。而GPU的价格远远低于相同个数core的CPU(多个)的价格。既然CUDA可以提供一般性的并发编程模型,那么我们来看看在CUDA平台上上面的代码该怎么写。
代码示例:
申请一块GPU的内存,然后就可以把所有的并发操作都交给GPU。
GPU in Docker
关键词:--device
Docker是具有把device通过cgroup里面的deivce来mapping到container上的能力的,我们可以通过“--device”来达到这个目的。
docker run -it --device/dev/nvidia0:/dev/nvidia0 \ // 第一个 Nvidia 卡
--device /dev/nvidia1:/dev/nvidia1 \ // 第二个 Nvidia 卡
--device /dev/nvidiactl:/dev/nvidiactl \ // 这个是作为Nvidia操作的必须mount的设备
--device /dev/nvidia-uvm:/dev/nvidia-uvm \ // 这个是作为Nvidia操作的必须mount的设备
tf-cuda:v1.1beta/bin/bash
然后我们可以通过“docker inspect:” 来检查container所指定的设备。
然后我们在container的内部就可以看到相应的设备并且可以使用了。
在设备已经可以绑定了之后,我们就可以提供driver和CUDA的支持了,而Nvidia给了一个关于如何在 container层面支持GPU的原型,是基于Docker的,叫做Nvidia Docker。
Nvidia Docker所提供的功能:
Volume: Nvidia driver/NVML tools.
Assign GPUs to container automatically.
Basic cuda container build.
Multi-platform environment.
目前我们已经支持了如何在container的层面支持GPU,但是这还远远不够在container编排环境里面支持GPU,譬如我们在Kubernetes里面支持GPU。
GPU in K8S:
在Kubernetes里面我们做一些关于GPU的工作才能让GPU能够被调度起来,功能如下:
GPU discovery.(kubelet):加入这个功能是为了能够让Kubelet在启动的同时就可以查找本机上的 GPU,而这个GPU消息可以发送给apiserver,但apiserver里面有GPU的信息后,就可以通过kube-scheduler进行调度了。
GPUassignment/release. (kubelet):当一个container存在GPU需求的时候,我们可以通过docker的--device 层面来支持对于GPU的assign和release Resource API.(kube-apiserver/kube-scheduler):在 kube-scheduler和kubelet之间需要一个关于GPU资源的协议支持,譬如目前有CPU,memory等,为了让GPU能够被调度,我们需要引入GPU作为一个资源可以被调度。
GPU in TensorFlow:
在分布式TensorFlow环境里面,各个worker不互相通信,只会跟parameter server通信。所以即使将各个worker部署到不同的机器上也不会造成性能损耗。目前TensorFlow支持GPU进行training的运算,但需要进行编译时设置。
GPU in K8S + TensorFlow
由于在部署分布式TensorFlow时极其繁琐,并且在每次扩容都需要进行很多设置和操作。所以提供基于容器化的TensorFlow并运行在Kubernetes上就使其变得相当容易,而我们需要做的,就是在上面提到的如何让Kubernetes支持GPU的情况下,将TensorFlow容器化。