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

來源:互聯網
上載者:User

標籤:資源   1.3   exp   water   cap   數學   操作   iss   locate   

(一)  背景資料

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處理上還會繼續快速完善,逐漸成為機器學習的底層編排架構。

 

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.