當前位置:
首頁 > 最新 > 上海交大團隊:如何用TVM優化ARM架構GPU,在移動端實現快速深度學習

上海交大團隊:如何用TVM優化ARM架構GPU,在移動端實現快速深度學習

作者:鄭憐憫

編譯:Bot

編者按:半年前,上海交大陳天奇團隊開源了端到端IR堆棧工具TVM,可以幫用戶優化深度學習過程中的硬體配置,緩解了當前大多數計算機GPU在面對深度學習時表現出來的性能不足。近日,團隊的一名學生鄭憐憫帶來了項目的新進展,他將TVM用於移動端常見的ARM GPU,提高了移動設備對深度學習的支持能力。

以下是論智對原文的翻譯:

隨著深度學習不斷取得進展,開發者們對在移動設備上的部署神經網路的需求也與日俱增。和我們之前在桌面級GPU上做過的嘗試類似,把深度學習框架移植到移動端需要做到這兩點:夠快的inference速度和合理的能耗。但是,現在的大多數DL框架並不能很好地支持移動端GPU,因為它們和桌面級GPU在架構上存在巨大差異。為了在移動端做深度學習,開發者們往往要對GPU做一些特殊優化,而這類額外工作也加大了對GPU的壓力。

TVM是一個端到端的IR堆棧,它可以解決學習過程中的資源分配問題,從而輕鬆實現硬體優化。在這篇文章中,我們將展示如何用TVM/NNVM為ARM Mali GPU生成高效kernel,並進行端到端編譯。在對Mali-T860 MP4的測試中,我們的方法在VGG-16上比Arm Compute Library快了1.4倍,在MobileNet上快了2.2倍。這些提升在圖像處理和運算上均有體現。

Mali Midgard GPU

目前,移動領域最常見的3大圖形處理器為高通的Adreno、英國PowerVR和ARM的嵌入式圖形處理器Mali。我們的測試環境是配有Mali-T860 MP4 GPU的開發板Firefly-RK3399,所以下面我們主要關注Mali T8xx的表現。

架構

T860和T880是Mali系列的兩款高端GPU,下圖是具體配置。它們有16個著色器核心(Shader Core),每個核心內包含2—3條運算管道、1條載入/存儲管道和1條紋理管道(即Triple Pipeline架構)。其中運算管道中的ALU(算數邏輯單元)又包含4個128-bit的矢量單元和一個標量單元。

我們用OpenCL編寫程序。當映射到OpenCL模型時,每個著色器核心會執行一個或多個工作組,它們的上限是並行執行384個線程,通常一個工作組對應一個線程。Mali系列GPU使用的是VLIW架構(超長指令集架構),因此每個指令包含多個操作;同時,它也用了SIMD(單指令流多數據流),所以大多數運算運算指令可以同時執行多個數據流。

和NVIDIA GPU的區別

在用TVM優化GPU前,我們先看一看Mali GPU和NVIDIA GPU的區別:

優化:以卷積層為例

卷積層是許多深度神經網路的核心,也佔用了大部分計算資源。所以我們以卷積層為例,談談TVM在pack、tile、unroll、向量化中的優化應用。

im2col+GEMM

im2col是卷積計算的一種常用方法,它會把問題轉換成一個矩陣,然後調用GEMM完成矩陣乘法運算。這種方法的優點是便於和高度優化的BLAS庫結合,缺點是會耗費大量內存。

Spatial Packing

所以我們換了一種方法,先計算卷積,再逐步應用優化技術。以VGG-16中的卷積層為例(如下圖所示),inference的batch size=1。

為了提供一個對照組,我們列出了Arm Compute Library的數據。

pack和tile是兩個調整內存的常見指令。其中tile是把數據劃分成片,使每一片適合共享內存的使用;而pack則是對輸入矩陣重新布局(內存對齊),方便我們按順序讀取數據。

我們在輸入圖像的寬度和filter矩陣的CO維上使用了tile():

用以下命令檢查定義的IR:

選擇卷積的部分:

Kernel 1:綁定線程

在TVM中,我們先計算,再計劃(schedule),這便於分離演算法和實現細節。

如代碼所示,我們簡單把axes坐標軸對應到GPU線程,之後就能在Mali GPU上跑代碼了。

雖然有了這個schedule,我們現在可以運行代碼了,但它的性能要求還是相當可怕。

Kernel 2:unroll

循環展開(loop unrolling)是一個常用的優化方法,它能通過減少循環控制指令降低循環本身的開銷,同時因為能消除分支以及一些管理歸納變數的代碼,它也可以攤銷一些分支開銷,此外,它還能掩蓋讀取內存的延遲。在TVM中,你可以調用實現循環展開。

Kernel 3:向量化(vectorization)

如前所述,為了在Mali GPU上實現最佳性能,我們還要把數字轉成矢量。

如何設置可調參數

上文中涉及的一些可調參數是可以被計算出來的,如向量vc,如果是float32,vc=128/32=4;如果是float16,則是128/16=8。

但由於運行時間過長,很多時候我們會無法確定最佳值。TVM使用的是網格搜索,所以如果用的是python,而不是OpenCL的話,我們也能快速找到最佳值。

端到端的Benchmark

在這一節中,我們比較了一些流行深度神經網路在不同後端上的綜合性能,測試環境是:

我們使用NNVM和TVM進行端到端編譯。

性能

ImageNet上不同後端的inference速度

如上圖所示,我們在ImageNet測試了移動端神經網路的inference速度,發現在Firefly-RK3399上,Mali GPU可以比6核big.LITTLE CPU快2—4倍,我們的端到端編譯速度比Arm Compute Library快了1.4—2.2倍。在Arm Compute Library中,我們比較了用GEMM計算卷積和直接計算卷積,發現前者速度始終更快,所以在圖中只展示了GEMM方法的成果。

上圖中也有一些數據缺失,如第二幅圖不包含Arm Compute Library上的resnet18。這是因為Arm Compute Library的graph runtime目前不支持跳轉連接,並且Neon在上面的實現性能不太好。這也從側面反映了NNVM軟體棧的優勢。

半精度性能

深度神經網路對精度要求不高,尤其是對於計算資源捉襟見肘的移動設備,降低精度可以加快神經網路的inference速度。我們還計算了Mali GPU上的半精度浮點數。

mageNet上FP16的inference速度

從理論上講,FP16既可以實現雙峰計算,又可以將內存消耗減半,從而使速度提高一倍。但是如果涉及較長的向量化和某些參數的微調,它也需要良好的輸入形態。

相關代碼資源

原文地址:tvmlang.org/2018/01/16/opt-mali-gpu.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

馬雲新年新目標,杭州小伙7天花10萬過不起年!天壤之別!

TAG:全球大搜羅 |