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