閱讀540 返回首頁    go 阿裏雲 go 技術社區[雲棲]


揭秘支付寶中的深度學習引擎:xNN

本文介紹支付寶App中的深度學習引擎——xNN。xNN通過模型和計算框架兩個方麵的優化,解決了深度學習在移動端落地的一係列問題。xNN的模型壓縮工具 (xqueeze) 在業務模型上實現了近50倍的壓縮比, 使得在包預算極為有限的移動App中大規模部署深度學習算法成為可能。xNN的計算性能經過算法和指令兩個層麵的深度優化,極大地降低了移動端DL的機型門檻。

image

近來,深度學習(DL)在圖像識別、語音識別、自然語言處理等諸多領域都取得了突破性進展。DL通常給人以計算複雜、模型龐大的印象——從Siri語音助手到各種聊天機器人、再到支付寶“掃五福”,移動端收集數據+雲端加工處理似乎成為一種常識。然而對很多應用來說,這種模式其實隻是無奈之選。


image


去年春節的“掃五福”活動中,為了識別手寫“福”字,支付寶多媒體團隊調動了近千台服務器用於部署圖像識別模型。可是如此規模的集群也沒能抵擋住全國人民集五福的萬丈熱情。為了防止雲端計算能力超載,活動中後期不得不啟動了降級預案——用計算量小但精度也較低的傳統視覺算法替代了DL模型。降級雖然不妨礙大夥繼續熱火朝天地收集福卡,但對用戶體驗無疑是有一定影響的,比如一些不可言說的漢字也被誤判成了“福”字。


image


另一方麵,DL在雲端則意味著數據必須上傳。即使不考慮計算壓力,從網絡延時、流量、隱私保護等角度也給用戶體驗帶來種種限製。因此,對相當多的應用來說,DL模型前移到移動端部署可以看作是一種剛需。

最近,隨著手機處理器性能的提升和模型輕量化技術的發展,移動端DL正在變得越來越可行,並得到了廣泛的關注。蘋果和穀歌已經分別宣布了各自操作係統上的DL框架Core ML和Tensorflow Lite,這無疑將極大地促進移動端DL的發展。但是,尤其對於支付寶這樣的國民App來說,仍然存在一些嚴峻的挑戰是無法通過直接套用廠商方案來解決的。

1.機型跨度大:支付寶App擁有數億受眾群體,在其中落地的業務必須對盡可能多的用戶、盡可能多的機型提供優質的體驗。對支付寶來說,參考Core ML隻將功能開放給少數高端機型的做法是不合適的。因而無論在運行速度和內存占用等性能指標、還是在兼容性上,支付寶的移動端DL都必須做到極致,才能最大幅度地降低使用門檻。

2.包尺寸要求嚴:支付寶App集成了眾多的業務功能,安裝包資源非常緊張,一個新模型要集成進安裝包往往意味著需要下線其他的功能。而即便通過動態下發的形式進行部署,DL模型的大小也會強烈影響用戶的體驗。隨著移動端智能化程度的不斷提升,直接在端上運行的DL應用必然會越來越多,這以當前單個模型大小就動輒數十、數百M的尺寸來看幾乎是不可想象的。同時,移動端DL引擎本身的SDK也需要盡可能地瘦身。

支付寶xNN是針對國民App環境定製開發的移動端DL解決方案,項目製定了如下技術目標。
1. 輕模型:通過高效的模型壓縮算法,在保證算法精度的前提下大幅減小模型尺寸。
2. 小引擎:移動端SDK的深度裁減。
3. 快速:結合指令層和算法層的優化,綜合提升DL計算的效率。
4. 通用:為保證最大的機型覆蓋率,以最為通用的CPU而非性能更強勁的GPU作為重點優化平台。不僅支持經典的CNN、DNN網絡,也支持RNN、LSTM等網絡形態。
5. 易用:工具鏈對業務保持高度友好——使得算法工程師們能更好地專注於算法本身,在不需要成為模型壓縮專家和移動端開發專家的情況下都能快速完成雲端模型到移動端模型的轉換和部署。

xNN為DL模型提供了從壓縮到部署、再到運行時的統計監控這一全生命周期的解決方案。xNN環境由開發後台和部署前台兩部分組成。


image

開發後台以xqueeze工具鏈為核心,支持多種訓練框架。業務可以使用xqueeze壓縮、優化自己的DL模型,得到尺寸大幅減小、運行速度顯著加快的模型版本。壓縮後的模型根據使用場景,可以通過App安裝包內置或按需下發的形式部署到移動端。

在部署前台,xNN的計算框架提供高效的前向預測能力。xNN的應用層在計算的基礎上還提供了模型下發、數據統計、錯誤上報等一站式能力。xNN還通過一個jsapi提供了直接對接H5應用的能力——通過DL模型的動態下發和H5,能夠實現完全的動態化,從而在客戶端不發版的情況下完成算法+邏輯的同時更新。

