0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TVM的編譯流程是什么

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2022-02-08 14:51 ? 次閱讀

作者:安平博,Xilinx高級工程師;來源:AI加速微信公眾號

Import:將tensorflow,onnx,pytorch等構(gòu)建的深度學習模型導(dǎo)入,轉(zhuǎn)化成TVM的中間層表示IR。

Lower:將高層IR表示轉(zhuǎn)化成低階TIR表示。

Codegen:內(nèi)存分配和硬件可執(zhí)行程序生成。

圖導(dǎo)入

通過一個tensorflow的reception網(wǎng)絡(luò)來熟悉編譯過程,其它深度學習框架也具有類似過程。從TVM官網(wǎng)可以下載tensorflow的編譯程序

https://tvm.apache.org/docs/tutorials/frontend/from_tensorflow.html#sphx...。主要代碼如下:

pIYBAGAJzXaALCrpAAFWLx2Lb50986.png

模型的輸入是一個后綴為pb的文件,它是神經(jīng)網(wǎng)絡(luò)模型圖的protobuf格式存儲文件。Pb是二進制形式,pbtxt是文本形式。Import_graph_def函數(shù)是導(dǎo)入pb,graph是tensorflow的圖結(jié)構(gòu)。

From_tensorflow是將tensorflow的圖結(jié)構(gòu)轉(zhuǎn)化成TVM的IR。這個函數(shù)在文件relay/frontend/tensorflow.py中。函數(shù)的調(diào)用關(guān)系為:

From_tensorflow -> GraphProto.from_tensorflow -> self._get_relay_func。

在get_relay_func中會遍歷每個tensorflow的節(jié)點,轉(zhuǎn)換成tvm的IR表示。重點關(guān)注_backtrack_construct函數(shù)。

o4YBAGAJzbSAK8pmAAB-23TNiAc840.png

繼續(xù)深入和算子轉(zhuǎn)化有關(guān)的函數(shù)調(diào)用為:_convert_operator -> convert_map。Convert_map中對應(yīng)了可支持tensorflow算子到tvm算子的轉(zhuǎn)換關(guān)系。

o4YBAGAJzf2AUd9qAAFas--JyZk610.png

完成了tensorflow到TVM算子轉(zhuǎn)化后,我們就得到了一個IRModule。我們可以利用tvm的可視化來打印出轉(zhuǎn)化后的圖:

pIYBAGAJzjyAKM_nAADUALHuUtg377.png

Main是主函數(shù)入口,在TVM中以函數(shù)形式反應(yīng)了tensorflow的圖結(jié)構(gòu)。函數(shù)的調(diào)用關(guān)系反應(yīng)了圖的依賴關(guān)系。

編譯

Python中主要代碼位于relay/build_module.py文件中,調(diào)用關(guān)系為build -> BuildModule -> build。在build中通過字典獲得了C++中的相應(yīng)函數(shù)。

pIYBAGAJznqAYLYUAABvCn74q78151.png

這里不明白如何通過self.mod[“build”]得到C++中函數(shù)的。_BuildModule()是C++中注冊到環(huán)境中的一個函數(shù)。在src/relay/backend/build_module.cc中,

pIYBAGAJzriAKFTzAACbMqgRaW0007.png

TVM_REGISTER_GLOBAL是將C++函數(shù)注冊到一個全局map中。當python加載編譯好的動態(tài)庫時,會自動查詢map中靜態(tài)注冊的函數(shù),并添加到python模塊當中。

真正build操作位于RelayBuildModule類中,在其中有一個GetFunction函數(shù),會通過名字查詢要使用的函數(shù),打包成PackedFunc返回,這個函數(shù)可能和self.mod[“build”]有關(guān)。PackedFunc是TVM中提供的python的一個接口,任何函數(shù)都可以封裝成PackedFunc,并給python調(diào)用。更詳細介紹可看:https://hjchen2.github.io/2020/01/10/TVM-PackedFunc%E5%AE%9E%E7%8E%B0%E6...

繼續(xù)深入代碼,Build -> BuildRelay。這是編譯的主要代碼。其過程包括optimize,codgen。

o4YBAGAJzvmAY7f2AAE5GDTVjbI659.png

