解讀微軟開源MMLSpark:統一的大規模機器學習生態系統

weixin_33766168發表於2018-11-10

AI前線導讀:目前,有很多深度學習框架支援與Spark整合,如Tensorflow on Spark等。然而,微軟開源的MMLSpark不僅整合了機器學習框架(CNTK深度學習計算框架、LightGBM機器學習框架),還可以將這些計算資源作為一種服務,以HTTP服務的形式對外提供給使用者。近日,微軟MMLSpark團隊發表了一篇論文對MMLSpark的架構進行詳細解讀,我們將基於這篇論文,就MMLSpark的相關元件的特性和一個利用MMLSpark進行物體識別的案例展開介紹。本文是AI前線第55篇論文導讀。

微軟開源MMLSpark機器學習生態系統,旨在擴充套件Apache Spark分散式計算庫,以解決深度學習、微服務編排、梯度提升、模型可解釋性等現代計算領域的問題。

微軟針對Spark生態系統,做了以下三個主要的貢獻:
(1)將機器學習元件CNTK、LightGBM和Spark統一;
(2)整合了Azure 雲端的Cognitive Services和實現了Spark的HTTP服務;
(3)部署所有的Spark計算,作為一種分散式的web服務。

MMLSpark在演算法和服務框架方面的優勢

1、Deep Learning 方面

藉助微軟的Cognitive Toolkit(CNTK) 深度學習框架,可以在Spark上做GPU加速。CNTK是類似Tensorflow、PyTorch、MxNet的深度學習框架,可以幫助工程師和研究員解決各種機器學習問題,還可以編寫一些GPU加速程式碼。為了讓Spark使用者可以呼叫和訓練CNTK模型,我們在基於C++語言實現的CNTK前提下,對CNTK進行了簡單的包裝和介面的生成,提供了Java的繫結。這樣使Java,Scala和其他基於JVM語言的使用者對CNTK的可操作性大大增強。同時,我們還為Spark transformers 自動生成了PySpark、SparklyR的繫結。在廣播模型方面,我們用Bit-Torrent 對其進行優化,重新使用C++物件,減少垃圾回收開銷,非同步處理mimi-batch資料、本地執行緒共享權重,以減少記憶體溢位的問題。同時藉助微軟內部的預訓練模型、工具,可以做很多影象方面的工作,包括野生動物識別、生物醫療實體抽取、加油站的火災探測。

2、機器學習Gradient Boosting 、決策樹方面

我們將微軟開源的梯度提升演算法庫LightGBM整合到Spark裡。LightGBM是一種現在非常流行且優秀的決策樹演算法框架。LightGBM on Spark 基於Message Passing Interface(MPI)進行通訊,其通訊次數要比Spark ML自帶的梯度提升演算法庫少很多,因此LightGBM on Spark 比Spark ML的GradientBoosted Tree 訓練速度快將近30% 。LightGBM 在訓練過程中,worker之間需要通訊,為了統一Spark的API,我們將控制轉移到Spark的“MapPartitions”,更具體的說,是通過driver節點傳送MPI 指令,worker節點之間進行通訊來實現的。Spark和LightGBM的整合可以讓使用者很方便地建立各種分類、迴歸任務。

3、模型可解釋方面

除了通過轉換控制將框架整合到Spark中,我們還擴充套件了SparkML的本地演算法庫,其中一個例子就是 Local Interpretable Model Agnostic Explanations (LIME)的分散式實現。同時LIME提供了一種”解釋“方式,這種方式可以在不參考任何模型函式的情況下來解釋任何模型的預測結果。更具體的說,LIME通過一個抽樣過程構造了一個區域性線性近似的演算法,從而解釋了黑盒子函式。

以影象分類為例,區域性遮擋會影響模型的最終輸出,那麼則說明遮擋的這一部分對分類結果非常關鍵。更正式地說,通過將影象隨機塊或將”超級畫素“設定為中性顏色來創造大量擾動的影象,然後,將這些擾動的影象灌注給模型,從而觀察其如何影響模型的輸出。 最後,使用區域性加權Lasso模型來學習超畫素“狀態”的布林向量與模型輸出結果之間的對映關係。

為了解釋影象分類器進行影象分類的過程,我們需要對成千上萬的擾動影象進行抽樣分析。更實際的說,如果你的建模需要花費一個小時,那麼使用LIME計算來解釋你的模型則需要大約50天。現在我們已經在Spark 上實現了LIME的分散式計算,另外我們還選擇了一種並行化的方案來加速每個單獨的解釋,這可以說大大減少了計算時間。之後,我們對輸入影象進行超畫素分解並將其並行化,然後,迭代這一過程從而為每一個輸入影象創造一個新的並行化的“狀態樣本”集合。最後,我們將一個分散式線性模型擬合到一個內部集合,並將其權重新增到與原始並行的集合中。由於這種與以往不同的並行化方案,使這一整合過程可以完全受益於快速編譯的Scala和Spark SQL,而不是像工具Py4J那樣把現有的LIME程式碼整合到Spark中。

