1. 程式人生 > >解析京東大資料下高效影象特徵提取方案

解析京東大資料下高效影象特徵提取方案

本文主要分享英特爾和京東在基於Spark和BigDL的深度學習技術在搭建大規模圖片特徵提取框架上的實戰經驗。

背景

影象特徵提取被廣泛地應用於相似圖片檢索,去重等。在使用BigDL框架(下文即將提到)之前,我們嘗試過在多機多GPU卡、GPU叢集上分別開發並部署特徵抽取應用。但以上框架均存在比較明顯的缺點:

  • 在GPU叢集中,以GPU卡為單位的資源分配策略非常複雜,資源分配容易出問題,如剩餘視訊記憶體不夠而導致OOM和應用崩潰。
  • 在單機情況下,相對叢集方式,需要開發者手動做資料分片、負載和容錯。
  • GPU模式的應用以Caffe為例有很多依賴,包括CUDA等等,增加了部署和維護的難度,如碰到不同作業系統版本和GCC版本有問題時,都需要重新編譯打包。

以上問題使得基於GPU的前向程式從架構上面臨諸多技術應用挑戰。

再來看看場景本身。因為很多圖片的背景複雜,主體物體佔比通常較小,所以為了減少背景對特徵提取準確性的干擾,需要將主體從圖片中分離出來。自然地,圖片特徵提取的框架分為兩步,先用目標檢測演算法檢測出目標,然後用特徵提取演算法提取目標特徵。在這裡,我們採用SSD[1] (Single shot multibox detector) 進行目標檢測,並用DeepBit[2]網路進行特徵提取。

京東內部有海量的(數億張以上)商品圖片存在於主流的分散式的開源資料庫裡。因此如何高效地在大規模分散式環境下進行資料檢索和處理,是圖片特徵提取流水線一個很關鍵的問題。現有的基於GPU的方案在解決上述場景的需求中面臨著另外一些挑戰:

  • 資料下載耗費很長的時間,基於GPU的方案不能很好地對其進行優化。
  • 針對分散式的開源資料庫中的圖片資料,GPU方案的前期資料處理過程很複雜,沒有一個成熟的軟體框架用於資源管理,分散式資料處理和容錯性管理等。
  • 因為GPU軟體和硬體框架的限制,擴充套件GPU方案去處理大規模圖片有很大的挑戰性。

BigDL整合方案

在生產環境中,利用現有的軟體和硬體設施,將大幅提高生產效率(如減少新產品的研發時間),同時降低成本。基於在這個案例中,資料儲存在大資料叢集中主流的分散式開源資料庫上,如果深度學習應用能利用已有的大資料叢集(如Hadoop或Spark叢集)進行計算,便可非常容易地解決上述的挑戰。

Intel開源的BigDL專案[3],是在Spark上的一個分散式深度學習框架,提供了全面的深度學習演算法支援。BigDL藉助Spark平臺的分散式擴充套件性,可以方便地擴充套件到上百或上千個節點。同時BigDL利用了Intel MKL數學計算庫以及平行計算等技術,在Intel Xeon伺服器上可以達到很高的效能(計算能力可取得媲美主流GPU的效能)。

在我們的場景中,BigDL為支援各種模型(檢測,分類)進行定製開發;模型從原來只適用於特定 環境移植到了支援通用模型(Caffe,Torch,Tensorflow)BigDL大資料環境 ;整個pipeline全流程獲得了優化提速。

通過BigDL在spark環境進行特徵提取的流水線如Figure 1所示 :

  • 使用Spark從分散式開源資料庫中讀入上億張原始圖片,構建成RDD
  • 使用Spark預處理圖片,包括調整大小,減去均值,將資料組成Batch
  • 使用BigDL載入SSD模型,通過Spark對圖片進行大規模、分散式的目標檢測,得到一系列的檢測座標和對應的分數
  • 保留分數最高的檢測結果作為主題目標,並根據檢測座標對原始圖片進行裁剪得到目標圖片
  • 對目標圖片RDD進行預處理,包括調整大小,組成Batch
  • 使用BigDL載入DeepBit模型,通過Spark對檢測到的目標圖片進行分散式特徵提取,得到對應的特徵
  • 將檢測結果(提取的目標特徵RDD)儲存在HDFS上

這裡寫圖片描述
Figure 1 Image FeatureExtraction Pipeline Based on BigDL

