內核融合:GPU深度學習的「加速神器」

2021-01-09 DOIT

【按:在深度學習「紅透」半邊天的同時,當前很多深度學習框架卻面臨著共同的性能問題:被頻繁調用的代數運算符嚴重影響模型的執行效率。本文中,微軟亞洲研究院研究員薛繼龍將為大家介紹能夠輕鬆玩轉計算性能的「加速神器」——內核融合,探討內核融合在加速深度學習上的主要方法以及當前面臨的主要挑戰。】

如今,較為常見的深度學習框架(如CNTK、TensorFlow和Caffe2等)都會將一個深度學習的模型抽象成為一個由一些基本運算符(Operator)組成的有向無環的數據流圖(DAG),然後再由下層計算引擎按照某一種拓撲序來依次調度並執行這些節點對應的內核函數,從而完成一個模型的執行。為了能夠支持在不同的硬體上進行計算,一個Operator往往會對應多個內核函數的實現,例如,GPU上的內核函數是由CUDA或者一些GPU的函數庫(如cuDNN、cuBLAS等)提供的操作組合而成。

為了提供較好的靈活性,大多深度學習框架中的Operator都是定義在了代數運算符這個粒度上,例如向量的加、減、乘、除和矩陣乘法等等,一般的計算框架都會有幾百甚至上千個Operator。由於這些運算符的抽象粒度較低,所以一個真實的訓練模型的數據流圖往往會包括數千個節點,這些節點在GPU上的執行就會變成數千次GPU上的內核執行。這些粒度較小的內核函數在提供了靈活性的同時,其頻繁的調用也成為當前影響許多深度學習框架性能的一個重要因素,其帶來的性能開銷主要體現在:數據流圖的調度開銷,GPU內核函數的啟動開銷,以及內核函數之間的數據傳輸開銷。

解決這些性能問題的一個直接方法就是內核融合(Kernel Fusion)。所謂內核融合,就是將一個計算圖中的節點所對應的內核函數融合成一個函數,使得整個數據流圖只需要通過一次函數調用即可完成,從而減小平臺調度和內核啟動帶來的開銷。並且,通過合理地設計不同內核函數的輸入輸出數據的放置(例如使用GPU上的共享內存或寄存器),可以極大地提高數據傳輸效率,從而提升整體計算性能。

為了展示內核融合能夠帶來的好處,我們對比了一個80步長的單樣本LSTM網絡在TensorFlow上的模型推理(inference)時間和我們手工將所有計算融合併優化在同一個內核函數中的計算時間(圖1)。可以看出,在相同的GPU上,融合的內核函數比TensorFlow上基於圖的計算可以快40倍左右。當然,這裡的TensorFlow與手動融合的內核的性能差距除了來源於上述性能開銷外,還包括TensorFlow本身的框架開銷。

LSTM網絡在TensorFlow上的執行時間和手工融合內核的執行時間對比

然而,為每一個計算圖的內核函數進行手工融合併不是一種可以擴展的方法。因此,研究自動化的內核融合成為最近的一個熱點,例如TensorFlow中的XLA項目就是要將給定的計算圖生成硬體設備相關的機器碼,再如NNVM-Fusion是DMLC社區為加速MXNet所提出的相關項目,還有最近比較流行的動態圖計算框架PyTorch也開始逐漸引入內核融合的技術來提升性能。

自動化的內核生成一般包括以下幾個步驟:1. 圖優化。即在進行內核融合之前,首先對計算圖進行分析並應用一系列與硬體無關的優化策略,從而在邏輯上降低運行時的開銷,常見的類似優化策略包括常數摺疊(constant folding)、公共子表達式消除(common subexpression elimination)等;2. 檢測融合子圖。即在給定數據流圖中,找出一些可以被融合的圖節點,這些節點往往是一段連續的子圖。3. 代碼生成。在給定一個融合子圖,為其生成一份內核函數代碼。這裡可以直接生成與硬體相關的代碼,也可以先生成到一個統一的中間表示層(intermediate representation),如LLVM,然而再由相應的編譯器將其編譯到與針對特定硬體的執行代碼,TensorFlow的XLA就採用了後者的方法。4. 圖的修改。即將融合後的內核所對應的Operator替換之前的子圖,並插入原來的數據流圖中。整個流程如圖2所示。

