TVM:簡介

TVM:簡介概述

Apache TVM 是一個用于 CPU、GPU 和機器學習加速器的開源機器學習編譯器框架。它旨在使機器學習工程師能夠在任何硬件后端上高效地優化和運行計算。本教程的目的是通過定義和演示關鍵概念,引導您了解 TVM 的所有主要功能。新用戶應該能夠從頭到尾完成本教程的工作,并能夠操作 TVM 進行自動模型優化,同時對 TVM 架構及其工作原理有基本的了解。

內容

  1. 介紹
  2. 安裝 TVM
  3. 使用命令行界面編譯和優化模型
  4. 使用 Python 接口編譯和優化模型
  5. 使用張量表達式使用運算符
  6. 使用模板和 AutoTVM 優化 Operator
  7. 使用無模板的 AutoScheduler 優化 Operator
  8. 交叉編譯和遠程過程調用 (RPC)
  9. 為 GPU 編譯深度學習模型

TVM 和模型優化概述

下圖說明了一個模型在使用 TVM 優化編譯器框架進行轉換時所采取的步驟。

在這里插入圖片描述

  1. TensorflowPytorchOnnx等框架導入模型。導入器(importer)層是 TVM 可以從其他框架(如 Tensorflow、PyTorch 或 ONNX)中攝取模型的地方。隨著我們不斷改進開源項目,TVM 為每個前端提供的支持水平各不相同。如果在將模型導入 TVM 時遇到問題,可以嘗試先將其轉換為 ONNX。

  2. 轉換為Relay,Relay 是TVM 的高層模型語言。已導入 TVM 的模型由 Relay 來表示。Relay 是一種用于神經網絡的函數式語言和中間表示 (IR)。它支持:

    • 傳統的數據流樣式表示
    • functional-style scoping,let-binding,這使的它成為功能齊全的可微分語言
    • 允許用戶混合兩種編程風格

    Relay 進行圖(graph)級別的優化傳遞來優化模型。

  3. 更低層的 張量表達式 (TE,tensor expression) 表示。降級(lowing)是指將較高層的表示轉換為較低層的表示。經過高層(high-level)優化后,Relay 通過 FuseOps pass 將模型劃分為許多小子圖,并將子圖降級為 TE 表示。張量表達式 (TE) 是一種用于描述張量計算的特定領域語言。TE 還提供了多個schedule 原語來指定低級循環優化,例如平鋪 (tiling)、矢量化 (vectorization)、并行化 (parallelization)、展開 (unrolling) 和融合 (fusion) 。為了幫助將 Relay 表示轉換為 TE 表示的過程,TVM 還包括一個Tensor Operator Inventory (TOPI),它具有常見張量算子(例如,二維卷積 (conv2d)、轉置 (transpose) )的預定義模板。

  4. 使用自動調整模塊 AutoTVMAutoScheduler 搜索最佳的 schedule。schedule 為 TE 中定義的算子或子圖指定低層循環優化。Auto-tuning 搜索最佳 schedule,并將其與成本模型和端側測度進行比較。TVM 中有兩個 Auto-tuning 模塊。

    • AutoTVM:基于模板(template-based)的 auto-tuning 模塊。它通過某種搜索算法在用戶定義的模板中找到可調節參數的最佳值。對于常見的算子,TOPI中已經提供了他們的模板。
    • AutoScheduler(又名 Ansor):一個無模板(template-free)的 auto tuning 模塊。它不需要預定義的 schedule 模板。而是通過分析計算的定義來自動生成搜索空間。然后在生成的搜索空間中搜索最佳 schedule。
  5. 選擇模型編譯的最佳配置。調優后,auto-tuning 模塊生成JSON格式的調優記錄。此步驟為每個子圖選擇最佳 schedule。

  6. 更低層的 Tensor Intermediate Representation (TIR),它是 TVM 的低層中間表示。根據 tuning 一步選擇最佳配置后,每個 TE 子圖被降級到 TIR 并進行低層優化。接下來,優化過的 TIR 被降級到硬件平臺的目標編譯器。這是生成可部署到生產中的優化模型的最終代碼生成階段。TVM 支持多種不同的編譯器后端,包括:

    • LLVM,可以針對任意微處理器架構,包括標準 x86 和 ARM 處理器、AMDGPU 和 NVPTX 代碼生成,以及 LLVM 支持的任何其他平臺。
    • 專用編譯器,例如NVIDIA 的編譯器 NVCC。
    • 嵌入式和專用 target,通過 TVM 的BYOC(Bring Your Own Codegen)框架實現。
  7. 編譯成機器碼。在最后,針對特定編譯器的生成代碼可以降低為機器碼。

    TVM 可以將模型編譯為可鏈接的對象模塊,然后可以由輕量級 TVM Runtime 運行,該 Runtime 提供 C API 來動態加載模型,以及其他語言(如 Python 和 Rust)的入口點。TVM 還可以將 Runtime 與單個包中的模型相結合,從而構建捆綁(bundled)部署。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532674.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2.3.3單鏈表的雙向鏈表

