全局圖優(yōu)化:提升 MegEngine 模型推理性能的又一神器

作者:陳思旭 | 曠視 MegEngine 架構(gòu)師
3 分鐘快速上手
效果對比
對深度學(xué)習(xí)框架來講,模型的推理性能是用戶關(guān)注的重要指標。其中一個高度影響性能的因素是 Tensor 的 Layout Format(例如 NCHW、NHWC等等),如何正確選擇 Layout Format 將會高度影響最終的推理性能。
MegEngine 參考了阿里巴巴工程師陳元凱提出的?GPU 推理中的數(shù)據(jù)格式全局優(yōu)化算法,并進一步擴展到 CPU,提供了一種從整體上優(yōu)化 Tensor Format 選擇,提升模型整體推理性能的方案 —— 全局圖優(yōu)化。在 int8 模型上,經(jīng)過全局圖優(yōu)化和 MegEngine 原 Format 優(yōu)化方法(以下稱為傳統(tǒng)圖優(yōu)化)的推理時間表現(xiàn)對比如下圖:

使用方法
源代碼級別使用全局圖優(yōu)化可以參照 MegEngine 自帶的可執(zhí)行程序?load_and_run?中的用法,如果只關(guān)注利用 load_and_run 測試模型性能,需要使用的參數(shù)有:
為計算圖開啟全局圖優(yōu)化,并指定優(yōu)化的目標設(shè)備。
2.
指定全局圖優(yōu)化后的計算圖存儲的文件路徑。
開啟全局圖優(yōu)化的同時也可以開啟其他的優(yōu)化選項如?Fast Run?等等。使用方法如下:
對底層技術(shù)原理解析感興趣的同學(xué),歡迎繼續(xù)往下讀~~ :D
全局圖優(yōu)化解決的問題
在神經(jīng)網(wǎng)絡(luò)中,Tensor?通常是多維數(shù)組,而計算機的數(shù)據(jù)存儲只能是線性的,因此有許多不同的數(shù)據(jù)存儲格式可以將 Tensor 存儲在計算機內(nèi)存中。通常 Tensor 都是以 NCHW 的數(shù)據(jù)格式(Format)存儲的,W 是什么數(shù)字都有可能,但硬件的體系結(jié)構(gòu)設(shè)計往往希望數(shù)據(jù)能更整齊一些(比如4對齊或32對齊)才能更充分的發(fā)揮設(shè)備的計算性能,因此許多高性能計算庫都采用了不同的 Format 來實現(xiàn)算子。
MegEngine 支持多種主流深度學(xué)習(xí)推理平臺,包括 CUDA,ARM,X86 等等,不同平臺的架構(gòu)存在巨大的差異,因此在通常情況下 NCHW Format 都不能達到最優(yōu)的訪存性能。為了解決這一問題,MegEngine 提供了多種 Format 的算子實現(xiàn),各 Format 的特性見用戶指南。不同平臺上適用的 Format 不同,如在 NVDIA 的 GPU 設(shè)備上,可以使用 NCHW4,NCHW32,CHWN4 等等。
常見的思路是:讓用戶指定要使用的 Format,依靠傳統(tǒng)圖優(yōu)化,將計算圖中所有運算(如卷積)的 Input Tensor 都統(tǒng)一轉(zhuǎn)換為用戶指定的 Format(這一過程稱作?Layout?轉(zhuǎn)換)。
有哪些 layout 適合當前平臺,選哪個 layout 性能更優(yōu)往往沒什么有效的決策方法。除此之外,傳統(tǒng)圖優(yōu)化可能會帶來多次 Layout 轉(zhuǎn)換,這會引入很多額外的內(nèi)存重排的開銷,而用戶在選擇 Format 時并不會考慮這些額外開銷??偟膩碇v,目前傳統(tǒng)圖優(yōu)化面臨如下問題:
性能問題:用戶無法確定哪種 Format 的性能更好,可能存在負優(yōu)化。
局部性問題:沒有考慮額外引入的 Layout 轉(zhuǎn)換開銷。
擴展性問題:每添加一種 Format,就需要添加一種 Layout 轉(zhuǎn)換方法。
為了解決上述傳統(tǒng)圖優(yōu)化存在的問題,MegEngine 引入了全局圖優(yōu)化,在選擇 Format 時充分考慮 Layout 轉(zhuǎn)換引入的額外開銷,自動選擇最合適的 Format,做到讓用戶對 Format 不感知。
全局圖優(yōu)化原理
全局圖優(yōu)化的本質(zhì)是解決計算圖中 Tensor Format 選擇問題,為計算圖中的算子(Operator)選擇各自合適的 Layout,從而使整張計算圖推理性能達到最優(yōu),它的核心是一個動態(tài)規(guī)劃算法。
流程
全局圖優(yōu)化的整體流程如下:

