當Spark遇上TensorFlow分散式深度學習框架原理和實踐

藍色的葉子發表於2018-04-16

近年來,機器學習和深度學習不斷被炒熱,tensorflow 作為谷歌釋出的數值計算和神經網路的新框架也獲得了諸多關注,spark和tensorflow深度學習框架的結合,使得tensorflow在現有的spark叢集上就可以進行深度學習,而不需要為深度學習設定單獨的叢集,為了深入瞭解spark遇上tensorflow分散式深度學習框架的原理和實踐,飛馬網於4月10日晚,邀請到先後就職於百度、騰訊,負責過多個大資料研發工作的李曙鵬老師進行線上直播,主要向我們介紹spark和深度學習的基本原理、spark與深度學習領域相結合的最新的發展方向,以及如何結合tensorflowonspark開源框架,構建一個分散式影象分類模型訓練。

微信圖片_20180411091636.jpg

以下是本次分享實錄:

幻燈片2.JPG

上面這張圖片顯示的是本次直播所針對的受眾和可能的收益,大家可以瞭解一下。

一.大資料的價值

什麼是大資料的價值呢?李老師根據自身以往的專案經驗和網際網路主流的大資料應用場景,大致總結了以下三種價值。

幻燈片4.JPG

二.計算的核心問題

結合上面所說的大資料的價值和應用場景,我們把它歸納為一條計算流:首先從資料儲存當中經過資料加工、抽取,得到提煉後的資料、特徵,然後進行進一步的模型訓練,得到模型。

幻燈片5.JPG

這條計算流的核心問題可以歸納為y=f(x)這個函式。對於第一階段的資料ETL和查詢來講,主要解決的是資料來源對接、實時資料整合、資料歸一化、特徵生成等應用場景,它的計算框架代表是spark,輸入是f()\x,輸出是y,非常適合做分散式資料計算。第二階段的模型訓練,主要有模型建模、反向計算、梯度更新、超引數調優、效果評估等流程,它的計算框架代表是tensorflow,輸入是x\y,輸出是f(),更多關注的是模型建模和分散式引數更新。

接下來,我們就針對以上兩個框架做一些基本原理的介紹和概述。

三.spark概述

1.spark的核心抽象:RDD

為什麼要做RDD這樣的抽象呢?主要是因為它的一致性、高效並行、容錯機制,RDD遮蔽了分散式的複雜性,使開發程式時簡單如寫單機程式。

RDD也提供了一些操作,如transform和action,通過對RDD操作業務的封裝以及計算邏輯,我們就會形成一個大的DAG計算圖(參考下圖右)。

幻燈片6.JPG

2.spark的大資料生態:

這部分是講spark的資料生態,包括它支援的元件庫、部署環境和資料來源。

幻燈片7.JPG

3.Spark SQL和Spark Streaming:

我們簡要介紹一下這兩個比較重要的元件,首先是spark sql,它的典型應用場景是OLAP多維分析,它提供了一個DataFrame抽象介面,等價於RDD,如下圖所示。

幻燈片8.JPG

Spark Streaming是spark的一個實時處理元件,它的典型應用場景是實時特徵處理,它提供了一個Dstreams抽象介面,直觀上理解Dstreams就是一個持續的RDD,如下圖。

幻燈片9.JPG

四.Deep Learning概述

下面,我們一起來了解關於Deep Learning的相關內容。

1.Deep Learning模型:

第一個模型是非常經典的多層感知器模型(MLP)。首次這個模型有一個輸入層,在輸入層後面有兩個隱藏層,最後是輸出層。這個模型的特點是全連線,在最後輸出之前有一個Softmax函式,它的作用是把最終的權值轉換為最直觀的概率。理論上來講,MLP這種帶有隱藏層的神經網路可以擬合一切的函式,但它的計算量很大,所以傳統的MLP模型並不適合去更深層次地加深網路結構。

幻燈片10.JPG

真正把神經網路推向更深層次網路結構模型的是CNN卷積神經網路,它通常應用在影象分類等領域,這裡有一個概念—感受野,所謂感受野就是空間區域性性的考慮,它認為影象上比較接近的影象領域具有更強的相關性,影象上更遠的畫素之間相關性更弱,基於感受野的考慮,它把全連線層替換為卷積操作。

卷積操作的特點是可以將區域性特徵抽象化,另外大幅減少計算量,以便加深神經網路,豐富語義表達。

圖片2.png

2.Tensorflow模型建模與訓練:

介紹完深度學習模型後,回到我們的tensorflow部分,首先我們瞭解一下tensorflow是怎樣來做模型建模的。如下圖所示,X是Tensor,W和b是Variable,Matmul、Add、ReLU都是Operator,最後組成一個神經網路圖Graph。

幻燈片12.JPG

其次,我們來了解一下tensorflow訓練的核心問題—擬合f(),主要通過反向梯度計算來擬合f(),反向梯度計算的目的是計算梯度和更新引數,這裡涉及到Loss函式和最小化Loss。那麼怎麼去計算梯度呢?主要通過鏈式求導(看下圖右)。一次鏈式求導只是一次的前向和後向的計算結果,在訓練流程當中,我們通常批量計算,所以會涉及batch_size和epoch。

幻燈片13.JPG

最後我們結合一個程式碼事例,回顧一下前面所講的知識點:

幻燈片14.JPG

我們以多層感知器模型MLP為例,首先需要建立一個模型,模型定義就是兩個隱藏層加最後的輸出層,定義好模型之後,我們需要定義損失函式,在這裡它是對你的標籤和預測輸出進行的交叉熵的損失定義,然後選擇一個optimizer的優化器來做優化訓練,