內核融合在數據流圖計算框架中的應用流程

然而,自動化的內核融合併生成高效的內核代碼還存在著許多挑戰,如何解決內核間跨線程的數據同步和如何實現高效的線程模型及任務劃分都是非常重要的問題。

內核間的數據同步

當前,在GPU上的內核融合技術大部分都只支持element-wise的Operator,如PyTorch和NNVM-Fusion。其主要原因是由於CUDA採用的是SIMT(單指令多線程)的編程模型,這使得融合element-wise的操作更加容易。例如,在圖3的示意圖中,如果我們想將y1=x1+x2 和h=sigmoid(y1) 兩個計算表達式進行融合,那只需要讓每個線程都處理輸入向量中的一個元素並且執行相同的表達式h=sigmoid(x1+x2) 即可,在這種情況中,由於融合後的計算邏輯都在相同的一個線程內完成,所以前一個計算輸出的結果可以通過寄存器或共享內存直接傳到下一個計算的輸入中。

GPU上的element-wise內核融合示意圖

然而,如果我們想將兩個矩陣乘法、或更加複雜的計算(如卷積操作)融合在一起,就需要引入數據之間的同步機制,即前一個內核完成的結果需要傳播到下一個內核的部分或全部線程中。這時,若想融合這樣的內核,我們必須有較為靈活的同步機制。然而,在CUDA 8.0之前,CUDA只支持同一個線程塊內的計算同步,其無法滿足融合的需求。Shucai Xiao等人早期提出一種能支持全局跨線程塊的同步機制,但其需要對計算的資源有一定的假設,即要求線程塊個數要小於SM的個數。最近,在Nvidia發布的最新版CUDA 9.0中首次提出了Cooperative Groups的概念,其可以靈活地支持不同粒度上的線程同步,這將會使得在GPU上的更加複雜的內核融合變得容易,也同時為實現更加高效的融合提供了更多空間。

線程模型與任務劃分

內核融合中另一個挑戰是如何優化任務的劃分,從而充分發揮GPU的計算和片上存儲性能。我們知道,執行一個GPU的內核函數,不僅需要指定內核函數的計算算法,還需要指定其調度邏輯,即如何分配線程塊的大小和數量等等。通常,這需要有經驗的程式設計師根據計算算法的特性仔細地設計每一個內核的調度邏輯。然而,在本文介紹的內核融合的場景中,我們需要系統能夠根據當前使用的GPU架構快速、自動化地生成調度邏輯。因此,目前一種研究趨勢是採用來自於MIT的Halide項目的思想,即通過將計算算法和調度邏輯進行抽象並分離,然後採用一些搜索算法來找到較優的調度方案,從而自動生成最終的執行代碼。Halide項目是針對圖像處理所設計的編譯系統。目前,像來自DMLC的TVM項目、以及MIT的Taco項目都採用該思想並針對深度學習庫進行自動化的優化,目前大部分這些項目還都還處在較早期階段。

未經允許不得轉載:DOIT » 內核融合:GPU深度學習的「加速神器」