4、網路和雲服務方面:HTTP和Cognitive 服務在 Spark上

通過Java Native Interface (JNI)和函式的dispatch,將CNTK、LightGBM等機器學習元件和Spark 統一起來。考慮到涉及不同的系統,編寫這樣的程式碼非常繁瑣、複雜。現在,我們藉助微軟內部開發的類似HTTP一樣的協議來解決這個問題,可以將HTTP的Request和Response轉換為Spark SQL型別,這樣使用者可以使用Spark SQL的map、reduce等運算元來處理HTTP的請求和迴應。微軟的Cognitive Services、Kubernete都可以用這種方式來與Spark進行整合,這樣可以藉助外部的智慧服務,讓Spark的計算更智慧。 每一個Congnitive Service就是一個SparkML的轉換,使用者可以新增智慧計算服務到自己的SparkML 工作流中。另外,將每個請求的引數作為 dataframe中的一列做分散式處理,對於處理大量的請求非常有幫助。

5、提供大規模實時的Web服務

MMLSpark整合了Spark Serving,Spark Serving可以像呼叫Web服務那樣使用Spark的計算資源。Spark Serving 建立在Spark Structured Streaming 之上,可以通過Spark SQL編寫相關任務的計算邏輯,然後執行Streaming的查詢。Spark Serving作為Structured Streaming的一種擴充套件,是一項特殊的Streaming任務。這種Web服務更像是一種Streaming的pipeline:首先通過HTTP請求原資料,然後處理資料結果從而對外提供HTTP服務。 Spark Serving 可以部署Spark上的任何資源,包括如:CNTK、LightGBM、SparkML、Cognitive Services、HTTP Services等。這樣可以讓開發者不需要匯出訓練模型,再花費時間使用其他語言編寫對外提供的模型服務介面,對開發者而言十分有效。

MMLSpark應用

目前,MMLSpark支援大部分機器學習領域的常見問題,包括:文字、影象、語音。最近,我們的研究者在無標註的情況下,利用微軟Bing的影象搜尋功能和MMLSpark的影象識別功能,完成了拍攝照片中雪豹的物體識別工作,從而為保護野生動物(雪豹)提供了一個方案。

下面以雪豹物體識別的例子,來解釋具體如何使用MMLSpark:

\"image\"

整體架構圖

第一步 收集資料

機器學習中最困難的部分是收集資料。傳統的辦法是人工標記,人工標記資料耗費大量的時間和精力。沒有高質量的標記資料集,演算法模型在實際應用專案中很難落地。現在,通過微軟的Bing圖片搜尋結果可以輔助我們標記大量的資料集,這樣就解決了人工標記耗時耗力的問題。Bing 圖片搜尋已經和Spark整合到一起了。

\"image\"

雪豹在微軟Bing圖片搜尋的結果

基於Bing 圖片搜尋結果的資料集,可以在Spark上建立各種應用。以收集雪豹資料集為例,只需要兩個Spark查詢就可以完成資料集收集,其中一個查詢收集正樣本(雪豹相關的圖片),另外一個查詢收集負樣本(隨機圖片)。然後,將結果資料集拉取到Spark叢集,通過Spark SQL做預處理,比如:新增標籤、刪除重複資料等。Spark在Azure叢集上並行處理,只需要花費幾秒鐘的時間就可以通過Bing搜尋獲取到世界各地的上千張圖片。然後,通過MMLSpark的OpenCV on Spark對圖片進行快速處理。

\"image\"

第二步 建立深度學習分類器

上一步,資料集已經建立完成。下面開始構建模型,卷積神經網路(CNN)是影象處理中比較流行的深度學習網路模型。為了構建深度神經網路,可以藉助MMLSpark上的Cognitive Service on Spak(CNTK深度學習工具)。遷移學習是目前比較流行的解決新任務的技術,MMLSpark上做遷移學習任務非常容易。現在,對於雪豹物體識別的新任務,你不需要從零開始構建一個全新的網路結構,只需要藉助微軟預先訓練好的模型和藉助遷移學習技術就可以解決這一問題。這個物體識別過程非常像人的思考過程是基於歷史的記憶,來學習、判斷、和識別新事物。通過殘差網路在數百萬圖片上訓練的通用深度網路模型,我們現在可以拿來使用,只需要剪下最後幾層網路結構並且使用Spark ML中的LR(邏輯迴歸)做替換,構成新的網路結構。也就是說,將前面幾層網路輸出的雪豹圖片特徵,輸入到邏輯迴歸,最後輸出的結果是雪豹的概率值。

