TVM學習(三)編譯流程

2021-10-19 23:04:40 字數 2219 閱讀 2128

vm主要的編譯過程如下圖:

import:將tensorflow,onnx,pytorch等構建的深度學習模型匯入,轉化成tvm的中間層表示ir。

lower:將高層ir表示轉化成低階tir表示。

codegen:記憶體分配和硬體可執行程式生成。

圖匯入

主要**如下:

模型的輸入是乙個字尾為pb的檔案,它是神經網路模型圖的protobuf格式儲存檔案。pb是二進位制形式,pbtxt是文字形式。import_graph_def函式是匯入pb,graph是tensorflow的圖結構。

from_tensorflow是將tensorflow的圖結構轉化成tvm的ir。這個函式在檔案relay/frontend/tensorflow.py中。函式的呼叫關係為:

from_tensorflow -> graphproto.from_tensorflow -> self._get_relay_func。

在get_relay_func中會遍歷每個tensorflow的節點,轉換成tvm的ir表示。重點關注_backtrack_construct函式。

繼續深入和運算元轉化有關的函式呼叫為:_convert_operator -> convert_map。convert_map中對應了可支援tensorflow運算元到tvm運算元的轉換關係。

完成了tensorflow到tvm運算元轉化後,我們就得到了乙個irmodule。我們可以利用tvm的視覺化來列印出轉化後的圖:

main是主函式入口,在tvm中以函式形式反應了tensorflow的圖結構。函式的呼叫關係反應了圖的依賴關係。

編譯

python中主要**位於relay/build_module.py檔案中,呼叫關係為build -> buildmodule -> build。在build中通過字典獲得了c++中的相應函式。

這裡不明白如何通過self.mod[「build」]得到c++中函式的。_buildmodule()是c++中註冊到環境中的乙個函式。在src/relay/backend/http://build_module.cc中,

tvm_register_global是將c++函式註冊到乙個全域性map中。當python載入編譯好的動態庫時,會自動查詢map中靜態註冊的函式,並新增到python模組當中。

真正build操作位於relaybuildmodule類中,在其中有乙個getfunction函式,會通過名字查詢要使用的函式,打包成packedfunc返回,這個函式可能和self.mod[「build」]有關。packedfunc是tvm中提供的python的乙個介面,任何函式都可以封裝成packedfunc,並給python呼叫。更詳細介紹可看:

繼續深入**,build -> buildrelay。這是編譯的主要**。其過程包括optimize,codgen。

optimize就是執行一些優化passes,這些passes包括常數摺疊,算符融合等。之後會呼叫graph_codegen->codegen。codegen中實現了記憶體分配和硬體**生成。

TVM優化原理學習

tvm對於神經網路的優化主要有兩部分,計算圖優化和運算元優化,下面分開說明。計算圖優化 例如運算元融合,常量傳播等。這一步是在ir層面完成,現在tvm是使用relay ir來描述計算圖。優化的過程蘊含在relay.build中,參考 op運算元優化 對於乙個給定的計算問題,該如何對映到後端硬體上呢?...

Linux核心學習編譯流程

一 前言 linux核心學習 1 安裝vmware虛擬機器或者virtualbox,再安裝發行版本linux 2 www.kernel.org,挑選乙個核心版本 3 進行解壓並編譯 4 自己寫一些模組 比如說可以去嘗試解一些官網的bug 如下圖所示 下面我們就可以看到還有很多核心bug未解決的問題還...

Python學習三(程式流程)

二 分支結構 三 迴圈結構 四 流程控制 所有的物件都有乙個布林值,驗證函式 bool false,0,空字元 空列表 list 空元組 tuple 空字典 dict 空集合set 空物件的布林值均為零 money 10000 get int input 請輸入取款金額 if money get m...