深度學習引擎

深度學習引擎前端

本文目的

高效的Inference框架git

主流框架的問題

Training

TensorFlow,PyTorchgithub

Inference

已有框架

TensorFlow等這樣的框架孱弱,Intel的OpenVINO,ARM的ARM NN,NV的TensorRT編程

爲何複雜,以及問題

  • 設備可能會是多種多樣的,如Intel CPU / Intel GPU / ARM CPU / ARM GPU / NV GPU / FPGA / AI芯片
  • 各大設備廠商的框架並不具有通用性,好比對訓練框架模型產生的算子支持不全
  • 在一個設備廠商的Inference框架能跑,可是不必定在另一個設備廠商的Inference框架上能跑
  • 若是換了硬件,沒有統一的使用體驗,算子支持也不同,性能還不必定是最好的

歷史相似問題

曾經出現了不少種編程語言,有不少種硬件,歷史上最開始也是一種語言對應一種硬件,從而形成編譯器的維護困難與爆炸後端

解決方案:

抽象出編譯器前端,編譯器中端,編譯器後端等概念,引入IR (Intermediate Representation)架構

  • 編譯器前端:接收C / C++ / Fortran等不一樣語言,進行代碼生成,吐出IR
  • 編譯器中端:接收IR,進行不一樣編譯器後端能夠共享的優化,如常量替換,死代碼消除,循環優化等,吐出優化後的IR
  • 編譯器後端:接收優化後的IR,進行不一樣硬件的平臺相關優化與硬件指令生成,吐出目標文件

相似這樣的架構:框架

img

深度學習解決方案

  • 引入一個新的編譯器,負責把這些編程語言識別,吐出IR,稱爲Graph IR
  • TVM (https://tvm.ai/).

img

更詳盡,更漂亮的一張圖:機器學習

img

TVM

特色

  • 基於編譯優化思想的深度學習推理框架的完美體現
  • AutoTVM(https://arxiv.org/pdf/1805.08166.pdf)機制
  • [ARM][Performance] Improve ARM CPU depthwise convolution performance by FrozenGene · Pull Request #2345 · dmlc/tvm 將深度卷積的性能提升近2倍
  • 最厲害的是具備很是強的適應性
  • 採用了全棧編譯器方法
  • 結合了代碼生成和自動程序優化功能,以生成可與通過大量手動優化的庫相媲美的內核
  • 在包括ARM CPU,Intel CPU,Mali GPU,NVIIDA GPU和AMD GPU在內的硬件平臺上得到了最新的推理性能
  • 容許手工提供微內核(micro kernel)用於優化4x4外積等
  • 採用自動優化的辦法優化內存排布和loop
  • 用戶能夠經過構造特定的搜索空間模版來加入人工信息

競爭對手

TVM的IR

偏算子端的IR

Program -> Stmt Program | Null 

Stmt -> RealizeStmt |
        ProduceStmt | 
        ForStmt | 
        AttrStmt  | 
        IfThenElseStmt | 
        ProvideStmt | 
        LetStmt
        Expr 

Realize -> realize TensorVar(RangeVar) {Program}
ProduceStmt -> produce TensorVar {Program}
ForStmt -> for (IterVar, Expr, Expr) {Program} 
AttrStmt -> TensorVar Attribute {Program} 
IfThenElseStmt -> if (Expr) then {Program} | 
                  if (Expr) then {Program} else {Program} 
ProvideStmt -> TensorVar(Params)=Expr 
LetStmt -> let ScalarVar=Expr {Program} 

Expr -> Const | 
        TensorVar | 
        ScalarVar | 
        IterVar | 
        RangeVar |
        Binary | 
        Unary | 
        Call

偏計算圖端的部分

是Relay(NNVM的後繼),編程語言

Relay部分提供了DAG和A-Normal兩種類型表達計算圖的方式,

其中A-Normal是lambda表達式計算續體傳遞風格(CPS)的一種管理性源碼規約,分別供偏好於深度學習和計算語言的人員使用,二者是基本等價的。

能夠看到,TVM對於圖部分的IR和算子部分的IR,有明顯的分層

XLA的IR

  • 爲HLO IR,HLO爲High Level Optimizer的縮寫.這一層的IR主要描述的是設備無關優化,
  • 而設備相關優化會藉助LLVM後端來完成

HLO IR相比TVM IR最大的區別是:

  • HLO IR中既表示DAG,又表示加減乘除這些細節的運算,以及相關的輔助功能,好比layout相關的reshape。
  • TVM IR的分層標準是計算圖和算子,而HLO IR的分層標準是設備無關和設備相關

eg代碼優化

eg作深度學習推理引擎很適合作編譯器、體系結構、HPC的人

Q:

NVPTX

nvcc

halide語言的

阿里最近開源的推理框架MNN

CuDNNTensorRT

PlaidML

Gemfield

深度學習編譯和傳統編譯的技術路線差異

傳統編譯器 深度學習編譯器
優化需求 傳統編譯器注重於優化寄存器使用和指令集匹配,其優化每每偏向於局部 深度學習編譯器的優化每每須要涉及到全局的改寫,包括以前提到的內存,算子融合等。目前深度學習框架的圖優化或者高層優化(HLO)部分和傳統編譯的pass比較匹配,這些優化也會逐漸被標準的pass所替代。可是在高層還會有開放的問題,即高層的抽象如何能夠作到容易分析又有足夠的表達能力。TVM的Relay,XLA和Glow是三個在這個方向上的例子
自動代碼生成 傳統編譯器的目標是生成比較優化的通用代碼 深度學習編譯器的目標是生成接近手寫或者更加高效的特定代碼(卷積,矩陣乘法等)
解決的問題

方法

  • 整數集分析和Polyhedral Model:核心思想是採用整數集來表示循環迭代的範圍,利用整數集之間的關係來表示迭代變量之間的依賴,從而達到程序分析變換的目的
  • 如何設計搜索空間:通常來講,這一搜索空間的定義須要大量吸取人工優化經驗而且加以融入。具體的空間包括循環重排,映射部分計算到實際的加速器指令(張量化,tensorzation),流水線優化等。通常很難肯定一個完整的解答
  • 用機器學習優化機器學習:採用機器學習來自動優化算子。有興趣的同窗能夠看 AutoTVM:讓AI來編譯優化AI系統底層算子

ref:

相關文章
相關標籤/搜索