MLSys 2020|支撐億級終端設備,阿里淘系端上開源推理引擎MNN解讀

2020-12-15 機器之心Pro

機器之心發布

機器之心編輯部

阿里巴巴有諸多的複雜端智能業務場景,對於深度學習引擎的性能、包大小、普適性都要很高的要求。在這樣的背景下,阿里巴巴自研的端上推理引擎 MNN 應運而生。

目前,它已經大規模應用在阿里巴巴移動端及 IOT 設備上,支撐了億級的終端設備以及數十種不同類型的應用場景。在 2019 年的雙 11,更是作為底層的技術設施,承擔了數千億級的計算。

MNN 在推理引擎設計與優化方面提出了一系列創新性的思想,論文近期在 MLSys 2020 上發表,並進行了遠程 Oral 演講。

論文地址:https://proceedings.mlsys.org/static/paper_files/mlsys/2020/7-Paper.pdf

MNN 開源地址:https://github.com/alibaba/MNN

註:受 Conv-19 疫情影響,今年包括 AAAI 等會議在內的諸多受邀進行的 Oral 演講都通過遠程的方式進行。

具體而言,MNN 提出了三大核心創新:

運行時半自動搜索架構卷積算法優化創新異構設備混合調度

MNN 的整體框架如下圖:

運行時半自動搜索架構

半自動搜索,是在模型結構已知的情況下,在已有的高性能計算模塊中,按照一定規則,搜索、組合出最適應該模型的計算方案。它是介於以 TVM 為代表的的全自動搜索(i.e. 自動調優)和以 NCNN 為代表的全手動搜索(i.e. 手工實現每個 case)之間一種新穎的設計思想。它的核心洞察在於,TVM 的自動編譯優化,難以匹敵針對硬體特性和算子的手寫彙編;同時,模型算子、參數的 case 組合無窮多,無法針對每個 case 進行優化。在最後的「數據論證」部分,我們會用實驗數據展示 MNN 相對於全自動搜索(TVM)和全手動搜索(NCNN)的優勢。

為了支撐運行時半自動搜索的能力,MNN 提出了一個特殊的處理過程,稱為「預推理」。預推理過程中,會提前進行算子的計算策略選擇和資源分配。

一般情況下深度學習的應用輸入尺寸變動的頻率比較小或者可以經過特定的預處理階段變成相對歸一的尺寸。而在輸入尺寸確定的情況下,我們可以對模型中每個 Op,計算出它的輸出大小以及不同計算策略的消耗以及資源需求量,並以此為依據決定每個 Op 的計算策略,提前進行資源的分配。

計算策略選擇

算子的計算策略,包含算法與運行後端的選擇。每種算子可以有多種計算策略,不同計算策略適用於不同的輸入尺寸,MNN 採用 Cost 計算的方式,去決定計算策略的選取。算法的 Cost 與運行後端的調度 Cost 共同決定了一種計算策略的 Cost。公式如下:

運行後端的調度 Cost,我們通過在大量實際的機器上測試獲得。而需要重點關注的是不同算法實現的 Cost。

以卷積為例,假定輸入尺寸為

,輸出尺寸為

,卷積核大小為

,則有兩種計算策略:

滑窗/矩陣乘 與 Winograd 算法。

滑窗/矩陣乘的 Cost 為:

Winograd 算法需要先把圖像劃分為

個小塊(

,自行指定),然後針對這些小塊執行四個步驟:

其中

可以預先計算,實際計算過程為後三個步驟,這三步的計算量分別是

所以

為:

n 增大時,前後變換耗時增加,中間的乘法數減少,因此

先降後升,需要找最小值。

相比,取最小,即為卷積的計算策略 Cost:

具體的滑窗/矩陣乘、Winograd 算法的選擇流程,可參考下圖:

資源預分配

大多數推理框架都會提到「內存復用」,即在網絡運行前離線或在線算好每個 feature map 的大小,然後根據數據依賴關係計算一個最大所需內存,申請並把各個 feature map 的指針計算出來。這樣做存在一些不易擴展的問題:

