吴忠躺衫网络科技有限公司

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

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

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

TVM的編譯流程是什么

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

作者:安平博,Xilinx高級(jí)工程師;來(lái)源:AI加速微信公眾號(hào)

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

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

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

圖導(dǎo)入

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

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

pIYBAGAJzXaALCrpAAFWLx2Lb50986.png

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

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

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

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

o4YBAGAJzbSAK8pmAAB-23TNiAc840.png

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

o4YBAGAJzf2AUd9qAAFas--JyZk610.png

完成了tensorflow到TVM算子轉(zhuǎn)化后,我們就得到了一個(gè)IRModule。我們可以利用tvm的可視化來(lái)打印出轉(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中通過(guò)字典獲得了C++中的相應(yīng)函數(shù)。

pIYBAGAJznqAYLYUAABvCn74q78151.png

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

pIYBAGAJzriAKFTzAACbMqgRaW0007.png

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

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

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

o4YBAGAJzvmAY7f2AAE5GDTVjbI659.png

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

審核編輯:何安

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

    關(guān)注

    0

    文章

    19

    瀏覽量

    3689
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Triton編譯器的優(yōu)化技巧

    在現(xiàn)代計(jì)算環(huán)境中,編譯器的性能對(duì)于軟件的運(yùn)行效率至關(guān)重要。Triton 編譯器作為一個(gè)先進(jìn)的編譯器框架,提供了一系列的優(yōu)化技術(shù),以確保生成的代碼既高效又適應(yīng)不同的硬件架構(gòu)。 1. 指令選擇
    的頭像 發(fā)表于 12-25 09:09 ?340次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現(xiàn)在以下幾個(gè)方面: 一、定位與目標(biāo) Triton編譯器 : 定位:專注于深度學(xué)習(xí)中最核心、最耗時(shí)的張量運(yùn)算的優(yōu)化。 目標(biāo):提供一個(gè)高度抽象、靈活、高效
    的頭像 發(fā)表于 12-24 17:25 ?484次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個(gè)開(kāi)源的編譯器前端,它支持多種編程語(yǔ)言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個(gè)可擴(kuò)展和可定制的編譯器框架,允許開(kāi)發(fā)者添加新的編程語(yǔ)言特性和優(yōu)化技術(shù)
    的頭像 發(fā)表于 12-24 17:23 ?647次閱讀

    soc開(kāi)發(fā)流程常見(jiàn)問(wèn)題及解決方案

    SOC(System on a Chip,系統(tǒng)級(jí)芯片)開(kāi)發(fā)流程中常見(jiàn)問(wèn)題及解決方案主要包括以下幾個(gè)方面: 一、環(huán)境問(wèn)題 常見(jiàn)問(wèn)題 : 開(kāi)發(fā)環(huán)境配置復(fù)雜,新手難以快速上手。 依賴項(xiàng)缺失或版本不兼容
    的頭像 發(fā)表于 11-10 09:26 ?745次閱讀

    瑞芯微RK3568開(kāi)發(fā)板Linux編譯報(bào)錯(cuò)404怎么辦?觸覺(jué)智能教你輕松解決

    本文介紹瑞芯微RK3568主板/開(kāi)發(fā)板SDK編譯流程編譯報(bào)錯(cuò)404的解決方法,使用觸覺(jué)智能EVB3568鴻蒙開(kāi)發(fā)板演示,具有豐富的視頻輸入輸出接口(HDMI/eDP/MIPI/LVDS) 與多種高速接口(千兆網(wǎng)口/PCIe/S
    的頭像 發(fā)表于 11-05 11:02 ?444次閱讀
    瑞芯微RK3568開(kāi)發(fā)板Linux<b class='flag-5'>編譯</b>報(bào)錯(cuò)404怎么辦?觸覺(jué)智能教你輕松解決

    java反編譯能拿到源碼嗎

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

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

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

    linux開(kāi)發(fā)板如何編譯curl

    在Linux開(kāi)發(fā)板上編譯 curl 庫(kù)通常涉及到幾個(gè)步驟,包括準(zhǔn)備開(kāi)發(fā)環(huán)境、下載源代碼、配置編譯選項(xiàng)以及執(zhí)行編譯和安裝過(guò)程。以下是一個(gè)基本的指南,幫助你在Linux開(kāi)發(fā)板上編譯 cur
    的頭像 發(fā)表于 08-30 15:33 ?790次閱讀

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

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

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

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

    使用TVM量化部署模型報(bào)錯(cuò)NameError: name \'GenerateESPConstants\' is not defined如何解決?

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

    多文件工程的編譯

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

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

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

    HighTec Tricore編譯速度優(yōu)化策略探討

    HighTec在編譯時(shí)默認(rèn)是根據(jù)工程源文件文件架構(gòu)首先生成makefile文件,然后執(zhí)行“make makefile”指令來(lái)編譯工程。
    的頭像 發(fā)表于 04-10 12:44 ?2367次閱讀
    HighTec Tricore<b class='flag-5'>編譯</b>速度優(yōu)化策略探討

    OpenHarmony 移植:build lite 編譯構(gòu)建過(guò)程

    配置完畢產(chǎn)品解決方案、芯片開(kāi)發(fā)板解決方案,就可以執(zhí)行 hb build 進(jìn)行編譯。但是產(chǎn)品解決方案代碼是如何被調(diào)用編譯的? 芯片開(kāi)發(fā)板解決方案代碼是如何被調(diào)用編譯的??jī)?nèi)核代碼如何被調(diào)用編譯
    的頭像 發(fā)表于 02-19 16:19 ?1012次閱讀
    百家乐秘籍下注法| 高档百家乐官网桌子| 百家乐官网博娱乐赌百家乐官网的玩法技巧和规则 | 澳门百家乐娱乐城打不开| 一博娱乐| 百家乐博之道娱乐城| 百家乐官网技巧发布| 百家乐平投注法| 百家乐官网澳门百家乐官网| 新乐园百家乐娱乐城| 百家乐官网庄闲必胜规| bet365充值| 宝龙百家乐娱乐城| 百家乐官网怎样发牌| 金榜百家乐的玩法技巧和规则| 大发888手机版客户端| 百家乐手机软件| 百家乐官网的关键技巧| 威尼斯人娱乐场 送2688元礼金领取lrm64| 百家乐官网赌场娱乐网规则 | 百家乐官网最佳下注方法| 喜来登百家乐的玩法技巧和规则| 澳门玩百家乐官网的玩法技巧和规则| 澳门网上网址| 百家乐孖宝揽| 同花顺百家乐官网的玩法技巧和规则 | 百家乐试玩平台| 百家乐官网大小是什么| 大发888网页打不开| 澳门百家乐代理| 百家乐官网巴黎| 德州扑克怎么玩| BB百家乐大转轮| 百家乐官网娱乐网真钱游戏| 峨边| 吕百家乐赢钱律| 属龙人与属虎人做生意| 百家乐官网视频下载地址| 大发888卡| 百家乐小路单图解| 百家乐官网赌场|