深度學習:基於K8S的分散式Tensorflow系統

IT大咖說發表於2018-05-18

深度學習:基於K8S的分散式Tensorflow系統

內容來源:2017年6月10日,才雲 (Caicloud )高階軟體工程師岑鵬浩在“Kubernetes Meetup 中國 2017【南京站】”進行《基於Kubernetes的分散式Tensorflow系統》演講分享。IT 大咖說(微信id:itdakashuo)作為獨家視訊合作方,經主辦方和講者審閱授權釋出。

閱讀字數:3718 | 9分鐘閱讀

嘉賓演講視訊及PPT回顧:t.cn/RnVeXX1

摘要

雖然TensorFlow已經成為了實現深度學習演算法最受歡迎的工具之一,但要將其應用於海量資料上仍然存在效率問題。為了提高TensorFlow的執行速度,我們將TensorFlow並行化的跑在了Kubernetes叢集上。在本次講座中將介紹如何使用Kubernetes管理可使用CPU和GPU的TensorFlow叢集。

我今天的分享,第一個先介紹下什麼是深度學習,有一個什麼樣的歷史,包括它現在的一些現狀;第二個是TaaS的簡介;最後是分散式Tensorflow系統是如何跑在Kubernetes上的。

深度學習的背景

深度學習:基於K8S的分散式Tensorflow系統第一張圖,大家應該都知道是什麼事情吧?就是在浙江烏鎮舉行的AlphaGo和柯潔的圍棋比賽,柯潔是0:3失敗,AlphaGo就是用的深度學習的架構。右邊是Google自動駕駛的一個專案,大家也應該比較熟悉,它其實也是基於深度學習來完成的一個專案。

深度學習:基於K8S的分散式Tensorflow系統

左邊是一個影象視訊出來的效果,大家可以看一下,你告訴它一張圖片,它可以在這張圖片裡面自動標識出來圖片裡面有東西,不同的顏色是代表不同的東西,左邊有兩把椅子,有一隻狗和一個小孩。這個背後也是用的深度學習的東西。

這個裡面有很多龐大的一些圖片的資料,你可以基於它的資料去訓練你的模型,它也可以給出一些測試的資料,你可以根據它的測試資料來驗證你的模型的準確率。右邊一個就是圖片識別理念的變化,每年會舉辦圖片識別的比賽,包括學術界都會來驗證他們深度學習的效果。大家可以看到2010年、2012年之前,這個錯誤率是在28%、26%的一個數值,當影象識別出來以後,錯誤率在大幅度下降。這邊是有一個5.1%,這個是人類自己識別的錯誤率。大家發現2015年之後機器的識別錯誤率明顯低於人類。

深度學習的實現

深度學習是怎麼做的呢?其實簡單地概括來講,就是三個步驟。

第一個步驟是資料的準備,大家可以理解為一些特徵的提取,包括去分析你到底要解決什麼問題。比如剛才那個例子,就是我怎麼樣讓機器來識別一張圖片裡面有什麼樣的東西,這就是具體的實際問題。當你的資料準備好以後,你要準備你訓練的資料以及你測試的資料。

當你的資料準備好以後,你要準備你訓練的資料以及你測試的資料。當你的資料準備好了之後,下面就是一些訓練的工作,其實就是不斷地優化你的模型,讓它不斷地接近你的預期,當你的預期比較滿足了,你就可以把這個模型打包成一個產品,真正地提供一個服務。

這個資料準備好後,就通過一個模型訓練,訓練好了之後打包,就是一個很簡單的步驟流程。

訓練模型

模型大家可以簡單地理解為一個資料公式,大家比較好理解。訓練的過程,其實X就是一些輸入,就是我一些訓練的資料,我把X傳給這樣一個方程,A和B是我要找到的兩個值,大家可以認為是我訓練的一個結果。就是我要找到一個非常滿意的那個B,讓這個Y等於我的一個預期。

訓練的過程就是不斷地把這個X值去調整,不斷地去評估Y的值,這樣經過很多輪迭代之後,就可以把Y的值出來的結果和我們的預期相符。這樣我們就認為一次訓練就結束了。當然實際在工作中可能這會是一個不斷優化的過程,真正的一個模型可能它的引數,就是A和B可能是成千上萬的。我們今天講的主要就是訓練這一塊的內容,前面的資料準備和後面的模型託管基本上沒有涉及到。

TensorFlow Introduction

剛才說了這個深度學習的背景,還有它的一些簡單的東西,不知道大家有沒有一個基礎的認識。

TensorFlow是深度學習的框架,它支援的語言很多,也支援分散式的東西。有人問,怎麼用一句話來概括TensorFlow的特點?TensorFlow就像是深度學習裡的積木,你可以通過這套積木,來設計你想要的汽車也好,房子也好,還有很多很多東西。

學術界可以用這套積木來搭建設計很精美的模型,來展示給大眾來看一下。工業界也可以用這套積木來構建一個很穩定的產品,把他們的一些對外的服務提供出來。