Optimize就是執(zhí)行一些優(yōu)化passes,這些passes包括常數(shù)折疊,算符融合等。之后會調(diào)用graph_codegen->Codegen。Codegen中實現(xiàn)了內(nèi)存分配和硬件代碼生成。

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • TVM
    TVM
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    3642
收藏 人收藏

    評論

    相關(guān)推薦

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結(jié)構(gòu),但它并不總是能完美地還原原始源代碼。反編譯工具通常會
    的頭像 發(fā)表于 09-02 11:03 ?204次閱讀

    java反編譯的代碼可以修改么

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回源代碼的過程。反編譯后的代碼可以進行修改,但是需要注意,反編譯代碼的質(zhì)量和可讀性可能會受到原始
    的頭像 發(fā)表于 09-02 11:00 ?175次閱讀

    SemiDrive X9 AI 開發(fā)環(huán)境搭建

    SemiDrivex9AI開發(fā)環(huán)境搭建分開發(fā)機端,開發(fā)板端。主要的工具是SDNN,它是一個基于開源編譯器框架TVM的端到端的AI編譯器框架,Semidrive對TVM
    的頭像 發(fā)表于 08-03 08:27 ?193次閱讀
    SemiDrive X9 AI 開發(fā)環(huán)境搭建

    AI編譯器技術(shù)剖析

    隨著人工智能技術(shù)的飛速發(fā)展,AI編譯器作為一種新興的編譯技術(shù)逐漸進入人們的視野。AI編譯器不僅具備傳統(tǒng)編譯器的功能,如將高級語言編寫的源代碼轉(zhuǎn)換為機器可執(zhí)行的代碼,還融入了人工智能技術(shù)
    的頭像 發(fā)表于 07-17 18:28 ?1211次閱讀

    使用TVM量化部署模型報錯NameError: name \'GenerateESPConstants\' is not defined如何解決?

    各位好,我在使用TVM部署模型時,遇到一下錯誤,請問如何解決?我進esp.py文件看,有如下兩個函數(shù)是找不到定義的: GenerateESPConstants(), ExtractConstantsFromPartitionedFunction(),
    發(fā)表于 06-28 10:50

    多文件工程的編譯

    多文件工程的編譯
    的頭像 發(fā)表于 06-26 13:35 ?158次閱讀
    多文件工程的<b class='flag-5'>編譯</b>

    鴻蒙ArkUI-X框架開發(fā):【編譯

    使用build.sh編譯腳本進行編譯,編譯腳本常用選項
    的頭像 發(fā)表于 05-25 16:42 ?1711次閱讀
    鴻蒙ArkUI-X框架開發(fā):【<b class='flag-5'>編譯</b>】

    Android編譯優(yōu)化之混淆配置

    為了使用java8及后續(xù)java新版本的特性,Google增加了一步編譯過程—脫糖(desugaring),但這一步會導(dǎo)致更長的編譯時間,這也是為什么Google會推出D8和R8編譯器來優(yōu)化
    的頭像 發(fā)表于 12-21 09:21 ?1646次閱讀
    Android<b class='flag-5'>編譯</b>優(yōu)化之混淆配置

    TVM編譯器的整體架構(gòu)和基本方法

    。但是這其中也去思考了一下基于FPGA加速器的編譯器架構(gòu)。在FPGA深度學習加速器中,編譯器除了需要自動化生成指令外,還要優(yōu)化指令的結(jié)構(gòu),來最大化加速器性能。TVM是一個支持GPU、CPU、FPGA指令
    的頭像 發(fā)表于 11-30 09:36 ?1863次閱讀
    <b class='flag-5'>TVM</b><b class='flag-5'>編譯</b>器的整體架構(gòu)和基本方法

    為什么C語言要進行編譯

    為什么我們編寫的C語言要進行編譯?什么是編譯?編譯時發(fā)生了什么? 機器無法理解我們編寫的C語言,而編譯就是將面向人類的高級語言轉(zhuǎn)換成為面向機器的機器語言的過程,圖1是GCC
    的頭像 發(fā)表于 11-24 15:47 ?955次閱讀
    為什么C語言要進行<b class='flag-5'>編譯</b>

    C程序的完整編譯過程

    本文討論了C程序的完整編譯過程,分別講述了預(yù)處理、編譯、匯編、鏈接各階段完成的編譯任務(wù)。然后通過一個編譯實例,探討了各階段輸出的文件。
    的頭像 發(fā)表于 11-15 17:14 ?1899次閱讀
    C程序的完整<b class='flag-5'>編譯</b>過程

    Linux內(nèi)核編譯腳本

    獲得編譯命令及選項 編譯linux時,默認不會顯示編譯的命令,如果你要獲得編譯命令及其選項,可以在make命令后面加上宏定義: make V= 1 如果希望
    的頭像 發(fā)表于 09-27 11:52 ?541次閱讀

    Linux交叉編譯選項與源碼與目標文件分離

    交叉編譯選項 編譯Linux,通常只需要運行 make menuconfig 配置要編譯的模塊,然后運行 make 。Linux默認是做本地編譯,也就是
    的頭像 發(fā)表于 09-27 11:48 ?656次閱讀

    節(jié)省編譯時間的解決方法

    影響編譯時間的因素有很多,包括工具流程、工具設(shè)置選項、RTL 設(shè)計、約束編輯、目標器件以及設(shè)計實現(xiàn)期間各工具所面臨的任何關(guān)鍵問題。除此之外,所使用的機器及其負載也是關(guān)鍵因素。在這篇博客中,我們只探討
    的頭像 發(fā)表于 09-27 09:52 ?563次閱讀
    節(jié)省<b class='flag-5'>編譯</b>時間的解決方法

    mlc-llm對大模型推理的流程及優(yōu)化方案

    比如RWKV和給定的device信息一起編譯TVM中的runtime.Module(在linux上編譯的產(chǎn)物就是.so文件)提供mlc-llm的c++推理接口調(diào)用 。
    發(fā)表于 09-26 12:25 ?733次閱讀
    mlc-llm對大模型推理的<b class='flag-5'>流程</b>及優(yōu)化方案