沒有考慮算子內部需要緩存的問題,在不同的計算策略下,算子自身可能需要或不需要緩存(比如卷積用滑窗不需要緩存,用 Winograd 算法需要),這時候算子內部的緩存無法復用或預先分配,會增加內存佔用或者影響性能。Feature map 對於異構設備而言(主要是 GPU),所需要的資源往往不僅是一塊連續內存,因此異構端無法用同一套內存復用機制,往往需要另外寫。網絡中有可能需要做多路並行,比如 CPU、GPU 各一路,這樣之前按整個網絡算出來的內存地址就無效了。

MNN 採用一種靈活而簡單的策略,解決了資源預分配與復用的問題:

1.計算一遍數據依賴,為每個 Tensor 計算引用計數

2.針對每個算子,把資源管理與計算的代碼分開,其中資源管理的代碼包括:

(1)計算輸出大小

(2)依據輸出大小申請 Tensor 資源

(3)算子做 resize 準備:計算策略選擇-申請並回收緩存

(4)回收引用計數清零後的輸入 Tensor 的資源,回收之後可供下次分配使用

3.在預推理過程中,僅執行資源管理的代碼。在推理過程中,僅執行計算的代碼。

對於 CPU 而言,資源管理就是內存的申請與釋放,資源預分配分別在 MI6 和 P10 上降低了 6.5% 和 7.6% 的推理延時。而在使用 Vulkan 時,資源管理包括顯存的申請與釋放、Pipeline 資源的創建、Command Buffer 的創建等,這時資源預分配的收益十分可觀,分別在 MI6 和 P10 上降低了 75.2 % 和 49.5 % 的推理延時。

卷積算法優化創新

NC4HW4 格式

在推理應用中,大部分算子的輸入輸出是 NCHW 四維,算子一般可在 N 和 C 方向天然並行,且 N 一般為 1。因此,MNN 採用 NC4HW4 格式,便於算子的 SIMD 優化。下圖以向量乘 VMUL 指令為例,說明為什麼 NC4HW4 對於性能優化更加合適:

端上硬體支持以 4 為單元的向量運算。CPU SIMD 與 GPU SIMT+SIMD 均是如此。深度學習領域中大部分算子具有通道可拆分特性

基於以上兩點原因,MNN 大範圍地採用了 NC4HW4 的格式。

Winograd 算法創新

前文所提的 Winograd 算法,在最理想情況下,可以把 卷積的複雜度降到 的複雜度。一般情況下也有 2-4 倍的加速,但它的應用受到如下限制:

Winograd 每次需要計算更多的像素,對於尺寸比較小的 feature map 會有冗餘,影響性能在一些情況下,Winograd 需要前處理/後處理,有可能抵消掉其減少的乘法數收益針對每一種卷積核大小與計算數的組合,都需要實現一份代碼,優化的工程成本高昂

因此其他框架實現 Winograd,僅對用得最多的 的卷積作多套實現,比如 等。

MNN 提出一種新的實現方案,可以較低的代碼編寫成本來對所有類型的卷積達到足夠的加速:

1.內置 Winograd 因子生成器,可根據需要的 生成 Winograd 變換所需要的 A, B, G 矩陣,矩陣生成需要初始化一個多項式:

業界常見的方案是設,但這樣 較大時會導致 G 矩陣中的數用浮點表示的誤差變大,MNN 為了避免太大的誤差,設置。

2.將 Winograd 的算法實現改寫為 源變換——重排——矩陣乘——重排——目標變換 的流程,使核心運算由多個點乘轉換為更高效的矩陣乘法:

3.權重進行預計算,使用 A , B 矩陣進行源變換和目標變換的計算

這樣只需要寫一份代碼,就可以實現任意 F(N, K) 的 Winograd 優化,儘管相對於完全手寫的版本性能會差一些,結合前面的半自動搜索的機制,仍然能起到比較明顯的加速效果。

基於任意卷積的 Winograd 優化算法,MNN 可以優化 stride > 1 的反卷積實現,參考:

https://github.com/alibaba/MNN/blob/master/source/backend/cpu/compute/DeconvolutionWithStride.cpp

