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

2021-08-08 21:48:21 字數 2736 閱讀 3413

深度學習——雲端還是移動端?

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

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

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

兩大挑戰

五大目標

1. 輕模型:通過高效的模型壓縮演算法,在保證演算法精度的前提下大幅減小模型尺寸。

2. 小引擎:移動端sdk的深度裁減。

3. 快速:結合指令層和演算法層的優化,綜合提公升dl計算的效率。

4. 通用:為保證最大的機型覆蓋率,以最為通用的cpu而非效能更強勁的gpu作為重點優化平台。不僅支援經典的cnn、dnn網路,也支援rnn、lstm等網路形態。

5. 易用:工具鏈對業務保持高度友好——使得演算法工程師們能更好地專注於演算法本身,在不需要成為模型壓縮專家和移動端開發專家的情況下都能快速完成雲端模型到移動端模型的轉換和部署。

主要特性一覽

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

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

上圖給出了xnn的主要特性。在xqueeze模型壓縮的基礎上,xnn還支援通過快速處理稀疏網路來提高效能。xnn支援了豐富的網路結構型別,包括經典cnn/dnn、ssd目標檢測和lstm。xnn的部署框架原生相容caffe,業務可以在不做轉換的情況下直接在移動端執行已有的caffe模型,以快速評估效果。而經過壓縮的私有格式模型更小、更快。在tensorflow和keras平台上訓練的模型也能夠在原有的環境上進行壓縮,然後轉換為xnn支援的格式部署到移動端。不同於core ml,xnn理論上支援安卓和ios上的所有機型。

xqueeze模型壓縮

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

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

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

xnn計算效能優化

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

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

在指令層,xnn通過智慧型調配各個核心的負載,提公升多執行緒環境下的效能。xnn在設計中不僅關注計算資源,還充分考慮了訪問儲存器的開銷,通過精細化地排程資料的讀寫來提公升cache的命中率。最為重要的是,所有核心計算模組均由某位晶元行業出身的指令集架構專家一條一條彙編**手寫而成。

在以squeezenet為基礎的業務分類模型上,xnn在qualcomm 820 cpu上能夠輸出29.4 fps的前向**幀率,在蘋果a10 cpu (iphone 7)上的幀率則達到52.6 fps,比cpu與gpu並用的core ml還要更快。

業務落地

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

App 中的 微信支付 支付寶支付

返回的事件 function weixinpay data else if document.attachevent else onbridgeready function res vm.number null vm.router.go 1 vm.base url index.html deposi...

App 中的 微信支付 支付寶支付

返回的事件 function weixinpay data else if document.attachevent else onbridgeready function res vm.number null vm.router.go 1 vm.base url index.html deposi...

從前端走向幕後 專家揭秘支付寶的技術內幕

從前端走向幕後 專家揭秘支付寶的技術內幕 今年的火車票春運即將吹響集結號,支付寶快速搭上了順風車。近日支付寶錢包開通了 支付寶12306公眾服務號 方便乘客一目了然地檢視火車票的服務資訊。第三季度支付寶移動支付交易金額達到2千億元,再加上雙十一與雙十二接二連三,摧枯拉朽式的炮轟支付,一時間支付寶成為...