<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深度課堂:全角度解讀神經(jīng)網(wǎng)絡(luò)編譯器

          共 4849字,需瀏覽 10分鐘

           ·

          2021-03-08 23:11

          一、神經(jīng)網(wǎng)絡(luò)編譯器概覽

          近年來,以機器學(xué)習(xí)、深度學(xué)習(xí)為核心的AI技術(shù)得到迅猛發(fā)展,深度神經(jīng)網(wǎng)絡(luò)在各行各業(yè)得到廣泛應(yīng)用: 

          1.  CV(計算機視覺):目標檢測,場景識別,圖像分割等。 
          2.  智慧語音:語音識別,聲紋識別等。 
          3.  NLP(自然語言處理):自動搜索引擎,對話服務(wù)機器人,文本分類,智能翻譯等。 
          4.  科學(xué)研究:應(yīng)用于物理、生物、醫(yī)學(xué)等多研究領(lǐng)域。高能粒子對撞分類,宇宙天體圖數(shù)據(jù)分析,星系形狀建模,生物結(jié)構(gòu)的蛋白質(zhì)折疊預(yù)測,精準醫(yī)療與疾病預(yù)測。


           
          這些應(yīng)用催生更多的新模型出現(xiàn):CNN, RNN, LSTM, GAN, GNN,也催生著如Tensorflow, Pytorch, Mxnet, Caffe等深度學(xué)習(xí)框架出現(xiàn)。目前訓(xùn)練框架開始收斂,逐步形成了PyTorch引領(lǐng)學(xué)術(shù)界,TensorFlow主導(dǎo)工業(yè)界的一個雙雄局面。 

          但是,深度學(xué)習(xí)算法要實現(xiàn)落地應(yīng)用,必須被部署到硬件上,例如Google的TPU、華為麒麟NPU,各種AI專用芯片,F(xiàn)PGA等。  


          這些各訓(xùn)練框架訓(xùn)練出來的模型要如何部署到不同的終端硬件呢,這就需要深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)編譯器來解決。  
           
          在介紹神經(jīng)網(wǎng)絡(luò)編譯器之前,我們先簡單回顧下傳統(tǒng)編譯器。  

          傳統(tǒng)編譯器:

          熟悉C語言編譯流程的應(yīng)該了解,編譯器其實就是一堆工具鏈的組合,輸入是高級編程語言,輸出是目標硬件的機器碼。一般編譯器的流程可以分為三個部分:解析高級語言,編譯優(yōu)化,生成目標代碼。

          LLVM(low level virtual machine)是一個開源的編譯器基礎(chǔ)設(shè)施項目,通過模塊分為前端,中端(優(yōu)化)和后端三部分。LLVM提出了LLVM的中間表示LLVM IR。每當出現(xiàn)新的編程語言,只需要開發(fā)相應(yīng)的前端,將編程語言轉(zhuǎn)換成LLVM的中間表示;類似地,出現(xiàn)新的硬件架構(gòu),只需要開發(fā)相應(yīng)的后端,對接上LLVM的中間表示。模塊化的劃分,避免了因編程語言和CPU架構(gòu)的翻新而引發(fā)的編譯器適配性問題,大大簡化了編譯器的開發(fā)工作。


          神經(jīng)網(wǎng)絡(luò)編譯器:

          前面我們提到,神經(jīng)網(wǎng)絡(luò)編譯器的出現(xiàn)是為了把深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型部署到終端設(shè)備上,簡單來說,就是讓神經(jīng)網(wǎng)絡(luò)模型在設(shè)備上能跑起來,而且跑得快,能滿足應(yīng)用需求。如果是針對這個目標,傳統(tǒng)編譯器也可以滿足模型在硬件上的部署需求,為什么要提出神經(jīng)網(wǎng)絡(luò)編譯器呢?神經(jīng)網(wǎng)絡(luò)編譯器和傳統(tǒng)編譯器的區(qū)別和聯(lián)系是什么呢?

          • 編譯器的輸入/輸出:

          傳統(tǒng)編譯器的輸入是高級編程語言,輸出是目標硬件的機器碼。神經(jīng)網(wǎng)絡(luò)編譯器的輸入是深度學(xué)習(xí)訓(xùn)練框架訓(xùn)練出來的模型定義文件,輸出是能夠在不同硬件高效執(zhí)行的代碼。

          • 編譯器的IR:

          傳統(tǒng)編譯器的IR是前端對接不同的編程語言,后端對接不同硬件,屬于low level IR。神經(jīng)網(wǎng)絡(luò)編譯器需要專門對神經(jīng)網(wǎng)絡(luò)進行優(yōu)化,前端適配各種訓(xùn)練框架訓(xùn)練出來的神經(jīng)網(wǎng)絡(luò)模型,后端適配各種硬件,因此需要High level IR(計算圖層級)以及算子層級/張量計算層級(operator/tensor)的IR,算子層級需要實現(xiàn)算子在目標硬件上高效執(zhí)行。下圖展示是神經(jīng)網(wǎng)絡(luò)編譯器的層級結(jié)構(gòu):


          1. 前端對接各個深度學(xué)習(xí)訓(xùn)練框架訓(xùn)練出來的算法模型(Tensorflow, Caffe, Pytorch, Mxnet等)。 
          2. 圖層級(High-level IR):神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)可以表示成計算圖,圖層級的操作則是對計算圖進行一些和具體硬件和框架無關(guān)的操作,比如算子融合,內(nèi)存分配優(yōu)化,數(shù)據(jù)類型和數(shù)據(jù)維度的推導(dǎo)等。我們可通過算子融合的方式,避免中間數(shù)據(jù)頻繁的在寄存器和內(nèi)存直接來回讀寫,從而提升整體推理性能。
          3.  算子層級(operator level/kernel level)算子層級主要是張量計算。為了實現(xiàn)這些計算在硬件上高效實現(xiàn),發(fā)揮芯片的性能,通常硬件芯片配有專門優(yōu)化的算子計算庫,如Intel的MKL, Nvidia的CuDNN, TensorRT。這個層級需要支持每個硬件后端的每個算子實現(xiàn)。 
          4.  各硬件后端:GPU, ARM CPU, X86 CPU, NPU等。 

          總的來說,傳統(tǒng)編譯器是面向編程語言寫的任意程序在目標硬件的優(yōu)化,神經(jīng)網(wǎng)絡(luò)編譯器是專門面向神經(jīng)網(wǎng)絡(luò)在目標硬件的高速部署。目前神經(jīng)網(wǎng)絡(luò)編譯器處在一個發(fā)展中的階段,早期圖層級和算子層級都是手工去實現(xiàn),手工實現(xiàn)算子融合,專家手工寫神經(jīng)網(wǎng)絡(luò)算子在目標硬件的優(yōu)化計算庫等,后期慢慢朝著自動優(yōu)化方向發(fā)展。下文將介紹幾個相關(guān)的開源項目:TVM,Halide,AutoKernel。

          二、TVM的前世今生

          在編譯器快速發(fā)展的浪潮中,較為突出的便是TVM(Tensor Virtual Machine)。 TVM最早提出是2017年,是深度學(xué)習(xí)系統(tǒng)的編譯器堆棧。 

          第一代TVM的設(shè)計借鑒了借鑒傳統(tǒng)編譯器框架LLVM的設(shè)計思路,設(shè)計抽象出中間表示層,不同的模型只需要開發(fā)相應(yīng)的前端接口,不同的后端只需要開發(fā)相應(yīng)的后端接口。 

          TVM全稱為Tensor Virtual Machine,屬于算子層級,主要用于張量計算,提供獨立于硬件的底層計算中間表示,采用各種方式(循環(huán)分塊,緩存優(yōu)化等)對相應(yīng)的計算進行優(yōu)化。第一代的圖層級表示叫NNVM(Neural Network Virtual Machine)。NNVM的設(shè)計目標是:將來自深度學(xué)習(xí)框架的計算圖轉(zhuǎn)換為統(tǒng)一的計算圖中間表示(IR),對之進行優(yōu)化。 

          第一代的靜態(tài)圖存在一定的缺陷:
            
          1. 不能較好支持控制流,如分支跳轉(zhuǎn),循環(huán)等。 
          2.  不能支持計算圖輸入形狀,取決于輸入tensor大小的模型,比如word2vec等。 

          雖然Tensorflow有如tf.cond.Tf.while_loop的控制接口來在某種程度上解決第一個問題,tf.fold來解決第二個問題,但是這種方式對剛剛接觸深度學(xué)習(xí)框架的小白來說不是特別友好。 

          后面出現(xiàn)的動態(tài)圖摒棄了傳統(tǒng)的計算圖先定義,后執(zhí)行的方式,采用了計算圖在運行時定義的模式,這種計算圖就稱為動態(tài)圖。  

          第二代TVM 的圖計算層變?yōu)镽elay VM,Relay和第一代的圖計算表示NNVM的最主要區(qū)別是Relay IR除了支持dataflow(靜態(tài)圖), 能夠更好地解決control flow(動態(tài)圖)。它不僅是一種計算圖的中間表示,也支持自動微分。


          總結(jié)一下,目前TVM的架構(gòu)是: 

          1. 最高層級支持主流的深度學(xué)習(xí)前端框架,包括TensorFlow,MXNet,Pytorch等。 
          2.  Relay IR支持可微分,該層級進行圖融合,數(shù)據(jù)重排等圖優(yōu)化操作。 
          3.  基于tensor張量化計算圖,并根據(jù)后端進行硬件原語級優(yōu)化,autoTVM根據(jù)優(yōu)化目標探索搜索空間,找到最優(yōu)解。 
          4.  后端支持ARM、CUDA/Metal/OpenCL、加速器VTA(Versatile Tensor Accelerator)。

          三、Halide  

          Halide于2012年提出,主要用于自動優(yōu)化。其嵌入到C++中,是MIT研究人員專門為圖像處理設(shè)計的一種程序語言。Halide語言易于編寫,語法簡單,數(shù)據(jù)結(jié)構(gòu)清晰,能過自動對代碼進行優(yōu)化,使得程序獲得比較好的執(zhí)行效率。 

          它設(shè)計的核心思想是把算法和調(diào)度分離。這樣做的好處是,在給定算法的情況下只需要去調(diào)整它的Schedule 調(diào)度選擇,不用重寫算法實現(xiàn)不同的Schedule。當調(diào)整Schedule、探索設(shè)計空間時也不會擔(dān)心因為重寫算法而導(dǎo)致計算的正確性會發(fā)生變化。

          Halide于2012年提出,主要用于自動優(yōu)化。其嵌入到C++中,是MIT研究人員專門為圖像處理設(shè)計的一種程序語言。Halide語言易于編寫,語法簡單,數(shù)據(jù)結(jié)構(gòu)清晰,能過自動對代碼進行優(yōu)化,使得程序獲得比較好的執(zhí)行效率。

          它設(shè)計的核心思想是把算法和調(diào)度分離。這樣做的好處是,在給定算法的情況下只需要去調(diào)整它的Schedule 調(diào)度選擇,不用重寫算法實現(xiàn)不同的Schedule。當調(diào)整Schedule、探索設(shè)計空間時也不會擔(dān)心因為重寫算法而導(dǎo)致計算的正確性會發(fā)生變化。

          Algorithm部分主要是算法描述和計算的數(shù)學(xué)表達式。Schedule部分則是告訴機器什么時候分配內(nèi)存,如何計算(分塊計算還是順序計算)——目前已經(jīng)提供了一些調(diào)度策略。  


          不同調(diào)度策略考慮重復(fù)冗余計算和局部性(locality)的權(quán)衡。

          四、AutoKernel  

          深度學(xué)習(xí)模型能否成功在終端落地應(yīng)用,滿足產(chǎn)品需求,一個關(guān)鍵的指標就是神經(jīng)網(wǎng)絡(luò)模型的推理性能。  

          目前的高性能算子計算庫主要是由高性能計算優(yōu)化工程師進行手工開發(fā)。然而新的算法/硬件的不斷涌現(xiàn),導(dǎo)致了算子層級的優(yōu)化開發(fā)工作量巨大。同時優(yōu)化代碼的工作并不是一件簡單的事,它要求工程師既要精通計算機體系架構(gòu),又要熟悉算子的計算流程。 

          人才少,需求多,技術(shù)門檻高,因此我們認為算子優(yōu)化自動化是未來的大趨勢。而提出AutoKernel的初衷便是希望能把這個過程自動化,從小處入手,在算子層級的優(yōu)化,實現(xiàn)優(yōu)化代碼的自動生成。  


          AutoKernel的輸入是算子的計算描述(如Conv、Poll、Fc),輸出是經(jīng)過優(yōu)化的加速源碼。 

          這一工具的開發(fā)旨在降低優(yōu)化工作的門檻,不需要有底層匯編的知識門檻,不用手寫優(yōu)化匯編??赏ㄟ^直接調(diào)用開發(fā)的工具包便可生成匯編代碼。同時還提供了包含CPU、GPU的docker環(huán)境,無需部署開發(fā)環(huán)境,只需使用docker便可。還可通過提供的插件——plugin,可以把自動生成的算子一鍵集成到推理框架中——Tengine。


          對應(yīng)地,算子層級的AutoKernel則主要分為三個模塊:
            
          1. Op Generator:算子生成器,采用了開源的Hallide。 
          2.  AutoSearch:目前還在開發(fā)中,目標是通過機器學(xué)習(xí)、強化學(xué)習(xí)常用算法自動搜索出優(yōu)化策略。 
          3.  AutoKernel Plugin:把生成的自動算子以插件的形式插入到Tengine中,和人工定制互為補充。


          Tengine對象層對接了不同的神經(jīng)網(wǎng)絡(luò)模型,圖層級的NNIR包含了模型解析、圖層優(yōu)化,算子層級則包括高性能計算庫(HCL lib)。 

          AutoKernel Plugin主要分為生成和部署兩部分,生成部分用Hallid填寫算法描述和調(diào)度策略,執(zhí)行時指定后端類型(基本覆蓋目前的主流后端)。 

          部署部分則封裝為Tengine的庫,直接調(diào)用。  


          相信隨著更多開發(fā)者的加入,AutoKernel社區(qū)會有更大的突破與成長,在未來的深度學(xué)習(xí)編譯器領(lǐng)域中,留下濃重的一筆!



          掃碼添加OPEN AI LAB小助手

          咨詢產(chǎn)品/技術(shù)問題&加入技術(shù)交流群

          TengineGitHub開源鏈接

          https://github.com/OAID/Tengine

          歡迎大家Star、Watch、Fork三部曲



          往期· 看點

          瀏覽 80
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美艳麻麻诱子乱小说 | 欧美成人在线支援 | 天天摸天天添 | 色噜噜在线国产 | AAAAAAA级片 |