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