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…

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;是非常有用的。但是如果有时我们只需要一个参数…