2.3.3雙向鏈表 插入、刪除 指在前驅和后驅方向都能游歷(遍歷)的線性鏈表 雙向鏈表的每個結點有兩個指針域 【結構】:prior data next 雙鏈表通常采用帶頭結點的循環鏈表形式 可理解為首位相接的數據“圈”,每個結點都可以向前…

nvidia-smi 命令詳解

nvidia-smi 命令詳解 簡介 nvidia-smi - NVIDIA System Management Interface program nvidia smi(也稱為NVSMI)為來自 Fermi 和更高體系結構系列的 nvidia Tesla、Quadro、GRID 和 GeForce 設備提供監控和管理功能。GeForce Titan系列設備支持大多數…

2.4一元多項式的表示及相加,含cpp算法

2.4一元多項式的表示及相加 n階多項式的表示: n階多項式有n1項 指數按升冪排序 【 優點: 多項式的項數可以動態增長,不存在存儲溢出的問題插入,刪除方便,不移動元素 【表示: 有兩個數據域,一…

TVM:使用Tensor Expression (TE)來處理算子

TVM:使用Tensor Expression (TE)來處理算子 在本教程中,我們將聚焦于在 TVM 中使用張量表達式(TE)來定義張量計算和實現循環優化。TE用純函數語言描述張量計算(即每個表達式都沒有副作用)。當在 TVM 的整體…

4-數據結構-串的學習

4.1串類型的定義 1.串:(或字符串) 串是由多個字符組成的有限序列,記作:S‘c1c2c3…cn’ (n>0) 其中S是串的名字,‘c1c2c3…cn’ 是串值 ci是串中字符 n是串的長度,表示字符的數目 空串&a…

Linux下rm誤刪恢復 extundelete

Linux下rm誤刪恢復 extundelete 誤刪之后要第一時間卸載(umount)該分區,或者以只讀的方式來掛載(mount)該分區,否則覆寫了誰也沒辦法恢復。如果誤刪除的是根分區,最好直接斷電,進入…

5-數據結構-數組的學習

5.1數組的定義 定義: 由一組類型相同的數據元素構成的有序集合,每個數據元素稱為一個數據元素(簡稱元素),每個元素受n(n>1)個線性關系的約束,每個元素在n個線性關系中的序號i1、…

timm 視覺庫中的 create_model 函數詳解

timm 視覺庫中的 create_model 函數詳解 最近一年 Vision Transformer 及其相關改進的工作層出不窮,在他們開源的代碼中,大部分都用到了這樣一個庫:timm。各位煉丹師應該已經想必已經對其無比熟悉了,本文將介紹其中最關鍵的函數之…

C--數據結構--樹的學習

6.2.1二叉樹的性質 1.二叉樹 性質: 1.若二叉樹的層次從1開始,則在二叉樹的第i層最多有2^(i-1)個結點 2.深度為k的二叉樹最多有2^k -1個結點 (k>1) 3.對任何一顆二叉樹,如果其葉結點個數為n0,度為2的非葉結點個數…

