杭州2016年12月30日電 /美通社/ -- Kubernetes上游計(jì)劃在其1.6 發(fā)行版本中加入GPU功能,提升應(yīng)用程序運(yùn)行效率。因?yàn)楹芏鄳?yīng)用使用GPU可以提升效率,比如大數(shù)據(jù)平臺(tái)應(yīng)用TensorFlow通過(guò)使用GPU效率可以提升幾十甚至幾百倍。
那么,GPU是如何應(yīng)用在Docker/K8S/TensorFlow這些平臺(tái)上起到提升效率的作用的呢?近日,才云新晉大神趙慧智用本篇文章給出了答案。在文中,趙慧智主要描寫(xiě)了GPU在Docker、Kubernetes、TensorFlow以及Kubernetes+TensorFlow領(lǐng)域中的應(yīng)用,并介紹了在開(kāi)發(fā)領(lǐng)域的實(shí)踐經(jīng)驗(yàn),希望給大家?guī)?lái)借鑒和指導(dǎo)意義,原文如下:
趙慧智
2016 年下旬加入才云,他是前HPE的Container team的Tech Lead,Kubernetes Member,在軟件研發(fā)領(lǐng)域有10多年的經(jīng)驗(yàn)。曾在HP和HPE工作五年多,先前負(fù)責(zé)過(guò)Linux Kernel及driver開(kāi)發(fā),后負(fù)責(zé)Container在HPE Server上的性能及團(tuán)隊(duì)管理工作,之后負(fù)責(zé)Kubernetes/Mesos在HPE服務(wù)器上的硬件enablement及開(kāi)源工作。
為什么離開(kāi)惠普,加入才云?
2016年下旬,前惠普Kubernetes技術(shù)領(lǐng)域的GPU專家趙慧智加盟才云。趙慧智從國(guó)內(nèi)Kubernetes現(xiàn)狀、未來(lái)發(fā)展趨勢(shì)幾個(gè)方面大致說(shuō)了一下加入才云的原因:“當(dāng)時(shí)自己對(duì)Kubernetes有很多想法,覺(jué)得在云平臺(tái)里面其實(shí)有很多有意思的事情。比方說(shuō),如何提供穩(wěn)定的中間層來(lái)讓企業(yè)的業(yè)務(wù)更加的穩(wěn)定和安全;如何降低硬件的成本;如何應(yīng)對(duì)業(yè)務(wù)的突飛猛進(jìn)和彈性支持,諸如此類。一開(kāi)始喜歡Kubernetes,覺(jué)得在這兩個(gè)技術(shù)以后將在技術(shù)領(lǐng)域大有作為。在技術(shù)領(lǐng)域,了解到才云研發(fā)實(shí)力很強(qiáng),并且在Kubernetes里面有影響力,來(lái)到公司體驗(yàn)之后感覺(jué)工作氛圍很好,于是就過(guò)來(lái)了。”
對(duì)于Kubernetes1.6中GPU功能的想法
趙慧智說(shuō):“關(guān)于Kubernetes1.6,我是希望把GPU的功能加進(jìn)去,因?yàn)槟壳昂芏鄳?yīng)用都能在GPU上跑出比CPU高很多的性能,而在云里面一個(gè)很好的地方是通用化,例如一個(gè)應(yīng)用遷移到另外一個(gè)VM 或者Server上可以繼續(xù)運(yùn)行,但是通用化也導(dǎo)致了一些硬件特性被屏蔽了,GPU就是其中之一,所以在Kubernetes這樣一種container編排的環(huán)境中如果能支持GPU,那么將會(huì)對(duì)一些應(yīng)用的性能產(chǎn)生質(zhì)的影響,例如深度學(xué)習(xí)、AI 等?!?/p>
以下是趙慧智GPU分享具體內(nèi)容:
GPU
圖形處理器(英語(yǔ):graphics processing unit,縮寫(xiě):GPU),又稱顯示核心、視覺(jué)處理器、顯示芯片,是一種專門(mén)在個(gè)人電腦、工作站、游戲機(jī)和一些移動(dòng)設(shè)備(如平板電腦、智能手機(jī)等)上運(yùn)行繪圖運(yùn)算工作的微處理器。
GPU較大的好處就在于可以通過(guò)遠(yuǎn)遠(yuǎn)多于CPU的core數(shù)量來(lái)達(dá)到并行計(jì)算。
CUDA(Compute Unified Device Architecture,統(tǒng)一計(jì)算架構(gòu))是由NVIDIA所推出的一種集成技術(shù),是該公司對(duì)于GPGPU的正式名稱。通過(guò)這個(gè)技術(shù),用戶可利用NVIDIA的GeForce 8以后的GPU和較新的QuadroGPU進(jìn)行計(jì)算。亦是首次可以利用GPU作為C-編譯器的開(kāi)發(fā)環(huán)境。NVIDIA營(yíng)銷的時(shí)候,往往將編譯器與架構(gòu)混合推廣,造成混亂。實(shí)際上,CUDA可以兼容OpenCL或者NVIDIA的C- 編譯器。
CUDA提供了對(duì)于一般性通用需求的大規(guī)模并發(fā)編程模型,使用戶可以對(duì)NVIDIA GPU方便的對(duì)于 GPU進(jìn)行并發(fā)性編程。
CUDA編程模型與傳統(tǒng)編程模型比較:
樣例:將數(shù)組a與數(shù)組b相加,并將結(jié)果賦值給c
傳統(tǒng)方式:
數(shù)組會(huì)按照從a[0] + b[0] 一直順序執(zhí)行到a[n] + b[n]。
多核計(jì)算方式:
如果進(jìn)行編譯優(yōu)化會(huì)在特定操作系統(tǒng)里面把這個(gè)數(shù)組的相加分配到不同的core里面執(zhí)行,這樣所有的計(jì)算就會(huì)按照core的數(shù)量進(jìn)行并發(fā),那么我們可以看到在數(shù)組操作中,效率的高低取決于core的多少。而通常個(gè)人的計(jì)算機(jī)一般會(huì)有2-8個(gè)core不等,而大部分服務(wù)器也很少會(huì)超過(guò)100個(gè)core。然而,一個(gè)GPU很容易就可以達(dá)到上千個(gè)core,這樣在進(jìn)行并行計(jì)算的時(shí)候可以實(shí)現(xiàn)十幾甚至上百上千倍的效率提升。而GPU的價(jià)格遠(yuǎn)遠(yuǎn)低于相同個(gè)數(shù)core的CPU(多個(gè))的價(jià)格。既然CUDA可以提供一般性的并發(fā)編程模型,那么我們來(lái)看看在CUDA平臺(tái)上上面的代碼該怎么寫(xiě)。
代碼示例:
申請(qǐng)一塊GPU的內(nèi)存,然后就可以把所有的并發(fā)操作都交給GPU。
GPU in Docker
關(guān)鍵詞:--device
Docker是具有把device通過(guò)cgroup里面的deivce來(lái)mapping到container上的能力的,我們可以通過(guò)“--device”來(lái)達(dá)到這個(gè)目的。
docker run -it --device/dev/nvidia0:/dev/nvidia0 \ // 第一個(gè) Nvidia 卡
--device /dev/nvidia1:/dev/nvidia1 \ // 第二個(gè) Nvidia 卡
--device /dev/nvidiactl:/dev/nvidiactl \ // 這個(gè)是作為Nvidia操作的必須mount的設(shè)備
--device /dev/nvidia-uvm:/dev/nvidia-uvm \ // 這個(gè)是作為Nvidia操作的必須mount的設(shè)備
tf-cuda:v1.1beta/bin/bash
然后我們可以通過(guò)“docker inspect:” 來(lái)檢查container所指定的設(shè)備。
然后我們?cè)赾ontainer的內(nèi)部就可以看到相應(yīng)的設(shè)備并且可以使用了。
在設(shè)備已經(jīng)可以綁定了之后,我們就可以提供driver和CUDA的支持了,而Nvidia給了一個(gè)關(guān)于如何在 container層面支持GPU的原型,是基于Docker的,叫做Nvidia Docker。
Nvidia Docker所提供的功能:
Volume: Nvidia driver/NVML tools.
Assign GPUs to container automatically.
Basic cuda container build.
Multi-platform environment.
目前我們已經(jīng)支持了如何在container的層面支持GPU,但是這還遠(yuǎn)遠(yuǎn)不夠在container編排環(huán)境里面支持GPU,譬如我們?cè)贙ubernetes里面支持GPU。
GPU in K8S:
在Kubernetes里面我們做一些關(guān)于GPU的工作才能讓GPU能夠被調(diào)度起來(lái),功能如下:
GPU discovery.(kubelet):加入這個(gè)功能是為了能夠讓Kubelet在啟動(dòng)的同時(shí)就可以查找本機(jī)上的 GPU,而這個(gè)GPU消息可以發(fā)送給apiserver,但apiserver里面有GPU的信息后,就可以通過(guò)kube-scheduler進(jìn)行調(diào)度了。
GPUassignment/release. (kubelet):當(dāng)一個(gè)container存在GPU需求的時(shí)候,我們可以通過(guò)docker的--device 層面來(lái)支持對(duì)于GPU的assign和release Resource API.(kube-apiserver/kube-scheduler):在 kube-scheduler和kubelet之間需要一個(gè)關(guān)于GPU資源的協(xié)議支持,譬如目前有CPU,memory等,為了讓GPU能夠被調(diào)度,我們需要引入GPU作為一個(gè)資源可以被調(diào)度。
GPU in TensorFlow:
在分布式TensorFlow環(huán)境里面,各個(gè)worker不互相通信,只會(huì)跟parameter server通信。所以即使將各個(gè)worker部署到不同的機(jī)器上也不會(huì)造成性能損耗。目前TensorFlow支持GPU進(jìn)行training的運(yùn)算,但需要進(jìn)行編譯時(shí)設(shè)置。
GPU in K8S + TensorFlow
由于在部署分布式TensorFlow時(shí)極其繁瑣,并且在每次擴(kuò)容都需要進(jìn)行很多設(shè)置和操作。所以提供基于容器化的TensorFlow并運(yùn)行在Kubernetes上就使其變得相當(dāng)容易,而我們需要做的,就是在上面提到的如何讓Kubernetes支持GPU的情況下,將TensorFlow容器化。