Kubernetes1.6新特性:全面支援多顆GPU

容器技術愛好者發表於2017-04-01

(一)  背景資料

GPU就是圖形處理器,是Graphics Processing Unit的縮寫。電腦顯示器上顯示的影象,在顯示在顯示器上之前,要經過一些列處理,這個過程有個專有的名詞叫“渲染" ,以前計算機上是沒有GPU的,都是通過CPU來進行“渲染”處理的,這些涉及到“渲染”的計算工作非常耗時,佔用了CPU的大部分時間。之後出現了GPU,是專門為了實現“渲染”這種計算工作的,用來將CPU解放出來,GPU是專為執行復雜的數學和幾何計算而設計的,這些計算是“渲染”所必需的。

下面看看百度百科上CPU同GPU的對比圖,其中綠色的是計算單元:


可以看出來GPU有大量的計算單元,所以GPU是專門為“渲染”這種計算工作設計的。

(二)  應用領域

最開始同GPU相關的應用只是簡單地停留在圖形相關應用上,比如遊戲中3D圖形“渲染”等影象處理應用,現在GPU的應用已經非常廣泛的,在遊戲、娛樂、科研、醫療、網際網路等涉及到大規模計算的領域都有GPU應用的存在,比如高效能運算應用、機器學習應用、人工智慧應用、自動駕駛應用、虛擬現實應用、自然語言處理應用等等。

1、下面看看Nvidia提供的深度學習領域使用GPU的分析結果:


可以看出來從2013年到2015年在深度學習領域呈現出爆發性增長的趨勢。

2、下面看看Nvidia提供的資料:


使用GPU來實現深度學習應用後,在自動駕駛、醫療診斷和機器學習三方面效率提高的十分明顯。

(三)  Kubernetes 1.3中支援GPU的實現

在kubernetes1.3中提供了對Nvidia品牌GPU的支援,在kubernetes管理的叢集中每個節點上,通過將原有的Capacity和Allocatable變數進行擴充套件,增加了一個針對Nvidia品牌GPU的α特性:alpha.kubernetes.io/nvidia-gpu。其中Capacity變數表示每個節點中實際的資源容量,包括cpu、memory、storage、alpha.kubernetes.io/nvidia-gpu,而Allocatable變數表示每個節點中已經分配的資源容量,同樣包括包括cpu、memory、storage、alpha.kubernetes.io/nvidia-gpu。


在啟動kubelet的時候,通過增加引數--experimental-nvidia-gpu來將帶有GPU的節點新增到kubernetes中進行管理。這個引數experimental-nvidia-gpu用來告訴kubelet這個節點中Nvidia品牌GPU的個數,如果為0表示沒有Nvidia品牌GPU,如果不增加這個引數,那麼系統預設為這個節點上沒有Nvidia品牌GPU。

當節點上安裝有多塊Nvidia品牌GPU的時候,引數experimental-nvidia-gpu是可以輸入大於1的數值的,但是對於kubernetes1.3這個版本,GPU還是個α特性,在程式碼中引數experimental-nvidia-gpu其實只支援兩個值,分別是0和1,我們通過下面程式碼就可以看出來:


在執行docker的時候,需要對映節點上的裝置到docker中,這段程式碼是在告訴docker,只對映第一塊Nvidia品牌GPU。通過上面程式碼可以看出來,在kubernetes1.3中,GPU這個α特性,引數experimental-nvidia-gpu其實只支援兩個值,分別是0和1。通過上面程式碼也可以看出來,為什麼在kubernetes1.3中只支援Nvidia品牌GPU,對於不同品牌的GPU,對映到linux作業系統裡面有著不同的裝置路徑,需要針對不同的GPU品牌分別進行實現。

(四)  Kubernetes 1.6中支援GPU的實現

在kubernetes1.6中更全面的提供了對Nvidia品牌GPU的支援,保留了kubernetes1.3中針對Nvidia品牌GPU的α特性:alpha.kubernetes.io/nvidia-gpu,但是在啟動kubelet的時候,去掉了引數--experimental-nvidia-gpu,改成了通過配置Accelerators為true來啟動這個α特性,完整的啟動引數是--feature-gates="Accelerators=true"。

在kubernetes1.3中只能利用節點上的一顆NvidiaGPU,但是在kubernetes1.6中會自動識別節點上的所有Nvidia GPU,並進行排程。


從上面程式碼中就可以看出來,在1.6中可以獲取節點中所有NvidiaGPU裝置。

下面是1.6中在kubelet中增加的Nvidia GPU相關結構體:


在nvidiaGPUManager這個結構體中,allGPUs變數表示這個節點上所有的GPU資訊;allocated變數表示這個節點上已經被分配使用的GPU資訊,這個allocated變數是一個podGPUs結構體變數,用來表示POD同已使用GPU的對應關係;dockerClient變數是docker介面變數,用來表示所有使用GPU的docker;activePodsLister變數表示這個節點上所有活動狀態的POD,通過這個變數,可以釋放已經處於終止狀態POD所繫結的GPU資源。

在kubernetes中Nvidia GPU這個特性只是在容器是docker的時候才生效,如果容器使用的是rkt,是無法使用到Nvidia GPU的。

在1.6中可以參照下面樣例使用Nvidia GPU:


可以看到,在1.6中使用GPU的時候,不同docker之間是無法共享GPU的,也就是說每個docker都會獨佔整個GPU,而且其實還需要kubernetes叢集中所有節點上面的NvidiaGPU型別都是相同的,如果在一個叢集中有的不同節點上面的Nvidia GPU型別不同,那麼還需要給排程器配置節點標籤和節點選擇器,用來區分不同Nvidia GPU型別的節點。

在節點啟動時,可以指明Nvidia GPU型別,並且作為節點標籤傳遞給kubelet,如下所示:


在使用的時候,可以參考下面樣例:


在這個樣例中,利用到了節點親和性規則,保證POD只能使用GPU型別是"TeslaK80"或"Tesla P100"的節點。

如果已經在節點上安裝了CUDA(Compute UnifiedDevice Architecture,是顯示卡廠商NVIDIA推出的運算平臺。 CUDA™是一種由NVIDIA推出的通用平行計算架構,該架構使GPU能夠解決複雜的計算問題。它包含了CUDA指令集架構以及GPU內部的平行計算引擎),那麼POD可以通過hostPath卷外掛來訪問CUDA庫:


(五)  未來展望

以後會逐漸完善這個α特性,讓GPU成為kubernetes中原生計算資源的一部分,而且會提高使用GPU資源的方便性,還會讓kubernetes自動確保使用GPU的應用可以達到最佳效能。

隨著機器學習的火熱,為了支撐各種以GPU為主的機器學習計算平臺,相信kubernetes在GPU處理上還會繼續快速完善,逐漸成為機器學習的底層編排架構。

 

 

相關文章