Strassen 算法創新

對於大矩陣乘 C=AB 的計算,學界很早就有 Strassen 算法,其思路是把 A, B 等分拆成 4 個小塊,進行一系列的加減計算後,進行 7 次小塊矩陣乘,再經過一系列加減計算組裝成 C。這樣,原本需要 8 次小矩陣乘,現在只需要 7 次,就減少了 1 次矩陣乘。

但這個算法在通常的計算優化中難以應用,原因在於:

需要遞歸,影響效率在矩陣不是足夠大時,不如通常的矩陣乘有效率計算過程中需要申請-釋放內存,影響運行效率。

而 MNN 通過預推理機制,解決了 Strassen 算法的落地問題:

把遞歸申請-"執行"-釋放的放到預推理中完成,"執行"步驟僅產生 lambda 函數,供推理時調用用內存讀寫的大小去估 Strassen 算法的收益,判斷是否進一步遞歸,對 的矩陣乘法,判斷公式為 在推理過程中:按順序調用預推理產生的 lambda 函數數組即可,無需遞歸或者申請/釋放資源。

代碼詳見:

https://github.com/alibaba/MNN/blob/master/source/backend/cpu/compute/StrassenMatmulComputor.cpp

https://github.com/alibaba/MNN/blob/master/source/backend/cpu/compute/Convolution1x1Strassen.cpp

異構設備混合調度

與其他深度學習框架的後端 API 不同,MNN 後端 API 的設計理念的獨特性在於兩點:

MNN 後端 API 幫助實現異構設備的「混合調度」:TFLite 這樣的後端 Delegate,會在遇到不支持的算子的時候,回退到算子的 CPU 實現。可以說,TFLite 後端設計是「被動式」的。與 TFLite 這樣的後端 Delegate 不同,MNN 的異構調度是「主動式」的,我們稱之為「混合調度」:MNN 在創建推理會話時,可以針對算子配置後端,且配置多於一個後端時,會根據後端實現動態選擇對性能最優的後端。同時,會話負責銜接後端間的數據拷貝,單一後端僅需實現到數據緩存區域的讀寫,而無需感知其他後端的存在。這樣,就可以在單會話內或多會話間實現後端的自由組合。在後端不支持或性能不適合實現特定算子時,就可以藉助其他後端的實現,完成整個推理過程。MNN 後端 API 的為算子抽象級別,而非例如 TFLite 的子圖抽象級別。也就是說,在 MNN 的後端實現中,每個算子是單獨實現的,後端實現不需要考慮子圖的拓撲結構與優化。這一點,與前文所提的「半自動搜索」有關:在預處理過程中,整個計算圖的圖優化已經統一提前完成,所以不需要在後端子圖實現。另外,算子級別的後端抽象,也極大的提高了後端實現的可調試性:可以將實現有誤的後端算子快速定位。

MNN 後端 API 設計如下圖所示:

藉助於統一的後端 API,MNN 在通用性上取得了很大的成果,支持了目前最廣泛的計算設備,包括 CPU(ArmV7, ARM64, ARM64e),Vulkan,OpenCL,OpenGL,Metal 以及 NPU 等。

數據論證

備註:所有的數據均測試於各框架提供的 benchmark 標準下,時間為 2019.9 月論文提交截稿前。

通用性能測試

我們在移動端上最常見的模型和設備上將 MNN 和其他框架進行了對比。模型層面包含 MobileNet V1, SqueezeNet v1.1 以及 ResNet-18。而設備則採用了業界較為普及的 iPhone 8,iPhone X,小米 6(處理器:驍龍 835)以及 華為 Mate 20(處理器:麒麟 980)。性能實驗考慮了 CPU 和 GPU 兩種類型計算設備,在 CPU 推理性能評測中,我們分別評測了 2 線程及 4 線程的情況;而在 GPU 推理性能評測部分我們則分別對 MNN 支持的所有計算後端都進行了對比。

1. 從上述實驗中不難看出,在絕大多數模型、設備、計算後端上,MNN 比其他現有的推理引擎在性能上快了大約 20% - 40%。

