本文主要分享英特爾和京東在基于Spark和BigDL的深度學(xué)習(xí)技術(shù)在搭建大規(guī)模圖片特征提取框架上的實(shí)戰(zhàn)經(jīng)驗(yàn)。
背景
圖像特征提取被廣泛地應(yīng)用于相似圖片檢索,去重等。在使用BigDL框架(下文即將提到)之前,我們嘗試過(guò)在多機(jī)多GPU卡、GPU集群上分別開發(fā)并部署特征抽取應(yīng)用。但以上框架均存在比較明顯的缺點(diǎn):
在GPU集群中,以GPU卡為單位的資源分配策略非常復(fù)雜,資源分配容易出問(wèn)題,如剩余顯存不夠而導(dǎo)致OOM和應(yīng)用崩潰。
在單機(jī)情況下,相對(duì)集群方式,需要開發(fā)者手動(dòng)做數(shù)據(jù)分片、負(fù)載和容錯(cuò)。
GPU模式的應(yīng)用以Caffe為例有很多依賴,包括CUDA等等,增加了部署和維護(hù)的難度,如碰到不同操作系統(tǒng)版本和GCC版本有問(wèn)題時(shí),都需要重新編譯打包。
以上問(wèn)題使得基于GPU的前向程序從架構(gòu)上面臨諸多技術(shù)應(yīng)用挑戰(zhàn)。
再來(lái)看看場(chǎng)景本身。因?yàn)楹芏鄨D片的背景復(fù)雜,主體物體占比通常較小,所以為了減少背景對(duì)特征提取準(zhǔn)確性的干擾,需要將主體從圖片中分離出來(lái)。自然地,圖片特征提取的框架分為兩步,先用目標(biāo)檢測(cè)算法檢測(cè)出目標(biāo),然后用特征提取算法提取目標(biāo)特征。在這里,我們采用SSD[1] (Single shot multibox detector) 進(jìn)行目標(biāo)檢測(cè),并用DeepBit[2]網(wǎng)絡(luò)進(jìn)行特征提取。
京東內(nèi)部有海量的(數(shù)億張以上)商品圖片存在于主流的分布式的開源數(shù)據(jù)庫(kù)里。因此如何高效地在大規(guī)模分布式環(huán)境下進(jìn)行數(shù)據(jù)檢索和處理,是圖片特征提取流水線一個(gè)很關(guān)鍵的問(wèn)題?,F(xiàn)有的基于GPU的方案在解決上述場(chǎng)景的需求中面臨著另外一些挑戰(zhàn):
數(shù)據(jù)下載耗費(fèi)很長(zhǎng)的時(shí)間,基于GPU的方案不能很好地對(duì)其進(jìn)行優(yōu)化。
針對(duì)分布式的開源數(shù)據(jù)庫(kù)中的圖片數(shù)據(jù),GPU方案的前期數(shù)據(jù)處理過(guò)程很復(fù)雜,沒(méi)有一個(gè)成熟的軟件框架用于資源管理,分布式數(shù)據(jù)處理和容錯(cuò)性管理等。
因?yàn)镚PU軟件和硬件框架的限制,擴(kuò)展GPU方案去處理大規(guī)模圖片有很大的挑戰(zhàn)性。
BigDL集成方案
在生產(chǎn)環(huán)境中,利用現(xiàn)有的軟件和硬件設(shè)施,將大幅提高生產(chǎn)效率(如減少新產(chǎn)品的研發(fā)時(shí)間),同時(shí)降低成本?;谠谶@個(gè)案例中,數(shù)據(jù)存儲(chǔ)在大數(shù)據(jù)集群中主流的分布式開源數(shù)據(jù)庫(kù)上,如果深度學(xué)習(xí)應(yīng)用能利用已有的大數(shù)據(jù)集群(如Hadoop或Spark集群)進(jìn)行計(jì)算,便可非常容易地解決上述的挑戰(zhàn)。
Intel開源的BigDL項(xiàng)目[3],是在Spark上的一個(gè)分布式深度學(xué)習(xí)框架,提供了全面的深度學(xué)習(xí)算法支持。BigDL借助Spark平臺(tái)的分布式擴(kuò)展性,可以方便地?cái)U(kuò)展到上百或上千個(gè)節(jié)點(diǎn)。同時(shí)BigDL利用了Intel MKL數(shù)學(xué)計(jì)算庫(kù)以及并行計(jì)算等技術(shù),在Intel Xeon服務(wù)器上可以達(dá)到很高的性能(計(jì)算能力可取得媲美主流GPU的性能)。
在我們的場(chǎng)景中,BigDL為支持各種模型(檢測(cè),分類)進(jìn)行定制開發(fā);模型從原來(lái)只適用于特定 環(huán)境移植到了支持通用模型(Caffe,Torch,Tensorflow)BigDL大數(shù)據(jù)環(huán)境 ;整個(gè)pipeline全流程獲得了優(yōu)化提速。
通過(guò)BigDL在spark環(huán)境進(jìn)行特征提取的流水線如Figure 1所示 :
使用Spark從分布式開源數(shù)據(jù)庫(kù)中讀入上億張?jiān)紙D片,構(gòu)建成RDD
使用Spark預(yù)處理圖片,包括調(diào)整大小,減去均值,將數(shù)據(jù)組成Batch
使用BigDL加載SSD模型,通過(guò)Spark對(duì)圖片進(jìn)行大規(guī)模、分布式的目標(biāo)檢測(cè),得到一系列的檢測(cè)坐標(biāo)和對(duì)應(yīng)的分?jǐn)?shù)
保留分?jǐn)?shù)最高的檢測(cè)結(jié)果作為主題目標(biāo),并根據(jù)檢測(cè)坐標(biāo)對(duì)原始圖片進(jìn)行裁剪得到目標(biāo)圖片
對(duì)目標(biāo)圖片RDD進(jìn)行預(yù)處理,包括調(diào)整大小,組成Batch
使用BigDL加載DeepBit模型,通過(guò)Spark對(duì)檢測(cè)到的目標(biāo)圖片進(jìn)行分布式特征提取,得到對(duì)應(yīng)的特征
將檢測(cè)結(jié)果(提取的目標(biāo)特征RDD)存儲(chǔ)在HDFS上
?
整個(gè)數(shù)據(jù)分析流水線,包括數(shù)據(jù)讀取,數(shù)據(jù)分區(qū),預(yù)處理,預(yù)測(cè)和結(jié)果的存儲(chǔ),都能很方便地通過(guò)BigDL在Spark中實(shí)現(xiàn)。在現(xiàn)有的大數(shù)據(jù)集群(Hadoop/Spark)上,用戶不需要修改任何集群配置,即可使用BigDL運(yùn)行深度學(xué)習(xí)應(yīng)用。并且,BigDL利用Spark平臺(tái)的高擴(kuò)展性,可以很容易地?cái)U(kuò)展到大量的節(jié)點(diǎn)和任務(wù)上,因此極大地加快數(shù)據(jù)分析流程。
除了分布式深度學(xué)習(xí)的支持,BigDL也提供了很多易用的工具,如圖片預(yù)處理庫(kù),模型加載工具(包括加載第三方深度學(xué)習(xí)框架的模型)等,更方便用戶搭建整個(gè)流水線。
圖片預(yù)處理
BigDL提供了基于OpenCV[5]的圖像預(yù)處理庫(kù)[4], 支持各種常見的圖像轉(zhuǎn)換和圖像增強(qiáng)的功能,用戶可以很容易地使用這些基本功能搭建圖像預(yù)處理的流水線。此外,用戶也可以調(diào)用該庫(kù)所提供的OpenCV操作自定義圖像轉(zhuǎn)換的功能。
這個(gè)樣例的預(yù)處理流水線將一個(gè)原始RDD通過(guò)一系列的轉(zhuǎn)換,轉(zhuǎn)成一個(gè)Batch的RDD。其中,ByteToMat把Byte圖片轉(zhuǎn)換成OpenCV的Mat存儲(chǔ)格式,Resize將圖片的調(diào)整為300x300的大小,MatToFloats將Mat里的像素存成Float數(shù)組的格式,并減去對(duì)應(yīng)通道的均值。最后,RoiImageToBatch把數(shù)據(jù)組成Batch,作為模型的輸入,用于預(yù)測(cè)或訓(xùn)練。
加載模型
用戶可以方便地使用BigDL加載預(yù)訓(xùn)練好的模型,在Spark程序中直接使用。給定BigDL模型文件,即可調(diào)用Module.load得到模型。
另外,BigDL也支持第三方深度學(xué)習(xí)框架模型的導(dǎo)入,如Caffe,Torch,TensorFlow。
用戶可以很方便地加載已經(jīng)訓(xùn)練好的模型,用于數(shù)據(jù)預(yù)測(cè),特征提取,模型微調(diào)等。以Caffe為例,Caffe的模型由兩個(gè)文件組成,模型prototxt定義文件和模型參數(shù)文件。如下所示,用戶可以很容易地將預(yù)訓(xùn)練好的Caffe模型加載到Spark和BigDL程序中。
性能
我們對(duì)基于Caffe的GPU集群解決方案和基于BigDL的Xeon集群解決方案進(jìn)行了性能基準(zhǔn)測(cè)試,測(cè)試均運(yùn)行在京東的內(nèi)部集群環(huán)境里。
測(cè)試標(biāo)準(zhǔn)
端到端的圖片處理和分析流水線,包括:
從分布式的開源數(shù)據(jù)庫(kù)中讀取圖片(從圖片源下載圖片到內(nèi)存)
輸入到目標(biāo)檢測(cè)模型和特征提取模型進(jìn)行特征抽取
將結(jié)果(圖片路徑和特征)保存到文件系統(tǒng)
注:下載因素成為端到端總體吞吐率的重要影響因素,在這個(gè)案例里面,這部分耗時(shí)占處理總耗時(shí)(下載+檢測(cè)+特征)約一半。GPU服務(wù)器對(duì)下載這部分的處理是無(wú)法利用GPU加速的。
測(cè)試環(huán)境
GPU: NVIDIA Tesla K40,20張卡并發(fā)執(zhí)行
CPU: Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz,共1200個(gè)邏輯核 (每臺(tái)服務(wù)器有24個(gè)物理核,啟用超線程,配置成YARN的50個(gè)邏輯核)
測(cè)試結(jié)果
Figure 2顯示了Caffe在20個(gè)K40并發(fā)處理圖片的吞吐量約為540圖片/秒,而BigDL在1200個(gè)邏輯核的YARN(Xeon)集群上對(duì)應(yīng)的吞吐量約為2070圖片/秒。BigDL在Xeon集群上吞吐量上約是GPU集群的3.83倍,極大地縮短了大規(guī)模圖片的處理時(shí)間。
測(cè)試結(jié)果表明,BigDL在大規(guī)模圖片特征提取應(yīng)用中提供了更好的支持。BigDL的高擴(kuò)展性,高性能和易用性,幫助京東更輕松地應(yīng)對(duì)海量,爆炸式增長(zhǎng)的圖片規(guī)模?;谶@樣的測(cè)試結(jié)果,京東正在將基于GPU集群的Caffe圖片特征提取實(shí)現(xiàn),升級(jí)為基于Xeon集群的BigDL方案部署到Spark集群生產(chǎn)環(huán)境中。
Figure 2比較 K40和Xeon在圖片特征提取流水線的吞吐量 結(jié)論
BigDL的高擴(kuò)展性,高性能和易用性,幫助京東更容易地使用深度學(xué)習(xí)技術(shù)處理海量圖片。京東會(huì)繼續(xù)將BigDL應(yīng)用到更廣泛的深度學(xué)習(xí)應(yīng)用中,如分布式模型訓(xùn)練等。
引用
[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].
電子發(fā)燒友App



















評(píng)論