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.mzph.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…

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的非叶结点个数…

C语言—sort函数比较大小的快捷使用--algorithm头文件下

sort函数 一般情况下要将一组数从的大到小排序或从小到大排序&#xff0c;要定义一个新的函数排序。 而我们也可以直接使用在函数下的sort函数&#xff0c;只需加上头文件&#xff1a; #include<algorithm> using namespace std;sort格式&#xff1a;sort(首元素地址&…

AI编译器与传统编译器的联系与区别

AI编译器与传统编译器的区别与联系 总结整理自知乎问题 针对神经网络的编译器和传统编译器的区别和联系是什么&#xff1f;。 文中提到的答主的知乎主页&#xff1a;金雪锋、杨军、蓝色、SunnyCase、贝壳与知了、工藤福尔摩 笔者本人理解 为了不用直接手写机器码&#xff0…

python学习1:注释\变量类型\转换函数\转义字符\运算符

python基础学习 与大多数语言不同&#xff0c;python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号 {} 。缩进的空格数是可变的&#xff0c;但是同一个代码块的语句必须包含相同的缩进空格数。 &#xff08;一个tab4个空格&#xff09; Python语言中常见的…

python 学习2 /输入/ 输出 /列表 /字典

python基础学习第二天 输入输出 xinput("输入内容") print(x)input输出&#xff1a; eval :去掉字符串外围的引号&#xff0c;按照python的语法执行内容 aeval(12) print(a)eval输出样式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;删去…

快速排序 C++

快速排序 C 本文图示借鉴自清华大学邓俊辉老师数据结构课程。 快速排序的思想 快速排序是分治思想的典型应用。该排序算法可以原地实现&#xff0c;即空间复杂度为 O(1)O(1)O(1)&#xff0c;而时间复杂度为 O(nlogn)O(nlogn)O(nlogn) 。 算法将待排序的序列 SSS 分为两个子…

llvm与gcc

llvm与gcc llvm 是一个编译器&#xff0c;也是一个编译器架构&#xff0c;是一系列编译工具&#xff0c;也是一个编译器工具链&#xff0c;开源 C11 实现。 gcc 相对于 clang 的优势&#xff1a; gcc 支持更过语言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手区解题 view_source / robots / backup

1**. view_source** 题目描述&#xff1a;X老师让小宁同学查看一个网页的源代码&#xff0c;但小宁同学发现鼠标右键好像不管用了。 f12查看源码即可发现flag 2. robots 题目描述&#xff1a;X老师上课讲了Robots协议&#xff0c;小宁同学却上课打了瞌睡&#xff0c;赶紧来教教…

听GPT 讲Rust源代码--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代码中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目录下&#xff0c;用于实现Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次编译,到处运行是如何实现的

Java一次编译&#xff0c;到处运行是如何实现的 转自&#xff1a;https://cloud.tencent.com/developer/article/1415194 &#xff08;排版微调&#xff09; JAVA编译运行总览 Java是一种高级语言&#xff0c;要让计算机执行你撰写的Java程序&#xff0c;也得通过编译程序的…

攻防世界web新手区解题 /cookie / disabled_button / weak_auth

cookie 题目描述&#xff1a;X老师告诉小宁他在cookie里放了些东西&#xff0c;小宁疑惑地想&#xff1a;‘这是夹心饼干的意思吗&#xff1f;’ 使用burp suite抓包查看 发现提示&#xff1a; look-herecookie.php 于是在url后加上 cookie.php 得到提示查看返回 就得到了f…

基于GET报错的sql注入,sqli-lab 1~4

根据注入类型可将sql注入分为两类&#xff1a;数字型和字符型 例如&#xff1a; 数字型&#xff1a; sleect * from table where if 用户输入id 字符型&#xff1a;select * from table where id 用户输入id &#xff08;有引号) 通过URL中修改对应的D值&#xff0c;为正常数字…

xss原理和注入类型

XSS漏洞原理 : XSS又叫CSS(cross Site Script), 跨站脚本攻击,指的是恶意攻击者往Web页面里插入恶意JS代码,当用户浏览该页时,嵌入其中的Web里的JS代码就会被执行,从而达到恶意的特殊目的. 比如:拿到cooike XSS漏洞分类: 反射性(非存储型) payload没有经过存储,后端接收后,直接…