1、不同的框架與硬件
對於深度學習任務,有很多的深度學習框架可以選擇,Google的Tensor Flow和Facebook的Pytorch,Amazon的Mxnet等。不管是使用哪一個框架進行模型訓練,最終都需要將訓練好的模型部署到實際應用場景中。在模型部署的時候我們會發現我們要部署的設備可能是五花八門的,如果我們要手寫一個用於推理的框架在所有可能部署的設備上都達到良好的性能並且易於使用是一件非常困難的事。如果要把模型部署在指定設備上,一般會采用硬件廠商自己開發的前向推理框架,下面列出了不同的設備對應的前向推理框架:
- Intel CPU/Intel GPU/ -----------------> OpenVINO
- Nvidia GPU/ -----------------> TensorRT
- Arm CPU/Arm GPU/ -----------------> NCNN/MNN
- FPGA/
- NPU(華為海思)/
- BPU(地平線)/
- MLU(寒武紀)/
雖然針對不同的硬件設備我們使用特定的推理框架進行部署是最優的,但這也同時存在問題,比如一個開發者訓練了一個模型需要在多個不同類型的設備上進行部署,那么開發者需要將訓練的模型分別轉換到特定框架可以讀取的格式。
2、編譯器
實際上在編譯器發展的早期也和要將各種深度學習訓練框架的模型部署到各種硬件面臨的情況一下,歷史上出現了非常多的編程語言,比如C/C++/Java等等,然后每一種硬件對應了一門特定的編程語言,再通過特定的編譯器去進行編譯產生機器碼,可以想象隨着硬件和語言的增多,編譯器的維護難度是多么困難。
為了解決上面的問題,科學家為編譯器抽象出了編譯器前端,編譯器中端,編譯器后端等概念,並引入IR (Intermediate Representation)的概率。解釋如下:
- 編譯器前端:接收C/C++/Java等不同語言,進行代碼生成,吐出IR
- 編譯器中端:接收IR,進行不同編譯器后端可以共享的優化,如常量替換,死代碼消除,循環優化等,吐出優化后的IR
- 編譯器后端:接收優化后的IR,進行不同硬件的平台相關優化與硬件指令生成,吐出目標文
以LLVM編譯器為例子:

3、深度學習編譯器
受到編譯器解決方法的啟發,深度學習編譯器被提出,我們可以將各個訓練框架訓練出來的模型看作各種編程語言,然后將這些模型傳入深度學習編譯器之后吐出IR,由於深度學習的IR其實就是計算圖,所以可以直接叫作Graph IR。針對這些Graph IR可以做一些計算圖優化再吐出IR分發給各種硬件使用。這樣,深度學習編譯器的過程就和傳統的編譯器類似,可以解決上面提到的很多繁瑣的問題。

4、TVM
基於上面深度學習編譯器的思想,陳天奇領銜的TVM橫空出世。TVM就是一個基於編譯優化的深度學習推理框架,TVM的架構圖:

從這個圖中我們可以看到,TVM架構的核心部分就是NNVM編譯器(注意一下最新的TVM已經將NNVM升級為了Realy,所以后面提到的Relay也可以看作是NNVM)。NNVM編譯器支持直接接收深度學習框架的模型,如TensorFlow/Pytorch/Caffe/MxNet等,同時也支持一些模型的中間格式如ONNX、CoreML。這些模型被NNVM直接編譯成Graph IR,然后這些Graph IR被再次優化,吐出優化后的Graph IR,最后對於不同的后端這些Graph IR都會被編譯為特定后端可以識別的機器碼完成模型推理。比如對於CPU,NNVM就吐出LLVM可以識別的IR,再通過LLVM編譯器編譯為機器碼到CPU上執行。