2. 對於 CPU 上的推理來說,由於 MNN 自身實現了高性能的線程池等底層優化,在 4 線程的並行推理實驗中,iOS 平臺上的表現相對其他推理引擎快了 30%,在 Android 平臺上相對其他框架快了 34%。

3. 而對於利用 GPU 做推理:

(1)在 iOS 平臺上,MNN 比起 TF-lite 有較大幅度的性能優勢;而跟蘋果自身的 CoreML 相比則有這略微的劣勢,這一方面經過我們的一些探索,發現和蘋果自身的特殊優化息息相關。

(2)而在 Android 平臺部分,不同的框架都或多或少在支持不同計算後端時上有一些性能缺陷的情況。比如在 小米 6 之類的設備上,NCNN 運行 Vulkan 後端會有明顯的性能差距;而 TF-Lite 的 OpenGL 後端在運行 ResNet-18 表現不盡如人意。而 MNN 則由於自身半自動搜索架構的設計,可以在不同的計算後端中都取得較為優秀的性能表現。

4. MNN 因為採用了比較合理的性能優化手段,在部分高端行動裝置上,多線程下的 CPU 推理性能可以和 GPU 相媲美。

半自動搜索性能優勢對比

為了更充分的證明 MNN 運行時半自動搜索的合理性,我們提出了兩個對照實驗。

第一個對照實驗是針對那些存在比較邊角的算子屬性的情況下,各個框架的表現情況。

因為 Inception-V3 的模型存在諸如 1×7 and 7×1 卷積這樣的邊界條件,所以採用傳統手動彙編逐一優化的方式下,會存在很多性能盲點。因此在結果中可以明顯看出 NCNN 在這種情形下性能會大幅下降。而 MNN 雖然沒有針對這樣的算子屬性進行針對性的優化,但是運行時半自動搜索架構的適應性可以較好的應對這種情況,取得不錯的運行性能。

第二個對照實驗是 MNN 與 TVM 的性能對比。

可以看出,在沒有針對任何模型特定的優化的情況下,MNN 相比於 TVM 有可觀的性能優勢。另外考慮到 TVM 還有模型編譯、調優的過程耗時,MNN 更加適合移動端智能的應用。

總結與展望

MNN 通過半自動搜索,卷積算法優化創新和異構設備的混合調度,達到了在絕大多數情況下,領先於業界的性能。我們意識到性能是端側智能應用非常重要的一環,會在未來持續投入更多創新性的性能優化方案,比如把半自動搜索應用於 MNN 正在建設的動態圖訓練能力中,讓動態搭建的計算圖可以選擇出最適合當前參數的算子實現。另外,我們還看到端智能應用場景正在往 NLP 和 IOT 方向飛速發展。由於 NLP 的模型普遍較大,IOT 設備相比於移動端算力受限,這些都對模型壓縮提出了更高的要求。所以,MNN 在未來除了投資性能優化以外,還會致力於研究更大壓縮比、更好性能提升的模型壓縮算法,讓 MNN 成為端側推理性能、壓縮能力最好的深度學習引擎。