所以這裡會有一個特點,就是它兼顧著學術界和工業界,這也是它能在很短的時間內迅速推廣的一個比較重要的原因。這邊列了一些它的好處,包括它內嵌了很多深度學習的演算法和模型,大家入手會比較容易。

深度學習:基於K8S的分散式Tensorflow系統

TensorFlow可以跑在很多硬體的平臺上面,包括CPU、GPU和TPU,TPU是Google專門用來跑TensorFlow的一個伺服器,AlphaGo也是跑在這個上面的,所以說這個平臺的一些可擴充套件性是非常好的。

舉個例子,你現有手機上的翻譯軟體,其實就是把TensorFlow執行在手機上面,然後訓練了一個翻譯模型,最後可以幫助你算出來一些結果。

深度學習:基於K8S的分散式Tensorflow系統

這邊列了一下它支援的語言,它的語言庫也是很豐富的,C++是比較好的,JAVA也有。這個是官網的一個截圖,包括京東、小米都在用這個TensorFlow。

一個好的開源框架其實跟它的社群是密切相關的,這個是列出來TensorFlow常用的一些深度學習的社群活躍度,TensorFlow是在2015年10月份開源的,大家可以看到很明顯的一個上升的曲線。Google開源了這個之後,社群的活躍度提升是非常明顯的,它已經遠遠超過了其他的一些開源的框架。

深度學習:基於K8S的分散式Tensorflow系統

簡單地執行一個TensorFlow程式

TensorFlow的一些歷史我們就講到這裡,現在我們簡單地執行一個TensorFlow的程式,這邊列出了一個docker的映象,這個也很簡單,把兩邊埠執行出來,這個是我們才雲自己做的東西。

深度學習:基於K8S的分散式Tensorflow系統

這個映象跑會有兩個效果,會啟用一個線上的編輯器,可以在裡面執行的程式碼。第二個是啟用了一個視覺化的工具,可以看出來你的模型長什麼樣子。

深度學習:基於K8S的分散式Tensorflow系統

我們這邊有一個Hello World的程式,就是一個簡單的程式碼,最重要的就是session,這個是很關鍵的一個東西。它怎麼樣說明變數呢?其實它會說明一些常量或者一些變數,都是有一些很常見的說明方法。這邊我們定義了input1和input2。這裡有一個需要注意的地方就是要對這個變數進行初始化,初始化之後才能使用這個變數。第二個是我加入了一個演算法,把我們剛才定義的input1和input2加起來,是一個很簡單的例子。這邊定義了一個writer,最後一句就是真正開始執行起來了。

執行完了之後,剛才也講到了tensorboard,這個是預設的一個埠,啟起來之後,右邊是一個目錄的效果,大家可以看到inprt2,這邊有一個加法。你把每個圖形展開之後就是這樣一個東西,這是生成隨機數的方法,裡面都是它生成的細節。當這個模型很複雜的時候,這個東西是很有幫助的,可以很直觀地來理解這些東西之間的關係,這樣看起來會很方便。

Inception—v3模型

剛才也說了TensorFlow它開源,它很快,它支援的框架很多等眾多優點。但其實它也不是萬能的,每一個新的東西出來它都是解決了部分的問題,同樣它也會帶來一些新的問題。

我們可以看到深度學習對於計算資源的需求是非常龐大的,現在有一個叫Inception—v3的模型,這個模型它裡面大概有2500萬的引數需要去調整。當它執行這樣一次訓練過程,大概需要執行50億次的加法或者是乘法的操作,當你真正地遇到實際問題的時候,你的模型就會非常的龐大,它帶來的實際計算的需求也會非常驚人。

深度學習:基於K8S的分散式Tensorflow系統

還有就是它的神經網路的模型是非常複雜的,它很難去優化,這邊舉出一個例子,我們把剛才Inception—v3的模型,跑一遍大概需要半年時間,這個在我們真正的工作當中是不能容忍的,半年的時間才知道我這個模型跑出什麼結果,公司可能都已經不存在了。

TensorFlow+Kubernetes

我們這邊其實利用了TensorFlow和Kubernetes結合來解決了真正遇到的問題,我們接下來會給大家簡單地介紹一下怎樣把一個分散式的TensorFlow跑起來。

深度學習:基於K8S的分散式Tensorflow系統


我們先講一下在單機上面怎麼跑,我們這邊有一個機器,它的名字叫job:local,它其實是一個task:0,它裡面CPU和GPU各有一塊。我們首先在CPU:0這一塊有一個語法,然後會在GPU上面進行一個計算,這樣會更快地得到我們的結果。

深度學習:基於K8S的分散式Tensorflow系統


output簡單地進行一個乘法,把這個和變數1做一個乘法,和變數2進行一個加法。我們同時要計算一下我們的損失函式,大家可以理解我用損失函式來評估我計算出來的結果和我預期之間的差,當這個差越小的時候說明它越接近我的預期。

深度學習:基於K8S的分散式Tensorflow系統

我希望今天講完之後大家起碼知道TensorFlow是怎麼回事,它做什麼樣的工作。

今天的分享就到這裡,謝謝大家!


相關文章