工程之道,深度学习推理性能业界最佳优化实践
MegEngine「訓(xùn)練推理一體化」的獨(dú)特范式,通過靜態(tài)圖優(yōu)化保證模型精度與訓(xùn)練時一致,無縫導(dǎo)入推理側(cè),再借助工業(yè)驗證的高效卷積優(yōu)化技術(shù),打造深度學(xué)習(xí)推理側(cè)極致加速方案,實現(xiàn)當(dāng)前業(yè)界最快運(yùn)行速度。本文從推理側(cè)的數(shù)據(jù)排布(Inference Layout)講起,接著介紹MegEngine的Im2col+MatMul、Winograd、Fast-Run工程優(yōu)化實踐。經(jīng)典的輕量卷積神經(jīng)網(wǎng)絡(luò)實驗表明,經(jīng)過MegEngine加速,ResNet18和ResNet50最高加速比可達(dá)2x以上,ShuffleNet V2和MobileNet V2執(zhí)行效率也得到顯著提升,實現(xiàn)了業(yè)界當(dāng)前最佳推理性能。
深度學(xué)習(xí)是一個端到端的自動化系統(tǒng),在數(shù)據(jù)驅(qū)動之下,算法歷經(jīng)訓(xùn)練測試、工程部署、推理實現(xiàn)三個環(huán)節(jié)。深度學(xué)習(xí)技術(shù)能否最終落地為產(chǎn)品,細(xì)粒度滿足不同場景需求,深度學(xué)習(xí)框架的推理性能優(yōu)化是一個關(guān)鍵變量。
針對不同硬件設(shè)備對性能的苛刻要求,業(yè)界一般做法是開發(fā)一套推理專用框架,不足是造成了訓(xùn)練與推理的分裂。MegEngine(中文名:天元)「訓(xùn)練推理一體化」的獨(dú)特范式,可以實現(xiàn)訓(xùn)練與推理的精確等價性,避免轉(zhuǎn)換可能帶來的精度損失。
?
MegEngine的推理性能優(yōu)化有兩個階段,1)工程部署時的靜態(tài)圖優(yōu)化,保證模型精度和訓(xùn)練時一致,2)推理實現(xiàn)時的卷積優(yōu)化,保證模型運(yùn)算的最快速度。兩者最終的優(yōu)化目標(biāo)是實現(xiàn)模型推理又「好」又「快」。
?
深度學(xué)習(xí)中,卷積種類眾多,計算也最為耗時,成為首要優(yōu)化對象,而推理側(cè)卷積優(yōu)化更是重中之重。如何讓深度學(xué)習(xí)模型魯棒運(yùn)行和推理,即在不同硬件平臺(比如CPU)上,針對目標(biāo)架構(gòu)(比如X86/ARM)做計算優(yōu)化,實現(xiàn)最快運(yùn)行速度,是一個長久存在的挑戰(zhàn)。
?
MegEngine秉持極致的「工程之道」,針對CPU推理的卷積優(yōu)化,做了細(xì)致而系統(tǒng)的工程創(chuàng)新,不斷逼近加速極限。本文是MegEngine卷積優(yōu)化技術(shù)的「綜述篇」,基于已有工作,做了多項技術(shù)的工程優(yōu)化,包括Inference Layout、Im2col+MatMul、Winograd、Fast-Run。后續(xù)會有相關(guān)技術(shù)的詳解篇。
?
Inference Layout
?
推理側(cè)卷積計算優(yōu)化方面,首先面臨的問題是feature map的數(shù)據(jù)排布(Tensor Layout),選擇合適的數(shù)據(jù)排布不僅會使卷積優(yōu)化事半功倍,還可作為其他優(yōu)化方法的基礎(chǔ),比如Im2col、Winograd、Fast-Run。
?
目前,深度學(xué)習(xí)框架中常見的數(shù)據(jù)排布格式有3種:
?
NHWC:[Batch, Height, Width, Channels]
NCHW:[Batch, Channels, Height, Width]
NCHWX:[Batch, Channels/X, Height, Width, X=4/8]
?
數(shù)據(jù)的排布對卷積計算有著整體性的直接影響。NHWC和NCHW的空間復(fù)雜度相同,區(qū)別在于訪存行為,NCHWX介于兩者之間,但是有其他優(yōu)點(diǎn)。
?
NCHWX
?
NCHWX在NCHW的基礎(chǔ)上轉(zhuǎn)換而來,其原理可參考下圖。
?
MegEngine選擇NCHWX作為CPU推理實現(xiàn)的數(shù)據(jù)排布(Inference Layout),有如下3個原因:
?
適配SIMD指令,比如Arm Neon上,用4個浮點(diǎn)數(shù)填滿一條SIMD向量,減少邊界判斷的次數(shù);
對Cache更友好,比如計算卷積時讀取feature map,實現(xiàn)多個通道連續(xù)訪問;
易于進(jìn)行padding,減少邊界分支判斷,代碼邏輯簡單。
?
Im2col+MatMul
?
Im2col+MatMul是一種針對深度神經(jīng)網(wǎng)絡(luò)卷積計算的高效實踐方法。Im2col(Image to Column)把輸入feature map按照卷積核的形式一一展開并拼接成列,接著通過高性能MatMul(Matrix Multiplication) Kernel進(jìn)行矩陣乘,得到輸出feature map,具體原理可參考論文[1],它的本質(zhì)是把卷積運(yùn)算轉(zhuǎn)換成矩陣運(yùn)算。
Im2col+MatMul在做算法創(chuàng)新的同時,也產(chǎn)生了一些新問題:
Im2col轉(zhuǎn)換之后,所得數(shù)據(jù)數(shù)倍/數(shù)十倍于輸入feature map;
Im2col轉(zhuǎn)換之后,數(shù)據(jù)內(nèi)存占用超過L2 Cache,對Cache不友好;
Im2col轉(zhuǎn)換之后,MatMul要再操作一次數(shù)據(jù)PACK。
針對這些問題,MegEngine結(jié)合自身工業(yè)實踐,做了兩方面的工程優(yōu)化:1)進(jìn)行Im2col+MatMul分塊操作,減少訪存缺失;2)融合Im2col+MatMul的PACK操作,減少數(shù)據(jù)訪存。
分塊操作
Im2col+MatMul優(yōu)化卷積計算時,比如輸出feature map的數(shù)據(jù)格式為 [n, oc, oh, ow],卷積核的大小為fh*fw,那么Im2col轉(zhuǎn)換之后的數(shù)據(jù)格式為 [n, fh*fw*ic, oh*ow]。MegEngine的分塊操作在oh*ow維度上,分塊大小通過公式計算,確保Im2col之后的數(shù)據(jù)完全保存于L2 Cache。
?
分塊之后,不僅可以減少內(nèi)存占用,還將提升數(shù)據(jù)訪存效率,其原理圖如下所示,把Im2col轉(zhuǎn)換數(shù)據(jù)在其oh*ow維度上切塊,接著,每個分塊和weight進(jìn)行矩陣乘,獲取輸出oh*ow維度上的一個分塊:
?
為驗證分塊操作的有效性,MegEngine開展了相關(guān)對比實驗,在進(jìn)行單層卷積計算時,給出了采用MegEngine Im2col分塊操作前后的內(nèi)存/性能數(shù)據(jù)的對比,其中內(nèi)存占用節(jié)省了數(shù)十倍,計算性能也顯著提升:
?
融合PACK
Im2col+MatMul的PACK融合操作將會減少數(shù)據(jù)訪存。具體而言,Im2col轉(zhuǎn)換之后的數(shù)據(jù),在MatMul計算時需要一次數(shù)據(jù)PACK[3],實際上這對Im2col數(shù)據(jù)做了兩次讀寫,造成了不必要的訪存,因此,MegEngine通過Im2col+MatMul的PACK融合,減少了一次內(nèi)存讀寫。
下面是Im2col+MatMul的PACK融合優(yōu)化前后,卷積計算的性能測試對比,個別Case最大提升可達(dá)18%:
Winograd
?
在深度神經(jīng)網(wǎng)絡(luò)中,卷積計算占據(jù)了絕大部分的時/空復(fù)雜度,Im2col+MatMul可以提高訪存友好性,但無益于時間復(fù)雜度的減少,因此卷積計算優(yōu)化實踐中誕生了Winograd算法,具體數(shù)學(xué)原理可參見論文[2]。
?
Winograd算法主要應(yīng)用于卷積核為3x3,步幅為1的2D卷積神經(jīng)網(wǎng)絡(luò),其參數(shù)表示為F(mxm, rxr),其中mxm是運(yùn)算之后輸出塊的大小,rxr是卷積核的大小,以F(2x2, 3x3)和F(6x6, 3x3)使用最多,前者加速比可達(dá)2.25x,后者加速比則高達(dá)5.06x [2]。
?
Winograd算法的本質(zhì)是以加法換乘法,其計算優(yōu)化的一般流程如上圖所示(注:出自[3]),可分為3步:
?
把輸入的feature map和weight進(jìn)行矩陣轉(zhuǎn)換;
把轉(zhuǎn)換后feature map和weight做批量矩陣乘;
把矩陣乘的結(jié)果進(jìn)行輸出轉(zhuǎn)換,得到最終結(jié)果。
?
同時,其優(yōu)化運(yùn)算過程也存在3點(diǎn)不足:
?
輸入轉(zhuǎn)換要計算整個feature map,數(shù)據(jù)讀寫對Cache不友好;
feature map轉(zhuǎn)換之后,矩陣乘時需要再PACK,數(shù)據(jù)訪存增加;
輸出轉(zhuǎn)換讀取批量矩陣乘之后結(jié)果時,兩次連續(xù)讀寫間隔較大,對Cache不友好。
?
工程
?
針對上述問題,MegEngine結(jié)合自身多年深度學(xué)習(xí)實踐,對Winograd算法的整個計算流程做了工程優(yōu)化,主要有:
?
輸入轉(zhuǎn)換時,分塊feature map的全部tiles,隨后只計算一個分塊的數(shù)據(jù);
調(diào)整分塊大小適配CPU L1 Cache,使得矩陣乘不需要PACK;
結(jié)合NCHWX數(shù)據(jù)排布,通過SIMD指令優(yōu)化輸入/輸出轉(zhuǎn)換。
?
由此,MegEngine對整個輸入feature map進(jìn)行分塊,每次Winograd完整流程只計算一個分塊的nr個tiles,該分塊大小的計算公式為:,即保證每個批量矩陣的輸入數(shù)據(jù)(除了轉(zhuǎn)換之后的weight數(shù)據(jù))保存于L1 Cache,則矩陣乘時不PACK也不會出現(xiàn)訪存缺失。
?
根據(jù)上述公式和L1 Cache大小,可計算出nr_tiles大小;但是,每個卷積的ic不同,最優(yōu)分塊也不同,MegEngine將通過下文介紹的Fast-Run機(jī)制做局部搜索,發(fā)現(xiàn)最優(yōu)的分塊大小。
?
實驗
?
在不同的輸入尺寸和算法參數(shù)F=(6x6,3x3)的情況下,原始Winograd和MegEngine優(yōu)化后的Winograd之間做了加速對比實驗,證明后者性能提升效果顯著,具體結(jié)果如下:
?
Fast-Run
?
卷積計算有多種優(yōu)化實現(xiàn),側(cè)重點(diǎn)也各有不同,比如Im2col可以平衡內(nèi)存占用和運(yùn)行速度,Direct直接進(jìn)行卷積計算優(yōu)化,Winograd則是優(yōu)化計算復(fù)雜度。每種優(yōu)化實現(xiàn)都在特定的輸入?yún)?shù)下有一定的優(yōu)勢,并隨著推理平臺的不同而發(fā)生變化,因此不夠靈活,無法選擇最優(yōu)實現(xiàn)。上述實現(xiàn)的啟發(fā)式偏好如下所示:
?
為使每個部署模型在運(yùn)行推理時,最佳地實現(xiàn)每個卷積,MegEngine從自身工業(yè)實踐獲得啟發(fā),通過Fast-Run機(jī)制進(jìn)行局部搜索,以改進(jìn)傳統(tǒng)的啟發(fā)式方法,不遺余力地完善深度學(xué)習(xí)產(chǎn)品性能。
?
具體而言,首先,在目標(biāo)設(shè)備上使用目標(biāo)模型參數(shù)搜索所有已實現(xiàn)的算子;接著,記錄并保存同時適配目標(biāo)設(shè)備和目標(biāo)模型的最優(yōu)算子;最后,在推理時使用最優(yōu)算子進(jìn)行計算。
?
Fast-Run機(jī)制有著較強(qiáng)的自適應(yīng)性,彌補(bǔ)了啟發(fā)式機(jī)制的一些的缺陷,從根本上確保了目標(biāo)模型的算子最為適配目標(biāo)設(shè)備,從而發(fā)揮出最佳性能。
?
工程
?
Fast-Run機(jī)制的本質(zhì)是尋找最優(yōu)算子,其工程實現(xiàn)分為選擇和執(zhí)行兩個階段:
?
選擇階段,測速模型每個算子,選出最優(yōu)實現(xiàn),保存算子名稱和最優(yōu)實現(xiàn)的映射表;
執(zhí)行階段,根據(jù)映射表直接調(diào)用相應(yīng)實現(xiàn)完成計算。
?
實驗
?
經(jīng)典卷積網(wǎng)絡(luò)上的實驗測試證明了Fast-Run機(jī)制的自適應(yīng)優(yōu)勢,優(yōu)化效果明顯,其模型執(zhí)行效率優(yōu)于先驗選擇下的執(zhí)行效率,具體結(jié)果如下所示:
結(jié)論
?
深度學(xué)習(xí)算法在數(shù)據(jù)的加持之下,迭變權(quán)重,更新參數(shù),積累知識,以深度學(xué)習(xí)產(chǎn)品的方式與這個世界交互。「好而快」是衡量這種交互的不二圭臬。這里,「好」或者精度,對應(yīng)于靜態(tài)圖優(yōu)化,「快」或者速度,對應(yīng)于卷積計算優(yōu)化,「好而快」是精度和速度的權(quán)衡,對應(yīng)于深度學(xué)習(xí)框架。
?
MegEngine「訓(xùn)練推理一體化」有著獨(dú)特優(yōu)勢,相較推理專用框架,更利于在「好」的基礎(chǔ)上做到「快」。通過上文,MegEngine在一系列經(jīng)典的輕量級卷積網(wǎng)絡(luò)上,做了集成式卷積優(yōu)化實驗,ResNet18和ResNet50最高加速比可達(dá)2x以上,ShuffleNet V2和MobileNet V2執(zhí)行效率獲得大幅提升,實現(xiàn)了當(dāng)前業(yè)界最佳的推理性能。
?
這些技術(shù)將在今年6月底發(fā)布的MegEngine Beta版本中有所體現(xiàn),敬請期待。下一步,MegEngine將嘗試全局混合Layout和混合精度優(yōu)化,探索更低精度的量化(4bit/1bit),以及采用多級分塊適配CPU多級Cache大小,最大化訪存友好性,不斷逼近推理側(cè)的加速極限。
?
歡迎訪問
?
MegEngine WebSite:https://megengine.org.cn
MegEngine GitHub:https://github.com/MegEngine
參考文獻(xiàn)
[1] Kumar Chellapilla, Sidd Puri, Patrice Simard. High Performance Convolutional Neural Networks for Document Processing. Tenth International Workshop on Frontiers in Handwriting Recognition, Université de Rennes 1, Oct 2006, La Baule (France).
[2] Ningning Ma, Xiangyu Zhang, Hai-Tao Zheng, Jian Sun. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design. The European Conference on Computer Vision (ECCV), 2018, pp. 116-131.
[3] Lavin, A. and Gray, S.?Fast?algorithms for?convolutional?neural?networks.?In?CVPR, 2016.
[4] Feng Shi,Haochen Li,Yuhe Gao,Benjamin Kuschner,Song-Chun Zhu. Sparse Winograd Convolutional neural networks on small-scale systolic arrays. FPGA, Volume abs/1810.01973, 2019, Pages 118.
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的工程之道,深度学习推理性能业界最佳优化实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在部队当兵期间能考军医吗女生?
- 下一篇: 当深度学习遇上量化交易——公开信息篇