從計算圖中提取特定算子構(gòu)成的連通子圖,全局圖優(yōu)化作用在連通子圖上。
特定算子包括 Convolution 類算子,Elemwise 類算子,CV 類算子,Pooling 算子。
收集子圖中的算子在各 Layout 下的性能數(shù)據(jù),以及不同 Layout 之間轉(zhuǎn)換的開銷數(shù)據(jù),利用以上數(shù)據(jù)構(gòu)造 Layout 選擇問題。
以上數(shù)據(jù)都是通過在目標設(shè)備上實際執(zhí)行算子獲得的。
求解 Layout 選擇問題,求得子圖中各算子應(yīng)選擇的 Layout。
替換子圖中的各算子 Layout 為上一步求得的 Layout,將子圖接入到計算圖中。
全局圖優(yōu)化策略的重點就在如何求解 Layout 選擇問題,這部分采用了基于動態(tài)規(guī)劃的全局圖優(yōu)化算法,下面是算法介紹。
算法
在介紹全局圖優(yōu)化算法前先簡單說明兩個概念:
:計算節(jié)點。一個算子就是一個計算節(jié)點。
:數(shù)據(jù)節(jié)點。
?的輸入、輸出 Tensor。
下圖表示拓撲排序后計算圖的一部分,它由多個??構(gòu)成,
?之間通過??相連,連接兩個?
?的?
?既是上一個
?的輸出,又是下一個?
?的輸入,例如圖中?
?既是?
?的輸出,又是?
?的輸入。

全局圖優(yōu)化算法要求得的解是連通子圖達到最優(yōu)性能時子圖中每個???應(yīng)選擇的 Layout。為了方便介紹算法我們約定以下符號的含義:


