看了下最新的TVM,已經到了0.8版本,整個TVM軟件stack也發生了比較大的變化,准備追一下進行介紹。整體節奏大概是先做一篇Introduction,之后會翻譯一些tutorial,后邊會結合一些真實的Op進行。
整個TVM的結構現在已經變成了
從前到后可以分為這么幾個部分(參考了其他博客的一些內容):
1. 輸入是從TensorFlow、PyTorch、ONNX等框架導入的模型。
2. 轉換為Relay:Relay是TVM自有的高級模型語言,它既支持傳統的數據流表示風格,在使用了let-binding方式以后,也支持了類似於函數式編程作用域的風格;同時,在Relay層TVM會對模型進行高層的圖級優化
3. 下降到TE(Tensor Expression)Relay經過高層優化后,會進行算子融合並將模型被划分為子圖,最終轉換成TE來表示這些子圖;TE是一種專門用於描述張量計算的領域專用語言,它指定了一些調度原語來指定低級的循環優化,如平鋪,向量化、並行化、循環展開等;為了幫助將Relay轉換為TE的過程,TVM提供了TOPI(一種預定義的模板來提供公共tensor op)
4. 自動調優模塊,包括AutoTVM和AutoScheduler 。TE之后會被傳到自動調優模塊進行算子調優;自動調優模塊會針對給定的TE,使用算法生成不同調度配置,並基於給定代價模型和特定硬件后端進行評估;自動調優模塊分為以下兩種:
a) AutoTVM:基於模板的自動調優模塊,針對用戶指定的模板及相應搜索空間進行搜索和調優;
b) AutoScheduler:無需模板的自動調優模塊,會針對給定計算自動生成所需模板及搜索空間;
5. 選擇最優的配置。自動調優模塊生成JSON格式的記錄
6. 下降到Tensor Intermediate Representation (TIR),這一層是TVM的低級中間表示,一般提供包括LLVM IR在內的多種結構,多編譯器和多個特定的硬件表示
7. 使用目標編譯器進行編譯:優化后的TIR會被轉換並下發到目標硬件對應的編譯器,如LLVM、NVCC等,進行編譯並生成最終可執行的機器碼;