omniture

才云新晉大神:GPU在Docker/K8S/TensorFlow的應用及實操經驗

2016-12-30 09:00 13873
GPU是如何應用在Docker/K8S/TensorFlow這些平臺上起到提升效率的作用的呢?趙慧智對此問題主要描寫了GPU在Docker、Kubernetes及TensorFlow領域中的應用,并介紹了在開發(fā)領域的實踐經驗。

杭州2016年12月30日電 /美通社/ -- Kubernetes上游計劃在其1.6 發(fā)行版本中加入GPU功能,提升應用程序運行效率。因為很多應用使用GPU可以提升效率,比如數(shù)據(jù)平臺應用TensorFlow通過使用GPU效率可以提升幾十甚至幾百倍。

那么,GPU是如何應用在Docker/K8S/TensorFlow這些平臺上起到提升效率的作用的?近日,才云新晉大神趙慧智用本篇文章給出了答案在文中,趙慧智主要描寫了GPU在Docker、Kubernetes、TensorFlow以及Kubernetes+TensorFlow領域中的應用,并介紹了在開發(fā)領域的實踐經驗,希望給大家?guī)斫梃b和指導意義,原文如下:

趙慧智
趙慧智

趙慧智

2016 年下旬加入才云,他是前HPE的Container team的Tech Lead,Kubernetes Member,在軟件研發(fā)領域有10多年的經驗。曾在HP和HPE工作五年多,先前負責過Linux Kernel及driver開發(fā),后負責Container在HPE Server上的性能及團隊管理工作,之后負責Kubernetes/Mesos在HPE服務器上的硬件enablement及開源工作。

為什么離開惠普,加入才云?

2016年下旬,前惠普Kubernetes技術領域的GPU專家趙慧智加盟才云。趙慧智從國內Kubernetes現(xiàn)狀、未來發(fā)展趨勢幾個方面大致說了一下加入才云的原因:“當時自己對Kubernetes有很多想法,覺得在云平臺里面其實有很多有意思的事情。比方說,如何提供穩(wěn)定的中間層來讓企業(yè)的業(yè)務更加的穩(wěn)定和安全;如何降低硬件的成本;如何應對業(yè)務的突飛猛進和彈性支持,諸如此類。一開始喜歡Kubernetes,覺得在這兩個技術以后將在技術領域大有作為。在技術領域,了解到才云研發(fā)實力很強,并且在Kubernetes里面有影響力,來到公司體驗之后感覺工作氛圍很好,于是就過來了。”

對于Kubernetes1.6中GPU功能的想法

趙慧智說:“關于Kubernetes1.6,我是希望把GPU的功能加進去,因為目前很多應用都能在GPU上跑出比CPU高很多的性能,而在云里面一個很好的地方是通用化,例如一個應用遷移到另外一個VM 或者Server上可以繼續(xù)運行,但是通用化也導致了一些硬件特性被屏蔽了,GPU就是其中之一,所以在Kubernetes這樣一種container編排的環(huán)境中如果能支持GPU,那么將會對一些應用的性能產生質的影響,例如深度學習、AI 等?!?/p>

以下是趙慧智GPU分享具體內容:

GPU

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

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

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

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

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

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

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

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

傳統(tǒng)方式:

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

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

多核計算方式:

多核計算方式
多核計算方式

如果進行編譯優(yōu)化會在特定操作系統(tǒng)里面把這個數(shù)組的相加分配到不同的core里面執(zhí)行,這樣所有的計算就會按照core的數(shù)量進行并發(fā),那么我們可以看到在數(shù)組操作中,效率的高低取決于core的多少。而通常個人的計算機一般會有2-8個core不等,而大部分服務器也很少會超過100個core。然而,一個GPU很容易就可以達到上千個core,這樣在進行并行計算的時候可以實現(xiàn)十幾甚至上百上千倍的效率提升。而GPU的價格遠遠低于相同個數(shù)core的CPU(多個)的價格。既然CUDA可以提供一般性的并發(fā)編程模型,那么我們來看看在CUDA平臺上上面的代碼該怎么寫。

代碼示例:

代碼示例
代碼示例

申請一塊GPU的內存,然后就可以把所有的并發(fā)操作都交給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.

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

目前我們已經支持了如何在container的層面支持GPU,但是這還遠遠不夠在container編排環(huán)境里面支持GPU,譬如我們在Kubernetes里面支持GPU。

GPU in K8S:

在Kubernetes里面我們做一些關于GPU的工作才能讓GPU能夠被調度起來,功能如下:

GPU discovery.(kubelet):加入這個功能是為了能夠讓Kubelet在啟動的同時就可以查找本機上的 GPU,而這個GPU消息可以發(fā)送給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資源的協(xié)議支持,譬如目前有CPU,memory等,為了讓GPU能夠被調度,我們需要引入GPU作為一個資源可以被調度。

GPU in TensorFlow:

在分布式TensorFlow環(huán)境里面,各個worker不互相通信,只會跟parameter server通信。所以即使將各個worker部署到不同的機器上也不會造成性能損耗。目前TensorFlow支持GPU進行training的運算,但需要進行編譯時設置。

GPU in TensorFlow
GPU in TensorFlow

GPU in K8S + TensorFlow

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

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