在全局圖優(yōu)化流程第二步中已經(jīng)收集到了連通子圖中各??在各 Layout 下的性能數(shù)據(jù)?
,以及?
?Layout 轉(zhuǎn)換的開銷數(shù)據(jù)?
。那么接下來開始推導(dǎo)狀態(tài)轉(zhuǎn)移方程。
在??處,由于?
?為第一個?
,因此?
?等于?
?在?
?下的耗時。
在??處,
?應(yīng)該等于?
?的最短耗時?
?加?
?在?
?下的耗時
,除此之外還要加上?
?和?
?處于不同?
?時?
?的?
?轉(zhuǎn)換耗時
。
延伸到?,可以得到狀態(tài)轉(zhuǎn)移方程:
?的最短耗時:
已知?,
,
,假設(shè)一共有?
?個?
。根據(jù)以上方程,首先求得全局最優(yōu)解?
?的最短耗時?
?,從而可以確定使?
?達到最小值的?
?x,此時可以確定?
?應(yīng)選擇的 Layout。接下來根據(jù)狀態(tài)轉(zhuǎn)移方程確定使??達到最小值的?
?y,此時可以確定?
?應(yīng)選擇的 Layout,依此類推??梢愿鶕?jù)狀態(tài)轉(zhuǎn)移方程從最后一個?
?往前回溯,從而確定每個?
?應(yīng)選擇的 Layout。至此問題得到解決。
假設(shè)有??個?
,連接?
?兩部分的最大?
?數(shù)為?N,每個?Var?有?M?種 Format,那么算法復(fù)雜度為?
。如果模型比較復(fù)雜?N?很大,
?數(shù)?
?呈指數(shù)增長,會導(dǎo)致算法運行時間非常長。因此為了降低算法復(fù)雜度,對?
?進行了剪枝。
剪枝
假設(shè)??由?m?個?
?相連?(v1,v2,...,vm),
?從?Stateni?轉(zhuǎn)到?Statenj?的代價記做?
。
?表示?
?處于?
的最短耗時,當?
?時,如果?
?加?
?從?
轉(zhuǎn)到??的耗時仍然比?
?短,那么可以認為?
?是沒有用的,可以將?
?剪枝掉。由此可以得出剪枝的原則:
工程實踐
通過全局圖優(yōu)化算法可以解決傳統(tǒng)圖優(yōu)化存在的性能問題和局部性問題,但是上面提到的傳統(tǒng)圖優(yōu)化的擴展性問題似乎并沒有得到解決。因此全局圖優(yōu)化策略中除了實現(xiàn)算法以外還做了一些額外的工作。
數(shù)據(jù)格式轉(zhuǎn)換器
由于 MegEngine 提供了眾多的 Format,如 NCHW、NHWC、NCHW4、CHWN4等等。假設(shè)有?N?種 Format,那么理論上就應(yīng)該維護??個 Layout 轉(zhuǎn)換算法,這樣的成本是不可接受的。
考慮到 Layout 轉(zhuǎn)換都可以通過 MegEngine 基礎(chǔ)算子?reshape?和?transpose?拼接而成,因此我們設(shè)計了數(shù)據(jù)格式轉(zhuǎn)換器利用 reshape 和 transpose 完成所有的 Layout 轉(zhuǎn)換工作。下面是一個通過 reshape 和 transpose 算子完成 Layout 轉(zhuǎn)換的例子。
為方便描述約定 Layout 表示格式,如 NCHW4 是在 Channel 維度進行了 Channel / 4 的拆分,表示為 (N, C//4, H, W, C%4)。 例:假設(shè)新增 NCHW16,如何將 NCHW4 轉(zhuǎn)換為 NCHW16 呢?
layout0 = (N, C//4, H, W, C%4)
layout1 = (N, C//16, H, W, C%16)
reshape 對 layout0 切分 C 維度:(N, C//4//4, C//4%4, H, W, C%4)
transpose 調(diào)整維度位置:(N, C//4//4, H, W, C//4%4, C%4)
reshape 合并最后兩個維度:(N, C//16, H, W, C%16) = layout1
有了數(shù)據(jù)格式轉(zhuǎn)換器當增加新的 Format 時無需再手寫對應(yīng)的 Layout 轉(zhuǎn)換算法,傳統(tǒng)圖優(yōu)化存在的擴展性問題在全局圖優(yōu)化中也得到了解決。
總結(jié)
從性能角度講,全局圖優(yōu)化相比傳統(tǒng)圖優(yōu)化能夠帶來更大的收益。由于 MegEngine 支持 int8 的 Format 較多,因此在 int8 模型上的加速效果尤為顯著。 使用全局圖優(yōu)化的前提要求是需要有能真實設(shè)備進行 profiling 才能做出正確決策,因此在這一點上還不能夠完美的替代掉傳統(tǒng)圖優(yōu)化。當能夠滿足這個條件時,全局圖優(yōu)化的使用方法更輕松也性能更優(yōu),是一個更好的選擇。
附:
GitHub:MegEngine 天元?(歡迎 star~
Gitee:MegEngine/MegEngine
官網(wǎng):MegEngine-深度學(xué)習(xí),簡單開發(fā)
歡迎加入 MegEngine 技術(shù)交流 QQ 群:1029741705