相關焦點

  • 盤點:GPU加速的神經網絡與JavaScript的交叉
    對於節點的GPU加速,項目使用了TensorFlow的C API。gpu.js雖然筆者常用的是CUDA而不是WebGL,但可以證明GPU編程的耗時性。因此,當筆者遇到gpu.js時,感到非常驚喜。import GPU from 'gpu.js'const gpu = new GPU()const multiplyMatrix = gpu.createKernel(function(a, b) {var sum = 0;
  • 基於RTX2060構建TensorFlow-gpu(keras)學習平臺
    一、conda命令1. onda env list 或 conda info -e 查看當前存在哪些虛擬環境2. conda create --name tf36gpu python=3.6 anaconda3. conda remove -n
  • 亞馬遜加持,英偉達A100 GPU將無人匹敵?
    單個NVIDIA DGX A100系統(帶有8個A100 gpu)在某些AI應用上可以提供與近1000臺雙插槽CPU伺服器相同的性能。 英偉達負責加速計算的副總裁伊恩 巴克(Ian Buck)在公布基準業績後表示:「每個行業都在尋求更好的方式,應用人工智慧來提供新的服務,並擴大業務,我們正處於一個歷史的轉折點。」
  • 自建GPU伺服器:搭建自己的深度學習PC - CIO頻道 - 企業網D1Net...
    搭建自己的GPU伺服器並不困難,這樣做還可以輕鬆地降低在雲中訓練深度學習模型的成本。 很多深度學習的實踐者們渴望在有生之年搭建自己的深度學習機器,擺脫雲的魔掌,這樣的時代就到來了。雲計算是開展深度學習的理想選擇,它往往是訓練大規模深度學習模型的最佳答案。
  • Pieter Abbeel:深度強化學習加速方法
    來源:深度強化學習算法  編輯:元子  【新智元導讀】深度強化學習一直以來都以智能體訓練時間長、計算力需求大、模型收斂慢等而限制很多人去學習,加州大學伯克利分校教授Pieter Abbeel最近發表了深度強化學習的加速方法,解決了一些問題。
  • 兩個提高深度學習訓練效率的絕技
    不同於hadoop和spark等分布式數據處理框架,深度學習訓練因為要涉及參數的前項傳播和反向傳播,有兩種並行方式: 模型並行( model parallelism ):分布式系統中的不同機器(GPU/CPU等)負責網絡模型的不同部分,通常是神經網絡模型的不同網絡層被分配到不同的機器,或者同一層內部的不同參數被分配到不同機器。一般是超大的模型,一張顯卡放不下的情況,如NLP的模型。
  • 基於TensorFlow2.0的中文深度學習開源書來了!GitHub趨勢日榜第一
    近日,一個叫做深度學習開源書的項目在火了。GitHub趨勢日榜排名全球第一,已斬獲2K+星。為什麼這麼火?因為這是一本基於TensorFlow 2.0 正式版的中文深度學習開源書。還包含電子書和配套原始碼。話不多說,一起來看看這本爆款書籍吧!
  • 微軟推出深度學習加速平臺「Project Brainwave」
    近日在 Hot Chips 2017 上,微軟團隊推出了一個新的深度學習加速平臺,其代號為腦波計劃(Project Brainwave),機器之心將簡要介紹該計劃。腦波計劃在深度學習模型雲服務方面實現了性能與靈活性的巨大提升。微軟專為實時人工智慧設計了該系統,它可以超低延遲地處理接收到的請求。
  • 【新書】深度學習圖像識別技術:基於TensorFlow Object Detection API和OpenVINO 工具套件
    序前言 第1章  人工智慧、深度學習與目標檢測1.1  人工智慧簡介    1.1.1  什麼是人工智慧    1.1.2  人工智慧發展簡史    1.1.3  人工智慧與深度學習的關係1.2  深度學習簡介    1.2.1  神經網絡
  • ​NatComm|深度學習加速抗衰老藥物的研發
    深度學習技術是一種極具應用性的解決複雜任務的工具。在深度學習中,卷積神經網絡(CNN)是一類深度神經網絡,提高了圖像分類任務的準確性,並越來越多地在臨床中用作診斷工具。該系統通過預先訓練好的CNN來優化衰老細胞的分類,隨後輸出細胞衰老的概率,即基於形態學的深度學習衰老評分。隨後利用Deep-SeSMo正確的評估常見的抗衰老藥物的效果。
  • 用光速實現深度學習,跟GPU說再見
    如果說GPU養大了深度學習,那麼如今深度學習的胃口早已經超越了GPU。當然,GPU在不斷發展,也出現了TPU、IPU、MLU來滿足這頭巨獸。深度學習對算力的需求沒有止境,但受制於能耗和物理極限,基於矽基的電子元件雖然現在還能支撐,但遠處那堵幾乎不可逾越的高牆已然顯現。
  • 如何將Numpy加速700倍?用 CuPy 呀
    本文介紹了如何利用 CuPy 庫來加速 Numpy 運算速度。就其自身來說,Numpy 的速度已經較 Python 有了很大的提升。當你發現 Python 代碼運行較慢,尤其出現大量的 for-loops 循環時,通常可以將數據處理移入 Numpy 並實現其向量化最高速度處理。但有一點,上述 Numpy 加速只是在 CPU 上實現的。
  • 2020年成國內深度學習框架開源元年 曠視科技開源天元加速AI落地與...
    人工智慧時代,開源作為算法創新與迭代的重要驅動力,在深度學習領域發揮著至關重要的作用。全球諮詢機構IDC《中國深度學習平臺市場份額調研》指出,在AI技術使用方面,接受調研的企業和開發者中,86.2%選擇使用開源的深度學習框架。
  • MIT Taco項目:自動生成張量計算的優化代碼,深度學習加速效果提高...
    相比起現有的非優化軟體包,該系統可實現100倍的加速,其性能與特定稀疏數據操作的精細手工優化代碼相當,但程式設計師的工作要少得多。該系統的名字叫Taco,即「張量代數編譯器」的縮寫。在計算機科學上,類似亞馬遜的表格這樣的數據結構被稱為「矩陣」,張量只是一個矩陣的更高維的模擬。
  • GPU上的隨機森林:比Apache Spark快2000倍
    雖然GPU計算傳統上是為深度學習應用而保留的,但RAPIDS是一個在GPU上執行數據處理和非深度學習ML工作的庫,與在cpu上執行相比,它可以大大提高性能。我們使用3億個實例訓練了一個隨機森林模型:Spark在20個節點CPU集群上耗時37分鐘,而RAPIDS在20個節點GPU集群上耗時1秒。GPU的速度提高了2000倍以上!
  • 能實現比TensorFlow更好的深度學習嗎?
    作者:Max Woolf機器之心編譯參與:Jane W、吳攀Keras 是由 Franois Chollet 維護的深度學習高級開源框架,它的底層基於構建生產級質量的深度學習模型所需的大量設置和矩陣代數。Keras API 的底層基於像 Theano 或谷歌的 TensorFlow 的較低級的深度學習框架。
  • 大型強子對撞機,再加上機器學習算法,能否加速破解暗物質之謎?
    挑戰更多的數據,更強的計算能力這是對機器學習服務如何支持一個已經有大量數據只會變得更大領域有希望的一瞥。研究人員目前正在升級大型強子對撞機,使其能以目前速度的五倍粉碎質子。到2026年,歐洲核子研究中心(CERN)的27千米環形地下機器將產生比現在多20倍的數據。
  • 四大深度學習框架+四類GPU+七種神經網絡:交叉性能評測
    選自add-for作者:Pedro Gusmo機器之心編譯參與:李澤南、黃小天最近,Pedro Gusmo 等人對於英偉達的四種 GPU 在四種不同深度學習框架下的性能進行了評測。本次評測共使用了 7 種用於圖像識別的深度學習模型。第一個評測對比不同 GPU 在不同神經網絡和深度學習框架下的表現。
  • 深度卷積神經網絡CNNs的多GPU並行框架 及其在圖像識別的應用
    Deep CNNs的單機多GPU模型並行和數據並行框架是騰訊深度學習平臺的一部分,騰訊深度學習平臺技術團隊實現了模型並行和數據並行技術加速Deep CNNs訓練,證實模型拆分對減少單GPU上顯存佔用有效,並且在加速比指標上得到顯著收益,同時可以以較快速度訓練更大的深度卷積神經網絡,提升模型準確率。
  • Pytoch1.0深度學習如何玩?送你含900頁ppt和代碼實例
    新智元推薦 來源:專知(ID:Quan_Zhuanzhi)後臺回復「DLPY10」 就可以獲取深度學習課程PPT下載連結~ 深度學習課程概述本課程的目標是提供深度機器學習的完整講解。如何設計一個神經網絡,如何訓練它,以及有哪些現有技術專門處理非常大的網絡結構。本課程旨在教授應用問題的深度學習方法所需的技能。