image

上圖給出了xNN的主要特性。在xqueeze模型壓縮的基礎上,xNN還支持通過快速處理稀疏網絡來提高性能。xNN支持了豐富的網絡結構類型,包括經典CNN/DNN、SSD目標檢測和LSTM。xNN的部署框架原生兼容Caffe,業務可以在不做轉換的情況下直接在移動端運行已有的Caffe模型,以快速評估效果。而經過壓縮的私有格式模型更小、更快。在Tensorflow和Keras平台上訓練的模型也能夠在原有的環境上進行壓縮,然後轉換為xNN支持的格式部署到移動端。不同於core ML,xNN理論上支持安卓和iOS上的所有機型。

xNN-xqueeze的模型壓縮流程如下圖之(a)所示,包括神經元剪枝 (neuron pruning)、突觸剪枝 (synapse pruning)、量化 (quantization)、網絡結構變換 (network transform)、自適應Huffman編碼 (adaptive Huffman)、共5個步驟。其中前三步理論上是有損的,而使用xqueeze對網絡權重和壓縮超參進行finetune,能夠將精度的下降保持在可控甚至可忽略的程度。後兩步則完全不影響網絡的輸出精度。整個流程不僅會減小模型的尺寸,還通過網絡的稀疏化和結構優化,顯著提高前向預測的速度。

image


在領域的經典方案DeepCompression的基礎上,xqueeze 進一步擴充了neuronpruning和network transform的能力。其中,neuron pruning能夠逐次裁剪掉“不重要”的神經元和與之對應的權重參數。通過neuron pruning和synapse pruning的結合,在模型精度和壓縮比之間達成更好的平衡。xqueeze還具有network transform——在網絡的宏觀層麵進行優化的能力,networktransform腳本掃描整個網絡,診斷出可優化的點,包括在有條件的情況下自動地進行層 (layer) 的組合與等效替換。此外,xqueeze通過自適應地使用Huffman編碼,有效提升不同稀疏程度的模型之壓縮比。

如下圖所示,對於業務分類模型,使用xqueeze工具鏈能夠實現45.5倍的壓縮,在同等程度的精度損失下,壓縮率超越經典方案達60%。


image

xNN的性能優化不局限於底層,而是通過與xqueeze工具鏈的配合,在算法和指令兩個層麵同步發力,為更為深入的優化創造空間。

如下圖所示,在算法層,xqueeze的剪枝在壓縮模型尺寸的同時,也促進了網絡的稀疏化——即催生出大量的零值權重。相應地,xNN在指令層實現了稀疏運算模塊,在卷積和全連接計算中,自動忽略這些零值權重,減小計算開銷,提升速度。又如之前已經提到的,在xqueeze的network transform階段,會對網絡進行宏觀層麵的優化,包括將相鄰的層進行結果上等效的組合與替換,來減少計算的冗餘度和提高訪問存儲器的效率。要充分發揮network transform的效能,也離不開指令層實現的支持。


image


在指令層,xNN通過智能調配各個內核的負載,提升多線程環境下的性能。xNN在設計中不僅關注計算資源,還充分考慮了訪問存儲器的開銷,通過精細化地調度數據的讀寫來提升cache的命中率。最為重要的是,所有核心計算模塊均由某位芯片行業出身的指令集架構專家一條一條匯編代碼手寫而成。

在以SqueezeNet為基礎的業務分類模型上,xNN在Qualcomm 820 CPU上能夠輸出29.4 FPS的前向預測幀率,在蘋果A10 CPU (iPhone 7)上的幀率則達到52.6 FPS,比CPU與GPU並用的Core ML還要更快。

支付寶App已經集成了xNN。在支付寶的“AR掃一掃”入口,90%以上的Android和iOS機型都在使用xNN來完成前置物品分類,向用戶推薦“AR掃花識花”等便利功能。xNN本身的健壯性也經受住了“七夕送你一朵花”這樣高強度、廣機型覆蓋的大型運營活動的考驗。該模型的最新版本在確保精度的前提下,尺寸已壓縮到100KB以下。Android平台上,全功能xNN的SDK包增量僅200KB出頭,若根據特定應用做裁剪,將能夠輕鬆減小到100多KB。


image

xNN上線後,已在螞蟻和阿裏內部引起了強烈反響,一大波移動端DL應用正在基於xNN緊張開發中,並在未來的幾個月中逐步提供給用戶使用。

來源:阿裏技術
原文鏈接

最後更新:2017-09-28 16:03:23

  上一篇:go  企業是如何選擇軟件外包平台?
  下一篇:go  【轉載】Docker 企業版新增功能簡介