最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2022-10-27 12:03 作者:曠視天元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)化的整體流程如下:

  1. 從計算圖中提取特定算子構(gòu)成的連通子圖,全局圖優(yōu)化作用在連通子圖上。

    • 特定算子包括 Convolution 類算子,Elemwise 類算子,CV 類算子,Pooling 算子。

  2. 收集子圖中的算子在各 Layout 下的性能數(shù)據(jù),以及不同 Layout 之間轉(zhuǎn)換的開銷數(shù)據(jù),利用以上數(shù)據(jù)構(gòu)造 Layout 選擇問題。

    • 以上數(shù)據(jù)都是通過在目標設(shè)備上實際執(zhí)行算子獲得的。

  3. 求解 Layout 選擇問題,求得子圖中各算子應(yīng)選擇的 Layout。

  4. 替換子圖中的各算子 Layout 為上一步求得的 Layout,將子圖接入到計算圖中。

全局圖優(yōu)化策略的重點就在如何求解 Layout 選擇問題,這部分采用了基于動態(tài)規(guī)劃的全局圖優(yōu)化算法,下面是算法介紹。

算法

在介紹全局圖優(yōu)化算法前先簡單說明兩個概念:

  • Op:計算節(jié)點。一個算子就是一個計算節(jié)點。

  • Var:數(shù)據(jù)節(jié)點。Op?的輸入、輸出 Tensor。

下圖表示拓撲排序后計算圖的一部分,它由多個?Op?構(gòu)成,Op?之間通過??相連,連接兩個?Op?的?Var?既是上一個Op?的輸出,又是下一個?Op?的輸入,例如圖中?Var2?既是?Op1?的輸出,又是?Op3?的輸入。

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

在全局圖優(yōu)化流程第二步中已經(jīng)收集到了連通子圖中各?%7BOp%7D?在各 Layout 下的性能數(shù)據(jù)?%7BO%7D_k%5En,以及?%7BVar%7D?Layout 轉(zhuǎn)換的開銷數(shù)據(jù)?%7BV%7D_%7Bs-%3Ek%7D%5En。那么接下來開始推導(dǎo)狀態(tài)轉(zhuǎn)移方程。

在?%7BCut%7D_0?處,由于?%7BOp%7D_0?為第一個?%7BOp%7D,因此?%7BT%7D_k%5E0?等于?%7BOp%7D_0?在?%7BState%7D%5Ek?下的耗時。

  • %7BT%7D_k%5E0%20%3D%20%5Ctext%7BO%7D_k%5E0

  • %7BT%7D_0%20%3D%20min_%7B%5Ctext%7Ball%20state%20k%7D%7D(%5Ctext%7BT%7D_k%5E0)

在?%7BCut%7D_1?處,%7BT%7D_k%5E1?應(yīng)該等于?%7BCut%7D_0?的最短耗時?%7BT%7D_0?加?%7BOp%7D_1?在?%7BState%7D%5Ek?下的耗時 %7BO%7D_k%5E1,除此之外還要加上?%7BOp%7D_0?和?%7BOp%7D_1?處于不同?%7BState%7D?時?%7BCut%7D_0?的?%7BState%7D?轉(zhuǎn)換耗時%7BV%7D_%7Bs-%3Ek%7D%5E0。

  • %7BT%7D_k%5E1%20%3D%20min_%7B%5Ctext%7Ball%20state%20s%7D%7D(%5Ctext%7BT%7D_s%5E0%2B%5Ctext%7BV%7D_%7Bs%5Cto%20k%7D%5E0)%2B%5Ctext%7BO%7D_k%5E1

  • %5Ctext%7BT%7D_1%20%3D%20min_%7B%5Ctext%7Ball%20state%20k%7D%7D(%5Ctext%7BT%7D_k%5E1)

延伸到?%7BCut%7D_%7Bi%2B1%7D,可以得到狀態(tài)轉(zhuǎn)移方程:

  • %5Ctext%7BT%7D_k%5E%7Bi%2B1%7D%20%3D%20min_%7B%5Ctext%7Ball%20state%20s%7D%7D(%5Ctext%7BT%7D_s%5Ei%2B%5Ctext%7BV%7D_%7Bs%5Cto%20k%7D%5Ei)%2B%5Ctext%7BO%7D_k%5E%7Bi%2B1%7D

