資料介紹
作者:安平博,Xilinx高級(jí)工程師;來(lái)源:AI加速微信公眾號(hào)
接著上一章繼續(xù)深入代碼,在BuildRelay中會(huì)調(diào)用Codegen函數(shù)。這個(gè)函數(shù)實(shí)現(xiàn)在src/relay/backend/graph_runtime_codegen.cc中。Codegen實(shí)現(xiàn)了內(nèi)存的分配,IR節(jié)點(diǎn)到TIR節(jié)點(diǎn)的轉(zhuǎn)換,tir圖節(jié)點(diǎn)的一個(gè)調(diào)度優(yōu)化。內(nèi)存分配由函數(shù)relay.backend.GraphPlanMemory來(lái)實(shí)現(xiàn),VisitExpr對(duì)節(jié)點(diǎn)進(jìn)行遍歷并進(jìn)行節(jié)點(diǎn)信息的記錄。LowerExternalfunctions完成ir節(jié)點(diǎn)到tir節(jié)點(diǎn)的轉(zhuǎn)化以及schedule的優(yōu)化。
![](https://file.elecfans.com/web1/M00/DC/1B/pIYBAGAJmYKAeKUpAAOkJNgC9IE642.png)
內(nèi)存分配
通過(guò)GetPackedFunc函數(shù)來(lái)獲得注冊(cè)到global map的內(nèi)存分配函數(shù)GraphPlanMemory。我們看一下文件src/relay/backend/graph_plan_memory.cc中對(duì)內(nèi)存的處理。
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJmcKARl1CAACGZg0dj7U340.png)
在處理內(nèi)存分配中主要使用了StorageAllocaBaseVisitor,StorageAllocaInit,StorageAllocator這三個(gè)類(lèi)。StorageAllocaBaseVisitor是一個(gè)基類(lèi),實(shí)現(xiàn)了對(duì)每個(gè)節(jié)點(diǎn)的訪(fǎng)問(wèn),并分配token,但是token中信息是在派生類(lèi)中處理的。定義了一個(gè)StorageToken的結(jié)構(gòu)體,用于表示申請(qǐng)到內(nèi)存的大小,類(lèi)型等信息。在內(nèi)存處理程序中,主要就是為每個(gè)節(jié)點(diǎn)分配這個(gè)token,同時(shí)定義token的內(nèi)部信息。內(nèi)存分配結(jié)果是一個(gè)節(jié)點(diǎn)和token的映射表。
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJmgGAEqo-AADcglyV-4Y415.png)
StorageAllocator類(lèi)中Plan函數(shù)為:
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJmkGASccNAAKmVvtXPgY414.png)
關(guān)鍵是前兩行代碼,第一行代碼初始化了storageToken,賦予了其設(shè)備類(lèi)型和數(shù)據(jù)類(lèi)型信息。第二行代碼遍歷每個(gè)節(jié)點(diǎn),并且為每個(gè)節(jié)點(diǎn)分配內(nèi)存空間。在內(nèi)存初始化函數(shù)GetInitTokenMap中,首先收集每個(gè)節(jié)點(diǎn)的的設(shè)備信息。調(diào)用鏈為CollectDeviceInfo -> GetDeviceMap(src/relay/transforms/device_annotation.cc)。在構(gòu)建relay圖結(jié)構(gòu)的時(shí)候,每個(gè)節(jié)點(diǎn)是有設(shè)備號(hào)信息的,GetDeviceMap就是按照post-DFS順序獲得節(jié)點(diǎn)的設(shè)備號(hào)信息。當(dāng)然并不是所有節(jié)點(diǎn)都有設(shè)備號(hào)信息,所以還需要根據(jù)節(jié)點(diǎn)之間的關(guān)系來(lái)推斷出設(shè)備號(hào)。比如下圖,add,sqrt,log節(jié)點(diǎn)被標(biāo)注為1,2,3號(hào)設(shè)備,那么可以用兩種方式來(lái)推斷其它節(jié)點(diǎn)設(shè)備號(hào)。
1) 從一個(gè)copy節(jié)點(diǎn)由下而上遍歷一直到遇到下一個(gè)copy,比如可以推斷出add,x,y節(jié)點(diǎn)的設(shè)備號(hào)和copy1一樣;
2) 從最后一個(gè)copy節(jié)點(diǎn)向下遍歷,那么可以推斷出substract,exp設(shè)備號(hào)和copy3一樣。
![](https://file.elecfans.com/web1/M00/DC/1B/pIYBAGAJmpqAIGavAACO4hsCsQ8586.png)
設(shè)備號(hào)獲得后,this->run會(huì)調(diào)用基類(lèi)的run函數(shù),基類(lèi)run函數(shù)會(huì)調(diào)用派生類(lèi)的CreateToken函數(shù)。CreateToken會(huì)申請(qǐng)StorageToken空間并且賦予設(shè)備號(hào)和數(shù)據(jù)類(lèi)型,然后返回一個(gè)token_map_。和節(jié)點(diǎn)遍歷相關(guān)函數(shù)為Run->GetToken->VisitExpr。VisitExpr會(huì)最終調(diào)用StorageAllocaInit類(lèi)中定義的VisitExpr_函數(shù)來(lái)遍歷節(jié)點(diǎn)。
節(jié)點(diǎn)內(nèi)存初始化完成后,回到StorageAllocator類(lèi)中,run會(huì)調(diào)用其定義的CreateToken函數(shù)。
![](https://file.elecfans.com/web1/M00/DC/1B/pIYBAGAJmt6AE8_gAALBr5QvaFI549.png)
分配內(nèi)存空間會(huì)有兩種情況,一種是can_realloc一種是不能can_realloc的。先看不can_realloc的,GetMemorySize是根據(jù)token中記錄的數(shù)據(jù)類(lèi)型和shape信息來(lái)獲得數(shù)據(jù)的大小,Alloc函數(shù)就是為tok分配字節(jié)數(shù)量。現(xiàn)在看can_realloc的情況,Request中首先獲取節(jié)點(diǎn)數(shù)據(jù)的大小。然后從free_中查詢(xún)能夠滿(mǎn)足size的節(jié)點(diǎn),如果有比該節(jié)點(diǎn)size大的就選擇大的空閑區(qū)間分配,如果沒(méi)有大的空間分配,選擇最接近的空間分配。然后最終返回一個(gè)token_map_。
codegen
第一步是對(duì)ir節(jié)點(diǎn)進(jìn)行遍歷,轉(zhuǎn)換成codegen中定義的基礎(chǔ)節(jié)點(diǎn)。我們先看以下codegen中定義的節(jié)點(diǎn)類(lèi)型,GraphNode是基礎(chǔ)節(jié)點(diǎn),GraphInputNode, GraphOpNode繼承自這個(gè)基礎(chǔ)節(jié)點(diǎn)。這些節(jié)點(diǎn)中主要提供了一些節(jié)點(diǎn)屬性,比如name,op類(lèi)型等。還提供了dmlc接口,可以實(shí)現(xiàn)可視化。
遍歷func的parameters,將parameters轉(zhuǎn)換到graph的input節(jié)點(diǎn)。通過(guò)AddNode添加這些input節(jié)點(diǎn),并且將轉(zhuǎn)換后的graphInputNode加入var_map_中,var_map_中是expr到graphNode的映射。
接下來(lái)是節(jié)點(diǎn)遍歷,heads_=VisitExpr(func->body)。節(jié)點(diǎn)遍歷過(guò)程中會(huì)將func中的節(jié)點(diǎn)轉(zhuǎn)換為graphNode。對(duì)于varNode,因?yàn)橐呀?jīng)記錄在var_map_中,直接返回引用。ConstantNode會(huì)轉(zhuǎn)換為GraphInputNode,tuppleNode會(huì)返回每個(gè)字段的graphNode。在遍歷節(jié)點(diǎn)過(guò)程中,會(huì)將graphNode都添加到nodes_中。
重點(diǎn)看一下對(duì)CallNode的處理,只支持op是functionNode類(lèi)型的。
![](https://file.elecfans.com/web1/M00/DC/1B/pIYBAGAJmx6AF101AAGj_ZQNbQ8072.png)
Function生成時(shí),走兩個(gè)分支,一個(gè)是外部codegen,一個(gè)是通用分支。對(duì)應(yīng)外部function codegen的處理為:
![](https://file.elecfans.com/web1/M00/DC/1B/pIYBAGAJm2CAfy9BAANCOTr1_2U471.png)
首先創(chuàng)建一個(gè)CCacheKey類(lèi)型作為_(kāi)CompileEngineLower函數(shù)的參數(shù)傳入。具體CcacheKey有什么作用,以后再深入研究吧。_CompileEngineLower的實(shí)現(xiàn)在文件src/relay/backend/compile_engine.cc中。調(diào)用鏈為L(zhǎng)ower -> LowerInternal(key)->cached_func。定義了一個(gè)cache_node并封裝成cached_func返回。這塊具體的操作并不是很理解,可能還需要熟悉cachedFuncNode的作用。
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJm7yAUjp_AAKzrtE_tdQ078.png)
然后通過(guò)GraphAddCallNode將其加入nodes_中。在GraphAddCallNode中還會(huì)對(duì)op->args進(jìn)行深入遍歷。
內(nèi)部func處理如下:
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJm_uALky3AAGAfeWt9Xs683.png)
也是通過(guò)相同的pf0和pf1函數(shù)。CcacheKey的創(chuàng)建過(guò)程一樣,但是在lowerInternal中不一樣。
![](https://file.elecfans.com/web1/M00/DB/9C/o4YBAGAJnD6ATZm6AAStQTbokG4194.png)
首先創(chuàng)建了一個(gè)schedule,schedule的具體實(shí)現(xiàn)很復(fù)雜目前還不夠理解。
如果是copy節(jié)點(diǎn),那么不進(jìn)行l(wèi)ower處理,直接返回CachedFunc封裝。不是copy節(jié)點(diǎn),如果我們?cè)趐ython中自己定義了lower函數(shù)就調(diào)用python中的,如果沒(méi)有就會(huì)調(diào)用TVM中的lower函數(shù)。Lower函數(shù)在src/driver/driver_api.cc文件中。在這里調(diào)用了很多tir的passes來(lái)進(jìn)行一個(gè)節(jié)點(diǎn)轉(zhuǎn)換。這塊后邊再詳細(xì)看。
- 使用TVM在android中進(jìn)行Mobilenet SSD部署
- 機(jī)器學(xué)習(xí)必學(xué)的Python代碼示例集 14次下載
- 基于LSTM網(wǎng)絡(luò)的在線(xiàn)學(xué)習(xí)課程推薦模型 6次下載
- 基于成對(duì)學(xué)習(xí)和圖像聚類(lèi)的肺癌亞型識(shí)別 4次下載
- 基于預(yù)訓(xùn)練模型和長(zhǎng)短期記憶網(wǎng)絡(luò)的深度學(xué)習(xí)模型 19次下載
- 3小時(shí)學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)課件下載 0次下載
- 在線(xiàn)學(xué)習(xí)的交互網(wǎng)絡(luò)模型和質(zhì)量評(píng)價(jià)方法 11次下載
- 深度模型中的優(yōu)化與學(xué)習(xí)課件下載 3次下載
- TVM學(xué)習(xí)(五)schedule
- TVM學(xué)習(xí)(二):算符融合
- TVM學(xué)習(xí)(三)編譯流程
- python機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的學(xué)習(xí)書(shū)籍資料免費(fèi)下載 95次下載
- GB7000燈具安裝標(biāo)準(zhǔn)學(xué)習(xí) 3次下載
- PSIM仿真入門(mén)學(xué)習(xí)-課件下載 188次下載
- PADS Layout四層板設(shè)置學(xué)習(xí)教材 0次下載
- SemiDrive X9 AI 開(kāi)發(fā)環(huán)境搭建 421次閱讀
- TVM編譯器的整體架構(gòu)和基本方法 2506次閱讀
- 編譯器中的圖論算法是什么 889次閱讀
- TVM學(xué)習(xí)之從relay到TOPI 1562次閱讀
- 遷移學(xué)習(xí)Finetune的四種類(lèi)型招式 3215次閱讀
- 中國(guó)四大運(yùn)營(yíng)商在2G-5G頻段劃分范圍詳細(xì)數(shù)據(jù) 2.9w次閱讀
- 通過(guò)Python就能讀懂機(jī)器學(xué)習(xí) 2611次閱讀
- 值得研究的四大機(jī)器學(xué)習(xí)策略分析 1692次閱讀
- 淺析四類(lèi)機(jī)器學(xué)習(xí)在自動(dòng)駕駛中的應(yīng)用 5607次閱讀
- 淺論學(xué)習(xí)深度學(xué)習(xí)的四個(gè)步驟 1.2w次閱讀
- 學(xué)習(xí)PLC,不僅僅應(yīng)該只學(xué)習(xí)軟件,還需要學(xué)習(xí)硬件 6537次閱讀
- 初學(xué)機(jī)器學(xué)習(xí)的四種方法介紹 2839次閱讀
- 談?wù)?b class="flag-6" style="color: red">四個(gè)無(wú)法從學(xué)校或各種線(xiàn)上平臺(tái)學(xué)習(xí)到的機(jī)器學(xué)習(xí)技巧 4040次閱讀
- 根據(jù)學(xué)習(xí)經(jīng)驗(yàn)以及教學(xué)經(jīng)驗(yàn)總結(jié)出學(xué)習(xí)單片機(jī)的4個(gè)步驟 3977次閱讀
- 將TVM用于移動(dòng)端常見(jiàn)的ARM GPU,提高移動(dòng)設(shè)備對(duì)深度學(xué)習(xí)的支持能力 1w次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1491次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 95次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
- 4.28 MB | 18次下載 | 4 積分
- 5開(kāi)關(guān)電源原理及各功能電路詳解
- 0.38 MB | 11次下載 | 免費(fèi)
- 6100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 7基于單片機(jī)和 SG3525的程控開(kāi)關(guān)電源設(shè)計(jì)
- 0.23 MB | 4次下載 | 免費(fèi)
- 8基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專(zhuān)業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537793次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評(píng)論