在訓練開始之前,你需要去調一個sess.run(init)對權值做一個隨機初始化的過程,初始化之後,進入到我們的訓練階段。

3.Tensorflow分散式訓練機制:

剛才介紹的是tensorflow怎麼去定義模型以及怎麼去做反向計算,那麼,在大規模資料場景下,它又是怎樣工作的?

幻燈片15.JPG

Tensorflow本身提供了一些並行機制,第一個是模型並行機制,就是基於圖去拆分(如上圖左下),它會把一張大的圖拆分成很多部分,每個部分都會在很多裝置上去執行、計算。通常是針對一個節點無法存下整個模型的情況下,去對圖進行拆分。

更多場景下我們的資料量會比較大,這時候就採用資料並行機制,在這種機制下tensorflow有兩個角色,一個是引數伺服器,負責引數的儲存和交換更新,一個是工作節點,負責具體的模型計算。每個工作節點會負責它領域內的資料分片所對應模型引數的更新計算,同時它們又會向引數伺服器去傳遞它所計算的梯度,由引數伺服器來彙總所有的梯度,再進一步反饋到所有節點,根據引數伺服器合併引數的方式又分為同步更新和非同步更新,這兩種更新方式各有優缺點,非同步更新可能會更快速地完成整個梯度計算,而對於同步更新來講,它可以更快地進行一個收斂,選擇哪種方式取決於實際的應用場景。

五.Deep Learning On Spark

經過剛才的介紹,我們知道spark是一個分散式的通用計算框架,而以tensorflow為代表的deep learning是一個分散式模型訓練框架,它更多專注在梯度計算,那為什麼要將兩者整合呢?整合的意義在哪裡?意義就是能實現更好的分散式訓練和資料傳輸。

幻燈片16.JPG

針對分散式訓練的場景,雅虎開源了TensorflowOnSpark的開源框架,它主要實現tensorflow能夠與spark相結合做分散式訓練。同時也有其它的一些機制,例如,CaffeOnSpark、MMLSpark(CNTK)、PaddleOnSpark。

TensorflowOnSpark解決的核心問題是將spark作為分散式tensorflow的底層調動機制,通過spark executor去把tensorflow的程式調動起來,這樣在進行tensorflow訓練時就不需要手動地去組建網路。它也提供了一個API,通過調TFCluster.run這樣一個API,可以快速獲得tensorflow的一個分散式訓練環境。

幻燈片17.JPG

除此之外TensorflowOnSpark還提供了基於RDD的資料並行機制,如下圖所示。這套機制非常方便地整合了spark已有的RDD處理機制,可以更好地跟spark sql或spark streaming去做相應的整合。

幻燈片18.JPG

然後進入到另外一個方向,叫做spark-deep-learning,是由spark的創始公司—Data Bricks發起的,它主要的目標是提供一些high-level的API,把底層的模型進行元件化,同時它期望可以相容底層深度式學習框架。

幻燈片19.JPG

這裡有個“Transfer Learning as a Pipeline”的例子供大家瞭解,如下圖所示:

圖片1.png

TensorflowOnSpark Pipeline開發了兩個API,一個是TFEstimator,另一個是TFModel,提供了這兩個之後,你可以直接把它們整合到spark-deep-learning pipeline裡面,進行進一步的訓練。

幻燈片20.JPG

六.TensorflowOnSpark案例實踐

最後一部分,我們來進行案例實踐介紹,我們要解決的是一個影象分類問題,這裡採用了一個kaggle dataset,叫做花朵識別,有5個類別,4000多張圖片,包括鬱金香、太陽花、蒲公英、玫瑰和雛菊這五種花。把這些資料預先儲存於MongoDB中。我們的案例實踐是一個分散式解決方案,包括分散式資料獲取、分散式訓練、分散式評估。

幻燈片21.JPG

以下幾張圖片是程式碼示例,簡單瞭解一下:

幻燈片22.JPG

幻燈片23.JPG

幻燈片24.JPG

幻燈片25.JPG

幻燈片26.JPG

下面是效果演示,左邊是圖片,右邊是模型預測結果,預測結果都是一個概率值,根據概率值的大小來判定這是哪一類花朵:

幻燈片27.JPG

幻燈片28.JPG

幻燈片29.JPG

幻燈片30.JPG

幻燈片31.JPG

以上六部分就是本次分享的主要內容,接下來是問答時間,我們來看看都有哪些問題。

1.整個訓練過程需要人工參與嗎?準確率的提高是需要人工來參與嗎?

李老師:整個訓練過程不需要人工參與,準確率的提高涉及超參優化,deep leaning pipeline中提供了grid search機制,可以做些自動超參選擇。

2.現在這訓練的過程是不是隻針對靜態的圖片?動態的場景可以嗎?

李老師:你的動態場景如果是視訊,本身也可抽幀為圖片,視訊分類是另外一種應用問題,但底層也需要藉助已有的影象分類模型,影象分類本身的應用場景非常廣,比如和無人機相結合。

3.這套框架適用於文字的自動分類嗎?

李老師:框架同樣適合文字分類等其他領域,差別在於資料schema和模型,訓練過程涉及到一些影象歸一化的過程,但沒有模版匹配,你可以理解為所有的特徵抽取都是由deep learning自動抽取出來的。

以上就是本次線上直播的全部內容,相信通過本次學習,一定對深度學習和機器演算法有了更細緻深入的掌握。想了解更多更詳細內容的小夥伴們,可以關注服務號:FMI飛馬網,點選選單欄飛馬直播,即可進行學習。

服務號.jpg

相關文章