整個資料分析流水線,包括資料讀取,資料分割槽,預處理,預測和結果的儲存,都能很方便地通過BigDL在Spark中實現。在現有的大資料叢集(Hadoop/Spark)上,使用者不需要修改任何叢集配置,即可使用BigDL執行深度學習應用。並且,BigDL利用Spark平臺的高擴充套件性,可以很容易地擴充套件到大量的節點和任務上,因此極大地加快資料分析流程。

除了分散式深度學習的支援,BigDL也提供了很多易用的工具,如圖片預處理庫,模型載入工具(包括載入第三方深度學習框架的模型)等,更方便使用者搭建整個流水線。

圖片預處理

BigDL提供了基於OpenCV[5]的影象預處理庫[4], 支援各種常見的影象轉換和影象增強的功能,使用者可以很容易地使用這些基本功能搭建影象預處理的流水線。此外,使用者也可以呼叫該庫所提供的OpenCV操作自定義影象轉換的功能。

這裡寫圖片描述

這個樣例的預處理流水線將一個原始RDD通過一系列的轉換,轉成一個Batch的RDD。其中,ByteToMat把Byte圖片轉換成OpenCV的Mat儲存格式,Resize將圖片的調整為300x300的大小,MatToFloats將Mat裡的畫素存成Float陣列的格式,並減去對應通道的均值。最後,RoiImageToBatch把資料組成Batch,作為模型的輸入,用於預測或訓練。

載入模型

使用者可以方便地使用BigDL載入預訓練好的模型,在Spark程式中直接使用。給定BigDL模型檔案,即可呼叫Module.load得到模型。

這裡寫圖片描述

另外,BigDL也支援第三方深度學習框架模型的匯入,如Caffe,Torch,TensorFlow。

這裡寫圖片描述

使用者可以很方便地載入已經訓練好的模型,用於資料預測,特徵提取,模型微調等。以Caffe為例,Caffe的模型由兩個檔案組成,模型prototxt定義檔案和模型引數檔案。如下所示,使用者可以很容易地將預訓練好的Caffe模型載入到Spark和BigDL程式中。

這裡寫圖片描述

效能

我們對基於Caffe的GPU叢集解決方案和基於BigDL的Xeon叢集解決方案進行了效能基準測試,測試均執行在京東的內部叢集環境裡。

測試標準

端到端的圖片處理和分析流水線,包括:

  • 從分散式的開源資料庫中讀取圖片(從圖片源下載圖片到記憶體)
  • 輸入到目標檢測模型和特徵提取模型進行特徵抽取
  • 將結果(圖片路徑和特徵)儲存到檔案系統

注:下載因素成為端到端總體吞吐率的重要影響因素,在這個案例裡面,這部分耗時佔處理總耗時(下載+檢測+特徵)約一半。GPU伺服器對下載這部分的處理是無法利用GPU加速的。

測試環境

GPU: NVIDIA Tesla K40,20張卡併發執行
CPU: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz,共1200個邏輯核 (每臺伺服器有24個物理核,啟用超執行緒,配置成YARN的50個邏輯核)

測試結果

Figure 2顯示了Caffe在20個K40併發處理圖片的吞吐量約為540圖片/秒,而BigDL在1200個邏輯核的YARN(Xeon)叢集上對應的吞吐量約為2070圖片/秒。BigDL在Xeon叢集上吞吐量上約是GPU叢集的3.83倍,極大地縮短了大規模圖片的處理時間。

測試結果表明,BigDL在大規模圖片特徵提取應用中提供了更好的支援。BigDL的高擴充套件性,高效能和易用性,幫助京東更輕鬆地應對海量,爆炸式增長的圖片規模。基於這樣的測試結果,京東正在將基於GPU叢集的Caffe圖片特徵提取實現,升級為基於Xeon叢集的BigDL方案部署到Spark叢集生產環境中。

這裡寫圖片描述
Figure 2比較 K40和Xeon在圖片特徵提取流水線的吞吐量

結論

BigDL的高擴充套件性,高效能和易用性,幫助京東更容易地使用深度學習技術處理海量圖片。京東會繼續將BigDL應用到更廣泛的深度學習應用中,如分散式模型訓練等。

引用

[1]. Liu, Wei, et al. “SSD: Single Shot Multibox Detector.” European conference on computer vision. Springer, Cham, 2016.
[2]. Lin, Kevin, et al. “Learning compact binary descriptors with unsupervised deep neural networks.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2016.
[3]. https://github.com/intel-analytics/BigDL
[4]. https://github.com/intel-analytics/analytics-zoo/tree/master/transform/vision
[5]. http://opencv.org/