相關焦點

  • MLSys 2020 | 支撐億級終端設備,阿里淘系端上開源推理引擎MNN解讀
    機器之心機器之心發布機器之心編輯部阿里巴巴有諸多的複雜端智能業務場景,對於深度學習引擎的性能、包大小、普適性都要很高的要求。在這樣的背景下,阿里巴巴自研的端上推理引擎 MNN 應運而生。
  • 支撐億級終端設備,阿里淘系端上開源推理引擎MNN解讀
    機器之心發布 機器之心編輯部 阿里巴巴有諸多的複雜端智能業務場景,對於深度學習引擎的性能、包大小、普適性都要很高的要求。在這樣的背景下,阿里巴巴自研的端上推理引擎 MNN 應運而生。
  • 阿里正式開源輕量級深度學習端側推理引擎「MNN」
    阿里近日正式開源了輕量級深度學習端側推理引擎「MNN」。與 Tensorflow、Caffe2 等同時覆蓋訓練和推理的通用框架相比,MNN 更注重在推理時的加速和優化,在大規模機器學習應用中具有優勢。本文詳細闡述了MNN背後的技術框架和規劃。 近日,阿里正式開源輕量級深度學習端側推理引擎「MNN」。
  • 阿里開源MNNKit:基於MNN的移動端深度學習SDK,支持安卓和iOS
    機器之心報導參與:一鳴、Jamin近來,有越來越多的深度學習框架開始面向移動端進行發展。近日,阿里也基於其 MNN 推理引擎開源了最新的 MNNKit 深度學習 SDK,安卓和 iOS 開發者都可以方便地進行調用。
  • AI for everyone,阿里淘系MNN工作檯正式公測!
    阿里巴巴淘系技術開源輕量級深度學習推理引擎 MNN 以來,得到了業界的普遍認可 —— 數十家企業成為 MNN 的用戶,不乏有一線科技企業;此外,MNN 還與上海交大等一線院校展開合作
  • 阿里開源首個移動AI項目,淘寶同款推理引擎
    剛剛,阿里巴巴宣布,開源自家輕量級的深度神經網絡推理引擎MNN(Mobile Neural Network),用於在智慧型手機、IoT設備等端側加載深度神經網絡模型,進行推理預測。這是阿里開源的首個移動AI項目,已經用於阿里手機淘寶、手機天貓、優酷等20多個應用之中。
  • 阿里組織架構大調整:大淘系高管多變動 本地生活再獲技術支撐
    來源:經濟觀察報原標題:阿里組織架構大調整: 大淘系高管多變動 本地生活再獲技術支撐經濟觀察網 記者 錢玉娟 12月11日,阿里巴巴集團進行了新一輪的組織架構調整。大淘系多變動在由蔣凡發出的內部信中顯示,於2019年5月加入阿里巴巴,任職集團副總裁的湯興(花名:平疇),全面負責淘系用戶產品與技術,搜索推薦事業部、天貓-消費者平臺產品團隊、淘系消費者運營事業部也向其匯報。
  • 2020,國產AI開源框架「亮劍」TensorFlow、PyTorch
    在那個3月28日,華為在開發者大會2020上完成了輪值董事長徐直軍在去年8月的承諾,宣布正式開源MindSpore,這是一款支持端邊雲全場景的深度學習訓練推理框架。 時間撥到四天前,AI獨角獸曠視科技宣布開源天元(MegEngine),強調這是訓練推理一體化、動靜態合一的工業級深度學習框架。
  • 流式推理引擎對比:DarwinML Inference .vs. Metaflow .vs. Air...
    對於低延遲的場景,能提供毫秒級的相應。對於高並發的場景,支持線性在線自動擴容。    MetaFlow:    MetaFlow是Netflix開源的一款旨在幫助數據科學家開發管理其項目的Python庫。他側重於減輕數據科學家在開發、管理數據科學項目時,對非數據科學類其他工程領域的技能要求與投入。使之能關注於數據科學領域。
  • 速度超快,字節跳動開源序列推理引擎LightSeq
    據了解,這應該是業界第一款完整支持 Transformer、GPT 等多種模型高速推理的開源引擎。LightSeq 可以應用於機器翻譯、自動問答、智能寫作、對話回復生成等眾多文本生成場景,大大提高線上模型推理速度,改善用戶的使用體驗,降低企業的運營服務成本。
  • 阿里這屆投資者大會,把「高速公路上換引擎」的關鍵講清楚了
    核心商業進化:過去12個月淘寶直播用戶同比增長160%,直播商家同比增長220%;每月超2.6億用戶深度參與淘寶App的互動遊戲;天貓旗艦店2.0截至8月底覆蓋27萬商家——淘系的產品和To B能力體系在向沉浸式、互動式的方向躍遷。新業務的進展:預計2021財年內阿里雲將實現盈利,菜鳥經營活動現金流將轉正。
  • 阿里新一輪組織調整:電商與本地生活進一步融合,淘系中堅力量崛起
    值得注意的是,此前陷入貪腐風波的胡偉雄(花名:古邁)並沒有出現在這次調整的名單中,原新零售智能引擎事業群總裁Jingren(靖人)則另有任用。2020年,除了疫情因素,阿里實際上面臨著更大的挑戰與競爭壓力。鈦媒體也從側面了解到,最近阿里包括螞蟻金服在內不少業務都在調整。
  • 繼XDL 之後,阿里媽媽開源大規模分布式圖表徵學習框架 Euler
    雷鋒網 AI 科技評論消息,繼去年 11 月開源面向高維稀疏數據場景的深度優化工具 X-Deep Learning(截至發稿,GitHub Star 數已達到 1972)之後,阿里媽媽團隊於今日正式開源大規模分布式圖表徵學習框架 Euler,這一框架具有四大特點:大規模圖的分布式學習
  • 字節跳動開源序列推理引擎LightSeq
    這應該是業界第一款完整支持 Transformer、GPT 等多種模型高速推理的開源引擎。據了解,這應該是業界第一款完整支持 Transformer、GPT 等多種模型高速推理的開源引擎。LightSeq 可以應用於機器翻譯、自動問答、智能寫作、對話回復生成等眾多文本生成場景,大大提高線上模型推理速度,改善用戶的使用體驗,降低企業的運營服務成本。相比於目前其他開源序列推理引擎,LightSeq具有如下幾點優勢:1.
  • 發力晚,貨品少,阿里淘小鋪憑什麼突圍?
    可能對於一款商品來說,平時一年的銷售額才10億,通過爆款的方式幾天就到了5億,企業怎麼可能會拒絕。而銷量的提高會使得平臺對供應端的議價權增強,採購價格更低,從而給消費者帶來更多實惠。與之匹配的就是更大的銷量,這是一個良性循環,我們稱之為「爆款模式」。
  • 淘小鋪涉嫌傳銷,阿里夢斷社交電商
    淘小鋪的負責人訊飛曾說淘寶上航母,淘小鋪就是護衛艦,目前來看,這個護衛艦不合法,被取締了。 那麼這個廣州三帥六將教育科技有限公司是幹嘛的呢?就是淘小鋪的官方合作商,其實就是負責洗腦的,做傳銷的,創始人就是微商出身,把當年微商的那一套洗腦思維,拉來幫著推廣淘小鋪。
  • 淘小鋪:阿里搶灘社交電商
    S端淘小鋪供貨商可包括品牌、經銷商、工廠和線下渠道商家。B端銷售則是指淘小鋪掌柜,將包括內容達人、新賣家、新消費者和淘寶客等。C端消費者將會是B端淘小鋪掌柜的粉絲人群、社交人群、朋友人群等。5. 產品目的(1)降低開店門檻拼多多的崛起固然和本身社交化、遊戲化的新電商玩法有很大關聯,也不能缺少眾多商家的支持。
  • 阿里巴巴組織架構大調整 涉及淘系電商各個BU和核心高管
    此次調整十分全面,涉及淘系電商的各個BU和核心高管,如下:湯興(平疇)將全面負責淘系用戶產品與技術。搜索推薦事業部、天貓-消費者平臺產品團隊、淘系消費者運營事業部向平疇匯報。楊光(吹雪)全面負責天貓商家和行業的運營工作。
  • 超級IPO前夕阿里領投21世紀報系
    今日早間,《第一財經日報》記者從消息人士獲悉:阿里將入股南方報業傳媒集團下屬21世紀報系。在此輪投資總額約5億,持股20%;由阿里巴巴領投,中國建材跟投。但是,阿里巴巴集團官方向《第一財經日報》記者表示,對於上述事件不予評論;而本報記者致電21世紀經濟報導相關負責人,其表示不便接受採訪。
  • 阿里為什麼要拿下Flink?
    阿里的Flink血液不熟悉的Data Artisans的讀者,會很容易錯過那些因標題為「阿里巴巴收購德國數據公司」這種平淡表述下的很多信息。即使那約1億美元的收購額表述,在有著近4000多億美元體量的的阿里賣賣賣的歷程中,對比之前收購餓了麼的95億美元、36.7億美元拿下優酷土豆等等,也實在是難入法眼。