內容來源:2017年6月10日,才雲 (Caicloud )高級軟件工程師岑鵬浩在「Kubernetes Meetup 中國 2017【南京站】」進行《基於Kubernetes的分佈式Tensorflow系統》演講分享。IT 大咖說(微信id:itdakashuo)做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
算法
閱讀字數:3718 | 9分鐘閱讀docker
雖然TensorFlow已經成爲了實現深度學習算法最受歡迎的工具之一,但要將其應用於海量數據上仍然存在效率問題。爲了提升TensorFlow的運行速度,咱們將TensorFlow並行化的跑在了Kubernetes集羣上。在本次講座中將介紹如何使用Kubernetes管理可以使用CPU和GPU的TensorFlow集羣。服務器
我今天的分享,第一個先介紹下什麼是深度學習,有一個什麼樣的歷史,包括它如今的一些現狀;第二個是TaaS的簡介;最後是分佈式Tensorflow系統是如何跑在Kubernetes上的。微信
第一張圖,你們應該都知道是什麼事情吧?就是在浙江烏鎮舉行的AlphaGo和柯潔的圍棋比賽,柯潔是0:3失敗,AlphaGo就是用的深度學習的架構。右邊是Google自動駕駛的一個項目,你們也應該比較熟悉,它其實也是基於深度學習來完成的一個項目。網絡
左邊是一個圖像視頻出來的效果,你們能夠看一下,你告訴它一張圖片,它能夠在這張圖片裏面自動標識出來圖片裏面有東西,不一樣的顏色是表明不一樣的東西,左邊有兩把椅子,有一隻狗和一個小孩。這個背後也是用的深度學習的東西。session
這個裏面有不少龐大的一些圖片的數據,你能夠基於它的數據去訓練你的模型,它也能夠給出一些測試的數據,你能夠根據它的測試數據來驗證你的模型的準確率。右邊一個就是圖片識別理念的變化,每一年會舉辦圖片識別的比賽,包括學術界都會來驗證他們深度學習的效果。你們能夠看到2010年、2012年以前,這個錯誤率是在28%、26%的一個數值,當圖像識別出來之後,錯誤率在大幅度降低。這邊是有一個5.1%,這個是人類本身識別的錯誤率。你們發現2015年以後機器的識別錯誤率明顯低於人類。架構
深度學習是怎麼作的呢?其實簡單地歸納來說,就是三個步驟。框架
第一個步驟是數據的準備,你們能夠理解爲一些特徵的提取,包括去分析你到底要解決什麼問題。好比剛纔那個例子,就是我怎麼樣讓機器來識別一張圖片裏面有什麼樣的東西,這就是具體的實際問題。當你的數據準備好之後,你要準備你訓練的數據以及你測試的數據。編輯器
當你的數據準備好之後,你要準備你訓練的數據以及你測試的數據。當你的數據準備好了以後,下面就是一些訓練的工做,其實就是不斷地優化你的模型,讓它不斷地接近你的預期,當你的預期比較知足了,你就能夠把這個模型打包成一個產品,真正地提供一個服務。分佈式
這個數據準備好後,就經過一個模型訓練,訓練好了以後打包,就是一個很簡單的步驟流程。
模型你們能夠簡單地理解爲一個數據公式,你們比較好理解。訓練的過程,其實X就是一些輸入,就是我一些訓練的數據,我把X傳給這樣一個方程,A和B是我要找到的兩個值,你們能夠認爲是我訓練的一個結果。就是我要找到一個很是滿意的那個B,讓這個Y等於個人一個預期。
訓練的過程就是不斷地把這個X值去調整,不斷地去評估Y的值,這樣通過不少輪迭代以後,就能夠把Y的值出來的結果和咱們的預期相符。這樣咱們就認爲一次訓練就結束了。固然實際在工做中可能這會是一個不斷優化的過程,真正的一個模型可能它的參數,就是A和B多是成千上萬的。咱們今天講的主要就是訓練這一塊的內容,前面的數據準備和後面的模型託管基本上沒有涉及到。
剛纔說了這個深度學習的背景,還有它的一些簡單的東西,不知道你們有沒有一個基礎的認識。
TensorFlow是深度學習的框架,它支持的語言不少,也支持分佈式的東西。有人問,怎麼用一句話來歸納TensorFlow的特色?TensorFlow就像是深度學習裏的積木,你能夠經過這套積木,來設計你想要的汽車也好,房子也好,還有不少不少東西。
學術界能夠用這套積木來搭建設計很精美的模型,來展現給大衆來看一下。工業界也能夠用這套積木來構建一個很穩定的產品,把他們的一些對外的服務提供出來。
因此這裏會有一個特色,就是它兼顧着學術界和工業界,這也是它能在很短的時間內迅速推廣的一個比較重要的緣由。這邊列了一些它的好處,包括它內嵌了不少深度學習的算法和模型,你們入手會比較容易。
TensorFlow能夠跑在不少硬件的平臺上面,包括CPU、GPU和TPU,TPU是Google專門用來跑TensorFlow的一個服務器,AlphaGo也是跑在這個上面的,因此說這個平臺的一些可擴展性是很是好的。
舉個例子,你現有手機上的翻譯軟件,其實就是把TensorFlow運行在手機上面,而後訓練了一個翻譯模型,最後能夠幫助你算出來一些結果。
這邊列了一下它支持的語言,它的語言庫也是很豐富的,C++是比較好的,JAVA也有。這個是官網的一個截圖,包括京東、小米都在用這個TensorFlow。
一個好的開源框架其實跟它的社區是密切相關的,這個是列出來TensorFlow經常使用的一些深度學習的社區活躍度,TensorFlow是在2015年10月份開源的,你們能夠看到很明顯的一個上升的曲線。Google開源了這個以後,社區的活躍度提高是很是明顯的,它已經遠遠超過了其餘的一些開源的框架。
TensorFlow的一些歷史咱們就講到這裏,如今咱們簡單地運行一個TensorFlow的程序,這邊列出了一個docker的鏡像,這個也很簡單,把兩邊端口運行出來,這個是咱們才雲本身作的東西。
這個鏡像跑會有兩個效果,會啓用一個在線的編輯器,能夠在裏面運行的代碼。第二個是啓用了一個可視化的工具,能夠看出來你的模型長什麼樣子。
咱們這邊有一個Hello World的程序,就是一個簡單的代碼,最重要的就是session,這個是很關鍵的一個東西。它怎麼樣說明變量呢?其實它會說明一些常量或者一些變量,都是有一些很常見的說明方法。這邊咱們定義了input1和input2。這裏有一個須要注意的地方就是要對這個變量進行初始化,初始化以後才能使用這個變量。第二個是我加入了一個算法,把咱們剛纔定義的input1和input2加起來,是一個很簡單的例子。這邊定義了一個writer,最後一句就是真正開始運行起來了。
運行完了以後,剛纔也講到了tensorboard,這個是默認的一個端口,啓起來以後,右邊是一個目錄的效果,你們能夠看到inprt2,這邊有一個加法。你把每一個圖形展開以後就是這樣一個東西,這是生成隨機數的方法,裏面都是它生成的細節。當這個模型很複雜的時候,這個東西是頗有幫助的,能夠很直觀地來理解這些東西之間的關係,這樣看起來會很方便。
剛纔也說了TensorFlow它開源,它很快,它支持的框架不少等衆多優勢。但其實它也不是萬能的,每個新的東西出來它都是解決了部分的問題,一樣它也會帶來一些新的問題。
咱們能夠看到深度學習對於計算資源的需求是很是龐大的,如今有一個叫Inception—v3的模型,這個模型它裏面大概有2500萬的參數須要去調整。當它執行這樣一次訓練過程,大概須要執行50億次的加法或者是乘法的操做,當你真正地遇到實際問題的時候,你的模型就會很是的龐大,它帶來的實際計算的需求也會很是驚人。
還有就是它的神經網絡的模型是很是複雜的,它很難去優化,這邊舉出一個例子,咱們把剛纔Inception—v3的模型,跑一遍大概須要半年時間,這個在咱們真正的工做當中是不能容忍的,半年的時間才知道我這個模型跑出什麼結果,公司可能都已經不存在了。
咱們這邊其實利用了TensorFlow和Kubernetes結合來解決了真正遇到的問題,咱們接下來會給你們簡單地介紹一下怎樣把一個分佈式的TensorFlow跑起來。
咱們先講一下在單機上面怎麼跑,咱們這邊有一個機器,它的名字叫job:local,它實際上是一個task:0,它裏面CPU和GPU各有一塊。咱們首先在CPU:0這一塊有一個語法,而後會在GPU上面進行一個計算,這樣會更快地獲得咱們的結果。
output簡單地進行一個乘法,把這個和變量1作一個乘法,和變量2進行一個加法。咱們同時要計算一下咱們的損失函數,你們能夠理解我用損失函數來評估我計算出來的結果和我預期之間的差,當這個差越小的時候說明它越接近個人預期。
我但願今天講完以後你們起碼知道TensorFlow是怎麼回事,它作什麼樣的工做。
今天的分享就到這裏,謝謝你們!