目錄html
深度學習引擎前端
高效的Inference框架git
TensorFlow,PyTorchgithub
TensorFlow等這樣的框架孱弱,Intel的OpenVINO,ARM的ARM NN,NV的TensorRT編程
曾經出現了不少種編程語言,有不少種硬件,歷史上最開始也是一種語言對應一種硬件,從而形成編譯器的維護困難與爆炸後端
抽象出編譯器前端,編譯器中端,編譯器後端等概念,引入IR (Intermediate Representation)架構
相似這樣的架構:框架
更詳盡,更漂亮的一張圖:機器學習
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,有明顯的分層
HLO IR相比TVM IR最大的區別是:
eg作深度學習推理引擎很適合作編譯器、體系結構、HPC的人
NVPTX
nvcc
halide語言的
阿里最近開源的推理框架MNN
Gemfield
傳統編譯器 | 深度學習編譯器 | |
---|---|---|
優化需求 | 傳統編譯器注重於優化寄存器使用和指令集匹配,其優化每每偏向於局部 | 深度學習編譯器的優化每每須要涉及到全局的改寫,包括以前提到的內存,算子融合等。目前深度學習框架的圖優化或者高層優化(HLO)部分和傳統編譯的pass比較匹配,這些優化也會逐漸被標準的pass所替代。可是在高層還會有開放的問題,即高層的抽象如何能夠作到容易分析又有足夠的表達能力。TVM的Relay,XLA和Glow是三個在這個方向上的例子 |
自動代碼生成 | 傳統編譯器的目標是生成比較優化的通用代碼 | 深度學習編譯器的目標是生成接近手寫或者更加高效的特定代碼(卷積,矩陣乘法等) |
解決的問題 |