TVM:使用 Schedule 模板和 AutoTVM 來優化算子

TVM:使用 Schedule 模板和 AutoTVM 來優化算子 在本文中,我們將介紹如何使用 TVM 張量表達式(Tensor Expression,TE)語言編寫 Schedule 模板,AutoTVM 可以搜索通過這些模板找到最佳 Schedule。這個過程稱為…

TVM:使用 Auto-scheduling 來優化算子

TVM:使用 Auto-scheduling 來優化算子 在本教程中,我們將展示 TVM 的 Auto-scheduling 功能如何在無需編寫自定義模板的情況下找到最佳 schedule。 與基于模板的 AutoTVM 依賴手動模板定義搜索空間不同,auto-scheduler 不需要任何模板。 用…

C語言—sort函數比較大小的快捷使用--algorithm頭文件下

sort函數 一般情況下要將一組數從的大到小排序或從小到大排序&#xff0c;要定義一個新的函數排序。 而我們也可以直接使用在函數下的sort函數&#xff0c;只需加上頭文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

散列的使用

散列 散列簡單來說&#xff1a;給N個正整數和M個負整數&#xff0c;問這M個數中的每個數是否在N中出現過。 比如&#xff1a;N&#xff1a;{1,2,3,4}&#xff0c;M{2,5,7}&#xff0c;其中M的2在N中出現過 對這個問題最直觀的思路是&#xff1a;對M中每個欲查的值x&#xff0…

關于C++中的unordered_map和unordered_set不能直接以pair作為鍵名的問題

關于C中的unordered_map和unordered_set不能直接以pair作為鍵名的問題 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于紅黑樹實現的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希實現的&#xff0c;在不要求容器內的鍵有序&#xff0c…

AI編譯器與傳統編譯器的聯系與區別

AI編譯器與傳統編譯器的區別與聯系 總結整理自知乎問題 針對神經網絡的編譯器和傳統編譯器的區別和聯系是什么&#xff1f;。 文中提到的答主的知乎主頁&#xff1a;金雪鋒、楊軍、藍色、SunnyCase、貝殼與知了、工藤福爾摩 筆者本人理解 為了不用直接手寫機器碼&#xff0…

python學習1:注釋\變量類型\轉換函數\轉義字符\運算符

python基礎學習 與大多數語言不同&#xff0c;python最具特色的就是使用縮進來表示代碼塊&#xff0c;不需要使用大括號 {} 。縮進的空格數是可變的&#xff0c;但是同一個代碼塊的語句必須包含相同的縮進空格數。 &#xff08;一個tab4個空格&#xff09; Python語言中常見的…

Python、C++ lambda 表達式

Python、C lambda 表達式 lambda函數簡介 匿名函數lambda&#xff1a;是指一類無需定義標識符&#xff08;函數名&#xff09;的函數或子程序。所謂匿名函數&#xff0c;通俗地說就是沒有名字的函數&#xff0c;lambda函數沒有名字&#xff0c;是一種簡單的、在同一行中定義函…

python 學習2 /輸入/ 輸出 /列表 /字典

python基礎學習第二天 輸入輸出 xinput("輸入內容") print(x)input輸出&#xff1a; eval :去掉字符串外圍的引號&#xff0c;按照python的語法執行內容 aeval(12) print(a)eval輸出樣式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;刪去…

Linux、Mac 命令行快捷鍵

Linux、Mac 命令行快捷鍵 Linux 命令行編輯快捷鍵&#xff0c;參考了好多個&#xff0c;應該算是比較全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;筆者本人比較常用的也已經紅色標出來了&#xff0c;如有錯誤或遺漏&#xff0c;歡迎留言指出。 光標移動及編輯&#xff…

Python 命令行傳參

Python 命令行傳參 說到 python 命令行傳參&#xff0c;可能大部分人的第一反應就是用 argparse。的確&#xff0c;argparse 在我們需要指定多個預設的參數&#xff08;如深度學習中指定模型的超參數等&#xff09;時&#xff0c;是非常有用的。但是如果有時我們只需要一個參數…