%7BCut%7D_%7Bi%2B1%7D?的最短耗時:

  • text%7BT%7D_%7Bi%2B1%7D%20%3D%20min_%7B%5Ctext%7Ball%20state%20k%7D%7D(%5Ctext%7BT%7D_k%5E%7Bi%2B1%7D)

已知?%7BT%7D_k%5E0,%7BV%7D_%7Bs%5Cto%20k%7D%5Ei,%7BO%7D_k%5Ei,假設(shè)一共有?%5Ctext%7Bn%7D?個?%7BCut%7D。根據(jù)以上方程,首先求得全局最優(yōu)解?%7BCut%7D_n?的最短耗時?%7BT%7D_n?,從而可以確定使?%7BT%7D_x%5En?達到最小值的?%7BState%7D?x,此時可以確定?%7BOp%7D_n?應(yīng)選擇的 Layout。接下來根據(jù)狀態(tài)轉(zhuǎn)移方程確定使??達到最小值的?%7BState%7D?y,此時可以確定?%7BOp%7D_%7Bn-1%7D?應(yīng)選擇的 Layout,依此類推??梢愿鶕?jù)狀態(tài)轉(zhuǎn)移方程從最后一個?%7BCut%7D?往前回溯,從而確定每個?%7BOp%7D?應(yīng)選擇的 Layout。至此問題得到解決。

假設(shè)有?%7BK%7D?個?%7BCut%7D,連接?%7BCut%7D?兩部分的最大?%7BVar%7D?數(shù)為?N,每個?Var?有?M?種 Format,那么算法復(fù)雜度為?%7BO%7D(%5Ctext%7BKM%7D%5EN)。如果模型比較復(fù)雜?N?很大,%7BState%7D?數(shù)?%7BM%7D%5EN?呈指數(shù)增長,會導(dǎo)致算法運行時間非常長。因此為了降低算法復(fù)雜度,對?%7BState%7D?進行了剪枝。

剪枝

假設(shè)?%7BCut%7D_n?由?m?個?%7BVar%7D?相連?(v1,v2,...,vm),%7BCut%7D_n?從?Stateni?轉(zhuǎn)到?Statenj?的代價記做?%7BDistance(i%2C%20j)%7D。

  • %5Ctext%7BDistance(i%2C%20j)%7D%20%3D%20%5Csum_%7Bk%3D1%7D%5Em%20%5Ctext%7BV%7D_%7Bi%5Cto%20j%7D(v_k)

%7BT%7D_i%5En?表示?%7BCut%7D_n?處于?%7BState%7D_n%5Ei 的最短耗時,當?%7BT%7D_i%5En%3C%20%5Ctext%7BT%7D_j%5En?時,如果?%7BT%7D_i%5En?加?%7BCut%7D_n?從?%7BState%7D_n%5Ej 轉(zhuǎn)到??的耗時仍然比?%7BT%7D_j%5En?短,那么可以認為?%7BState%7D_n%5Ej?是沒有用的,可以將?%7BState%7D_n%5Ej?剪枝掉。由此可以得出剪枝的原則:

  • %5Ctext%7BDistance(i%2C%20j)%7D%20%3C%20%5Ctext%7BT%7D_j%5En%20-%20%5Ctext%7BT%7D_i%5En

工程實踐

通過全局圖優(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)該維護?%7BO%7D(%5Ctext%7BN%7D%5E2)?個 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)

  1. reshape 對 layout0 切分 C 維度:(N, C//4//4, C//4%4, H, W, C%4)

  2. transpose 調(diào)整維度位置:(N, C//4//4, H, W, C//4%4, C%4)

  3. 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

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

分享到微博請遵守國家法律
武安市| 英超| 石嘴山市| 南雄市| 滦南县| 乌苏市| 衡阳市| 闽侯县| 绍兴市| 通州区| 南部县| 台南市| 九江市| 文登市| 乡城县| 昌都县| 闽侯县| 兴业县| 汝阳县| 华容县| 徐州市| 呼伦贝尔市| 怀宁县| 花垣县| 肃北| 白朗县| 苍梧县| 河南省| 柳州市| 调兵山市| 广西| 改则县| 崇阳县| 新营市| 任丘市| 民乐县| 高平市| 阿坝县| 汉沽区| 厦门市| 禹城市|