\"image\"

此外,我們還可以藉助LightGBM on Spark ,在圖片預處理方面做一些改進,比如:影象增強、資料不平衡處理等操作,以提高最後識別的精確度。

第三步 利用LIME建立一個物體檢測的資料集

上一步,我們做了圖片分類,得到這個圖片是雪豹的概率多大。但是,在實際應用中,我們更期望能得到雪豹在圖片中的具體位置,以便了解野外還有多少隻雪豹。雪豹的數量,對於保護雪豹至關重要。在Bing圖片搜尋中,並沒有給出雪豹的位置邊框。在物體識別中,識別的物體需要用邊框框起來。傳統的辦法是人工來標註,非常費力。根據上面介紹的LIME原理,現在,我們可以通過LIME的方法,給要識別的物體標記上邊框。

\"image\"

如上圖,我們可以通過LIME的方法,解釋雪豹在圖片中位置的特徵對雪豹分類器非常重要,那麼我們就認為這個圖片的這部分就是雪豹所在的圖片位置,然後,我們用矩形邊框將其框住。這樣辦法,可以幫助我們快速建立非常豐富的帶邊框的物體識別資料集。

LIME計算會耗費大量的計算資源,現在MMLSpark已經將LIME整合到Spark中,這樣可以藉助Spark強大的分散式計算資源,解決單機版本的計算瓶頸。

第四步 將LIME的知識應用於物體檢測中

我們利用 Bing 圖片搜尋結果,遷移學習技術和LIME方法,快速完成了非常複雜,非常耗時、耗精力的工作。下面我們開始使用COCO(微軟開源的物體識別資料集)資料集預訓練的模型,結合遷移學習技術,構建新的網路結構,並進行模型訓練。

\"image\"

經過對比,我們最後選用了Faster R-CNN網路和Inception Resnet v2網路,它們結合起來,在準確率、效能、速度方面目前是最優的。從最後識別結果來看,跟人類標記非常接近。如下圖所示:

\"image\"

在檢測過程中,我們也發現了一些問題,比如下圖中:1、圖片中真實的雪豹是兩隻,我們的演算法僅僅識別到一隻;2、有些雪豹隱蔽性很強,我們的演算法沒有識別出來。

\"image\"

造成上面結果的主要原因是:1、在使用LIME進行邊框標記是,僅僅標記了一個邊框;2、收集資料集的時候,Bing圖片搜尋中存在一些偏見,比如:Bing返回的圖片結果都是高清的。

為了減少這些問題對結果的影響,我們可以通過下面的辦法來克服:1、使用LIME方法,標記物體框的時候,對超高畫素區域進行聚類演算法,以識別幀是否存在多個識別物件,再新增標記邊框;2、在使用Bing搜尋結果,收集資料資料集的時候,儘量通過隨機結果,多輪挖掘更多的正負樣本。

第五步 部署模型,以Web服務對外提供服務

MMLSpark將Web Serving元件整合到Spark中,可以將上面訓練好的模型部署到生產環境上,給使用者提供實時的查詢服務。在MMLSpark v0.14的版本上,延遲減少了近100倍,現在可以在1毫秒內返回查詢的相應結果,可以為世界各地的使用者提供查詢服務。

第六步 最後實驗效果

我們發現大多數的影象我們完全無監督的目標檢測器繪製的邊界框非常接近人類繪製的水平。下圖表1和表2表明,我們的方法可以逼近人類的分類效果和人類的物體識別能力。在物體檢測方面,無監督+預訓練模型的mAP值達到49.8,超過了人類的30.9,小於人類+預訓練模型的mAP值79.3。影象分類方面,無監督的精確率為77.6%,比人類的86.8%低,但是,高於人類+LR(邏輯迴歸)的精確率65.6%。

\"image\"

小結

MMLSpark提供獲取資料來源的途徑(Bing on Spark),整合資料預處理(Spark SQL)、模型訓練(CNTK on Spark),模型輸出對外提供服務(Spark Serving)等過程,僅僅通過很少量的程式碼開發工作就可以完成非常複雜的應用。

我們總結一下常規的搭建一個應用的步驟:

  1. 收集資料,藉助 Bing on Spark;
  2. 訓練深度學習模型,使用CNTK on Spark;
  3. 解釋分類模型,獲取感興趣的區域,標註資料框,藉助 LIME on Spark;
  4. 藉助遷移學習技術,結合LIME的輸出結果,做物體檢測;
  5. 部署模型,對外給使用者提供服務,使用Spark Serving。

論文原文連結:

https://arxiv.org/pdf/1810.08744.pdf

應用案例連結:

https://blogs.technet.microsoft.com/machinelearning/2018/10/03/deep-learning-without-labels/

相關文章