omniture

才云新晉大神:GPU在Docker/K8S/TensorFlow的應(yīng)用及實(shí)操經(jīng)驗(yàn)

2016-12-30 09:00 13869
GPU是如何應(yīng)用在Docker/K8S/TensorFlow這些平臺(tái)上起到提升效率的作用的呢?趙慧智對(duì)此問題主要描寫了GPU在Docker、Kubernetes及TensorFlow領(lǐng)域中的應(yīng)用,并介紹了在開發(fā)領(lǐng)域的實(shí)踐經(jīng)驗(yàn)。

杭州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通過使用GPU效率可以提升幾十甚至幾百倍。

那么,GPU是如何應(yīng)用在Docker/K8S/TensorFlow這些平臺(tái)上起到提升效率的作用的?近日,才云新晉大神趙慧智用本篇文章給出了答案。在文中,趙慧智主要描寫了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ā)展趨勢(shì)幾個(gè)方面大致說了一下加入才云的原因:“當(dāng)時(shí)自己對(duì)Kubernetes有很多想法,覺得在云平臺(tái)里面其實(shí)有很多有意思的事情。比方說,如何提供穩(wěn)定的中間層來讓企業(yè)的業(yè)務(wù)更加的穩(wěn)定和安全;如何降低硬件的成本;如何應(yīng)對(duì)業(yè)務(wù)的突飛猛進(jìn)和彈性支持,諸如此類。一開始喜歡Kubernetes,覺得在這兩個(gè)技術(shù)以后將在技術(shù)領(lǐng)域大有作為。在技術(shù)領(lǐng)域,了解到才云研發(fā)實(shí)力很強(qiáng),并且在Kubernetes里面有影響力,來到公司體驗(yàn)之后感覺工作氛圍很好,于是就過來了?!?/p>

對(duì)于Kubernetes1.6中GPU功能的想法

趙慧智說:“關(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

圖形處理器(英語:graphics processing unit,縮寫:GPU),又稱顯示核心、視覺處理器、顯示芯片,是一種專門在個(gè)人電腦、工作站、游戲機(jī)和一些移動(dòng)設(shè)備(如平板電腦、智能手機(jī)等)上運(yùn)行繪圖運(yùn)算工作的微處理器。

圖為:從最初的 GEFORCE 6600 GT到K80的多GPU卡協(xié)同工作
圖為:從最初的 GEFORCE 6600 GT到K80的多GPU卡協(xié)同工作

GPU較大的好處就在于可以通過遠(yuǎn)遠(yuǎn)多于CPU的core數(shù)量來達(dá)到并行計(jì)算。

CUDA(Compute Unified Device Architecture,統(tǒng)一計(jì)算架構(gòu))是由NVIDIA所推出的一種集成技術(shù),是該公司對(duì)于GPGPU的正式名稱。通過這個(gè)技術(shù),用戶可利用NVIDIA的GeForce 8以后的GPU和較新的QuadroGPU進(jìn)行計(jì)算。亦是首次可以利用GPU作為C-編譯器的開發(fā)環(huán)境。NVIDIA營銷的時(shí)候,往往將編譯器與架構(gòu)混合推廣,造成混亂。實(shí)際上,CUDA可以兼容OpenCL或者NVIDIA的C- 編譯器。

上圖為CUDA編程基本邏輯
上圖為CUDA編程基本邏輯

CUDA提供了對(duì)于一般性通用需求的大規(guī)模并發(fā)編程模型,使用戶可以對(duì)NVIDIA GPU方便的對(duì)于 GPU進(jìn)行并發(fā)性編程。

CUDA編程模型與傳統(tǒng)編程模型比較:

樣例:將數(shù)組a與數(shù)組b相加,并將結(jié)果賦值給c

傳統(tǒng)方式:

傳統(tǒng)方式
傳統(tǒng)方式

數(shù)組會(huì)按照從a[0] + b[0] 一直順序執(zhí)行到a[n] + b[n]。

多核計(jì)算方式:

多核計(jì)算方式
多核計(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ì)超過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ā)編程模型,那么我們來看看在CUDA平臺(tái)上上面的代碼該怎么寫。

代碼示例:

代碼示例
代碼示例

申請(qǐng)一塊GPU的內(nèi)存,然后就可以把所有的并發(fā)操作都交給GPU。

GPU in Docker

關(guān)鍵詞:--device

Docker是具有把device通過cgroup里面的deivce來mapping到container上的能力的,我們可以通過“--device”來達(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

然后我們可以通過“docker inspect:” 來檢查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.

環(huán)境
環(huán)境

目前我們已經(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)度起來,功能如下:

GPU discovery.(kubelet):加入這個(gè)功能是為了能夠讓Kubelet在啟動(dòng)的同時(shí)就可以查找本機(jī)上的 GPU,而這個(gè)GPU消息可以發(fā)送給apiserver,但apiserver里面有GPU的信息后,就可以通過kube-scheduler進(jìn)行調(diào)度了。

GPUassignment/release. (kubelet):當(dāng)一個(gè)container存在GPU需求的時(shí)候,我們可以通過docker的--device 層面來支持對(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 TensorFlow
GPU in TensorFlow

GPU in K8S + TensorFlow

由于在部署分布式TensorFlow時(shí)極其繁瑣,并且在每次擴(kuò)容都需要進(jìn)行很多設(shè)置和操作。所以提供基于容器化的TensorFlow并運(yùn)行在Kubernetes上就使其變得相當(dāng)容易,而我們需要做的,就是在上面提到的如何讓Kubernetes支持GPU的情況下,將TensorFlow容器化。

GPU in TensorFlow+K8S
GPU in TensorFlow+K8S
消息來源:才云Caicloud
China-PRNewsire-300-300.png
全球TMT
微信公眾號(hào)“全球TMT”發(fā)布全球互聯(lián)網(wǎng)、科技、媒體、通訊企業(yè)的經(jīng)營動(dòng)態(tài)、財(cái)報(bào)信息、企業(yè)并購消息。掃描二維碼,立即訂閱!
collection