本文主要分享英特爾和京東在基于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上
?
整個數據分析流水線,包括數據讀取,數據分區,預處理,預測和結果的存儲,都能很方便地通過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].
評論