yhwang-hub
还是什么也不写吧
展开
-
【从零开始学深度学习编译器】六,TVM的编译流程详解
TVM的编译流程详解一. 前言二. TVM编译流程详解三,总结四,参考一. 前言上一篇文章对TVM Relay和Pass进行了介绍,但还没有介绍整体的编译流程。这一篇文章将继续介绍一下TVM的编译流程,即TVM是如何将深度学习框架的模型转换成Relay IR之后进一步编译和优化为硬件可以执行的IR,再将这个底层IR和运行时库以及模型参数打包为一个tvm.Module返回。关于为什么要将底层IR和运行时库以及模型参数打包,根据官方文档可以知道这样是为了可以更方便的保存底层IR和运行时库,做到一次编译,可持转载 2021-07-05 22:49:26 · 1262 阅读 · 0 评论 -
【从零开始学深度学习编译器】五,TVM Relay以及Pass简介
TVM Relay以及Pass简介0x0. 介绍0x2. Relay介绍0x2.1 使用Relay建立一个计算图0x0. 介绍在前面几节的介绍中我们了解到了TVM是如何将ONNX前端模型转换为IR Module的,并且还剖析了TVM中的Relay算子和TOPI算子的扭转过程,知道了Relay算子的最终计算也是基于TOPI算子集合完成的。然后我们在基于ONNX模型结构了解TVM的前端那篇文章贴出的示例程序中还有一个很重要的细节即TVM的编译流程没有详细介绍,即下面这几行代码:##############转载 2021-05-31 19:09:11 · 1214 阅读 · 1 评论 -
【从零开始学深度学习编译器】四,解析TVM算子
解析TVM算子0x0. 回顾0x1. Relay 卷积算子的扭转过程【GiantPandaCV导语】这篇文章主要是基于Relay 卷积算子和TOPI Resize算子来梳理了一下TVM的算子扭转和实现的具体过程,在这个过程中也了解到了对于不同的后端,TVM提供了各种scheduler来帮助模型加速。0x0. 回顾上篇文章详细的梳理了TVM的ONNX前端,我们知道了TVM是如何加载ONNX模型并将ONNX的算子转换为Relay表达式的。这篇文章我们将以卷积算子为例,来看一下Relay 表达式是如何转换为转载 2021-05-07 22:32:10 · 623 阅读 · 0 评论 -
TVM使用张量表达式与运算符一起使用
在本教程中,我们将注意力转向TVM如何与Tensor Expressions(TE)一起使用,以创建一个空间来搜索性能配置。TE用纯函数语言描述张量计算(也就是说,每个表达式都没有副作用)。从整个TVM的角度来看,Relay将计算描述为一组运算符,并且这些运算符中的每一个都可以表示为一个TE表达式,其中每个TE表达式都采用输入张量并产生输出张量。重要的是要注意,张量不一定是完全物化的数组,而是表示计算的形式。如果要从TE生成计算,则需要使用TVM的调度功能。这是TVM中Tensor表达语言的入门教程。TV原创 2021-05-02 10:48:30 · 321 阅读 · 0 评论 -
TVM和模型优化概述
TVM和模型优化概述从Tensorflow,Pytorch或Onnx之类的框架中导入模型。TVM可以在导入器层中从其他框架(例如ONNX,Tensorflow或PyTorch)提取模型。随着我们不断改进开源项目,TVM为每个前端提供的支持水平各不相同。如果将模型导入TVM时遇到问题,则可能需要尝试将其转换为ONNX。转换为TVM的高级模型语言Relay。在Relay中表示已导入TVM的模型。中继是神经网络的一种功能语言和中间表示(IR)。它支持:传统的数据流样式表示函数式作用域,让绑定,使其成为功原创 2021-04-28 23:10:31 · 657 阅读 · 0 评论 -
TVM扫描和循环内核
这里写自定义目录标题这是有关如何在TVM中进行循环计算的入门资料。递归计算是神经网络中的一种典型模式。from __future__ import absolute_import,print_functionimport tvmimport tvm.testingfrom tvm import teimport numpy as npTVM支持使用扫描运算符来描述符号循环。以下扫描运算将计算X列上的总和。扫描在张量的最大维度上进行。 s_state是一个占位符,描述了扫描的过渡状态。 s原创 2021-04-28 19:49:55 · 192 阅读 · 0 评论 -
TVM内在函数和数学函数
内在函数和数学函数直接声明外部数学调用统一内联函数调用内部Lowering规则添加自己的Intrinsic总结TVM支持基本的算术运算。在许多情况下,通常我们将需要更复杂的内置函数。例如exp取函数的指数。这些功能取决于目标系统,并且可能具有不同目标平台的不同名称。在本教程中,我们将学习如何调用这些目标特定的函数,以及如何通过tvm的固有API统一接口。from __future__ import absolute_import,print_functionimport numpy as npim原创 2021-04-28 10:42:21 · 212 阅读 · 0 评论 -
TVM的Tensor数据结构解读
TVM的Tensor数据结构解读InputTensors 函数这篇文章主要是解读下TVM中的tvm::te::Tensor以及相关类型的数据结构。下面给出了TensorNode以及相关数据的类结构示意图。可以看到TensorNode中含有op, value_index, shape, dtype等数据成员。op的类型是Operation,Operation有InputTensors的成员函数返回Tensor,有output(int i) 成员函数也返回Tensor,可知Operatoin的输入输出都是转载 2021-04-27 11:10:57 · 768 阅读 · 0 评论 -
TVM中的调度原语
TVM中的调度原语SplitTVM是用于有效内核构建的领域特定语言。在本教程中,我们将向您展示如何通过TVM提供的各种原语调度计算。from __future__ import absolute_import,print_functionimport tvmfrom tvm import teimport numpy as np通常存在几种方法来计算相同的结果,但是,不同的方法将导致不同的位置和性能。因此TVM要求用户提供如何执行称为Schedule的计算。A调度是一组计算的变换,其变换所原创 2021-04-27 09:17:32 · 314 阅读 · 1 评论 -
TVM编译MXNet模型
编译MXNet模型从Gluon Model Zoo下载Resnet18模型编译图在TVM上执行可移植图形使用具有预训练权重的MXNet符号本文是介绍如何使用Relay部署mxnet模型的入门教程。首先,需要安装mxnet模块。一个快速的解决方案是pip install mxnet --user或请参阅官方安装指南。 https://mxnet.apache.org/versions/master/install/index.htmlimport mxnet as mximport tvmi原创 2021-04-26 10:57:03 · 199 阅读 · 0 评论 -
TVM在Cuda上部署量化模型
在Cuda上部署量化模型本文是使用TVM进行自动量化的入门教程。自动量化是TVM中的一种量化模式。有关TVM中量化过程的更多详细信息,请参见 此处。在本教程中,我们将在ImageNet上导入GluonCV预训练模型以进行中继,量化中继模型,然后执行推理。...原创 2021-04-25 23:43:42 · 779 阅读 · 0 评论 -
TVM使用TVM部署框架预定义的模型
TVM使用TVM部署框架预定义的模型imports部署量化的PyTorch模型来自Torchvision的负载量化就绪,预训练的Mobilenet v2模型量化,跟踪和运行PyTorch Mobilenet v2模型使用PyTorch前端将量化的Mobilenet v2转换为Relay-QNN编译并运行Relay模块比较输出标签评估表现笔记笔记这是关于将通过深度学习框架量化的模型加载到TVM中的教程。预量化的模型导入是我们在TVM中提供的量化支持之一。有关TVM中量化过程的更多详细信息,请参见 此处。在原创 2021-04-24 18:27:36 · 231 阅读 · 0 评论 -
TVM在DarkNet模型中编译YOLO-V2和YOLO-V3
在DarkNet模型中编译YOLO-V2和YOLO-V3本文是使用TVM部署Darknet模型的入门教程。所有必需的模型和库都将通过脚本从Internet下载。该脚本运行带有边界框的YOLO-V2和YOLO-V3模型。Darknet解析与CFFI和CV2库有依赖性。请在执行此脚本之前安装CFFI和CV2pip install cffipip install opencv-python# numpy and matplotlibimport numpy as npimport matplotli原创 2021-04-23 23:35:23 · 423 阅读 · 3 评论 -
TVM编译ONNX模型
编译ONNX模型本文是介绍如何使用Relay部署ONNX模型的入门教程。首先,必须安装ONNX软件包。一个快速的解决方案是安装protobuf编译器,然后pip install onnx --user或请参考官方网站。 https://github.com/onnx/onnximport onnximport numpy as npimport tvmfrom tvm import teimport tvm.relay as relayfrom tvm.contrib.downloa原创 2021-04-23 15:48:48 · 518 阅读 · 1 评论 -
TVM编译Tensorflow模型
编译Tensorflow模型本文是使用TVM部署Tensorflow模型的入门教程。首先,需要安装tensorflow python模块。请参考https://www.tensorflow.org/install# tvm,relayimport tvmfrom tvm import relayfrom tvm import te#os and numpyimport numpy as npimport os.path# Tensorflow importsimport tens原创 2021-04-23 10:32:22 · 363 阅读 · 0 评论 -
TVM编译pytorch模型
编译PyTorch模型本文是介绍如何使用Relay部署PyTorch模型的入门教程。首先,应该安装PyTorch。还需要TorchVision,因为我们将其用作模型动物园。一个快速的解决方案是通过pip安装pip install torch==1.7.0pip install torchvision==0.8.1或请访问官方网站 https://pytorch.org/get-started/locally/PyTorch版本应向后兼容,但应与正确的TorchVision版本一起使用。目前原创 2021-04-22 22:24:43 · 614 阅读 · 0 评论 -
对Pytorch网络进行可视化
对pytorch模型进行可视化主要包括以下几种方法:1.使用tensorboard2.使用netron3.使用torchviz1.使用tensorboard进行可视化# -*-coding:utf-8 -*-# --------------------# author: cjs# time: 20200910# usage: 进行pytorch模型的可视化# packages: pytorch, tensorflow, tensorboard, tensorboardX# ------原创 2021-04-21 08:32:17 · 306 阅读 · 0 评论 -
TVM学习(九)codegen中的内存申请
在BuildRelay函数中,完成了基于IR的硬件无关优化之后,接下来是在新function基础上进行codegen以及schedule的处理。我们详细考察以下代码: // Generate code for the updated function. graph_codegen_ = std::unique_ptr<GraphCodegen>(new GraphCodegen()); graph_codegen_->Init(nullptr, targets_);转载 2021-04-11 08:55:08 · 447 阅读 · 0 评论 -
TVM学习(八)pass总结
什么是pass?Pass是TVM中基于relay IR进行的优化,目的是去除冗余算子,进行硬件友好的算子转换,最终能够提高硬件运行效率。由tensorflow等深度学习框架生成的图机构中,含有很多可以优化的算子,比如expand_dim,len等,其实在编译阶段完全可以优化掉,从而能够减少硬件的计算,以及避免出现硬件不支持的算子。TVM中在include/tvm/ir/transform.h中对pass进行了抽象,主要包括PassContext,PassInfo,Pass,以及Sequential。其中转载 2021-04-11 08:46:30 · 1269 阅读 · 0 评论 -
ONNX笔记一
0x1. 什么是ONNX?简单描述一下官方介绍,开放神经网络交换(Open Neural Network Exchange)简称ONNX是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境、平台均无关的标准格式,来增强各种AI模型的可交互性。换句话说,无论你使用何种训练框架训练模型(比如TensorFlow/Pytorch/OneFlow/Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。注意ONNX文件不仅仅存储了转载 2021-04-10 10:55:48 · 715 阅读 · 0 评论 -
ONNX笔记二
0x0. 前言接着上篇文章,继续探索ONNX。这一节我将主要从盘点ONNX模型部署有哪些常见问题,以及针对这些问题提出一些解决方法,另外本文也会简单介绍一个可以快速用于ONNX模型推理验证的框架ONNXRuntime。如果你想用ONNX作为模型转换和部署的工具,可以耐心看下去。今天要讲到的ONNX模型部署碰到的问题大多来自于一些关于ONNX模型部署的文章以及自己使用ONNX进行模型部署过程中的一些经历,有一定的实践意义。0x1. 导出ONNX这里以Pytorch为例,来介绍一下要把Pytorch模型导转载 2021-04-10 14:25:09 · 3673 阅读 · 1 评论 -
TVM编译Keras模型
TVM官网链接Compile Keras Models本文是介绍如何使用Relay部署keras模型的入门教程。首先,应该安装keras。 还需要Tensorflow,因为它被用作keras的默认后端。一个快速的解决方案是通过pip安装pip install -U keras --userpip install -U tensorflow --user或请参阅官方网站https://keras.io/#installationimport tvmfrom tvm import teim原创 2021-04-03 10:52:30 · 243 阅读 · 2 评论 -
【从零开始学深度学习编译器】二,TVM中的scheduler
0x0. 前言在【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍我们已经知道TVM可以将各种深度学习训练框架的模型(计算图)转化为内部的Graph IR(Relay),然后通过TVM提供的指令生成模块将Graph IR翻译成特定硬件可执行的指令或者代码。总的来说的TVM的思想可以总结为表示和调度分离,所谓表示就是IR,调度就是scheduler。同时,在高性能计算方面TVM提供了多种调度源语(scheduler),包含了大多数常见的优化手段如算子融合,读写缓存,分块计算,并行计算等等,这些计算转载 2021-04-03 09:30:07 · 716 阅读 · 0 评论 -
TVM笔记-pass
1. 强拆Relay ir Passfold_const = relay.transform.FoldConstant() # 返回类型passmod = fold_const(mod) # 执行pass2. 函数调用关系图3. IPOinput: IRModuleprocess: pass优化output: IRModule4. pass data structure对于通用数据结构的定义均在目录tvm/ir中,执行pass 是一个module到module的映射pass =原创 2021-03-26 19:39:00 · 447 阅读 · 0 评论 -
【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍
0x1. 为什么需要深度学习编译器?深度学习编译器这个词语,我们可以先拆成两个部分来看。首先谈谈深度学习领域。从训练框架角度来看,Google的TensorFlow和FaceBook的Pytorch是全球主流的深度学习框架,另外亚马逊的MxNet,百度的Paddle,旷视的MegEngine,华为的Mindspore以及一流科技的OneFlow也逐渐在被更多人接受和使用。这么多训练框架,我们究竟应该选择哪个?如果追求易用性,可能你会选择Pytorch,如果追求项目部署落地,可能你会选择TensorFlo转载 2021-03-20 22:46:01 · 912 阅读 · 0 评论 -
使用TVM在android中进行Mobilenet SSD部署
所谓TVM,按照正式说法:就是一种将深度学习工作负载部署到硬件的端到端IR(中间表示)堆栈。换一种说法,可以表述为一种把深度学习模型分发到各种硬件设备上的、端到端的解决方案,关于更多TVM的信息大家可以参考TVM主页。我们在端上进行CNN部署的时候,为了最大化的发挥硬件的性能,之前的框架多是用的手工调优的算法Op,如NCNN、Tengine、Feather等等;TVM可谓是另辟蹊径,让框架去自适应的寻找最优或次优的算子Op,这类的框架应该是后续发展的主流。如果大家看过我之前写的博客,也许大概有个印象,一转载 2021-03-04 23:31:32 · 660 阅读 · 1 评论 -
TVM学习(七)算子
relay算子上一章梳理了一遍TVM前端流程,前端完成了tensorflow算子到TVM算子的转换。这一章CNN网络中最普遍的卷积运算为例,看一下relay算子的表示。在python/tvm/relay/frontend/tensorflow.py文件中convert_map有:_convert_map = {…'Conv2D' : _conv('conv'),…}在_conv函数中会根据layout对weights,inputs,out转载 2021-02-25 22:39:55 · 1066 阅读 · 1 评论 -
TVM学习(六)细读前端
用了几章的篇幅写了一些粗读TVM代码的收获,虽然读了一点皮毛,但是还是掌握了TVM的基本架构和代码组成,算是给以后的精读打下了一点基础吧。从这章开始再从头捋一遍TVM代码,顺序是frontend-build-optimize-lower-target。TVM前端可以适配大多数流行的深度学习框架,比如tensorflow,pytorch,onnx等。这里我选择适配tensorflow的前端代码来看。TVM前端的输入是protoBuf格式的二进制文件,这个文件描述了由tensorflow构建的神经网络的结构转载 2021-02-25 22:28:49 · 825 阅读 · 0 评论 -
TVM学习(五)schedule
Schedule是和硬件体系结构相关的一些列优化,Halide在其文章中对其做了以下定义:1 When and where should be the value at each coordinate in each function be computed?2 Where should they be stored?3 How long are values cached and communicated across multiple consumers, and when are they in转载 2021-02-25 19:51:41 · 920 阅读 · 0 评论 -
TVM学习(四)codegen
接着上一章继续深入代码,在BuildRelay中会调用Codegen函数。这个函数实现在src/relay/backend/http://graph_runtime_codegen.cc中。Codegen实现了内存的分配,IR节点到TIR节点的转换,tir图节点的一个调度优化。内存分配由函数relay.backend.GraphPlanMemory来实现,VisitExpr对节点进行遍历并进行节点信息的记录。LowerExternalfunctions完成ir节点到tir节点的转化以及schedule的优化转载 2021-02-25 15:46:47 · 1079 阅读 · 0 评论 -
TVM学习(三)编译流程
VM主要的编译过程如下图:Import:将tensorflow,onnx,pytorch等构建的深度学习模型导入,转化成TVM的中间层表示IR。Lower:将高层IR表示转化成低阶TIR表示。Codegen:内存分配和硬件可执行程序生成。图导入通过一个tensorflow的reception网络来熟悉编译过程,其它深度学习框架也具有类似过程。从TVM官网可以下载tensorflow的编译程序https://tvm.apache.org/docs/tutorials/frontend/from_转载 2021-02-23 23:56:38 · 852 阅读 · 0 评论 -
TVM代码学习 -- 代码生成流程(二)
接上文,已经粗略梳理了relay.build生成代码的流程,本文介绍另一种生成代码方式tvm.build的流程。首先以官方提供的一个向量相加程序为例简单熟悉下Tensor Expression和lower后的代码,tvm版本都是0.7dev。简单例子https://link.zhihu.com/?target=https%3A//tvm.apache.org/docs/tutorials/get_started/tensor_expr_get_started.html%23sphx-glr-tutori转载 2021-02-21 00:02:16 · 986 阅读 · 0 评论 -
TVM代码学习 -- 代码生成流程(一)
本文主要介绍TVM针对不同后端部署平台生成运行代码的流程,TVM可以通过两种方式生成代码:tvm.build 和 relay.build。两种方式流程略有不同,tvm.build 主要针对单一算子进行编译优化,relay.build 是针对整个网络计算图进行编译优化。先介绍relay.build,示例代码如下所示。relay.buildonnx_model = onnx.load('model/mobilenetv2.onnx')mod,params = relay.frontend.from_onn转载 2021-02-20 22:52:42 · 1683 阅读 · 0 评论 -
一步一步解读神经网络编译器TVM(一)——一个简单的例子
@TOC前言这是一个TVM教程系列,计划从TVM的使用说明,再到TVM的内部源码?为大家大致解析一下TVM的基本工作原理。因为TVM的中文资料比较少,也希望贡献一下自己的力量,如有描述方面的错误,请及时指出。那啥是TVM?简单来说,TVM可以称为许多工具集的集合,其中这些工具可以组合起来使用,来实现我们的一些神经网络的加速和部署功能。这也是为什么叫做TVM Stack了。TVM的使用途径很广,几乎可以支持市面上大部分的神经网络权重框架(ONNX、TF、Caffe2等),也几乎可以部署在任何的平台,转载 2021-02-17 23:39:32 · 2457 阅读 · 0 评论 -
TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)
(前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读)关注我最近想法的同学应该知道我最近都在把玩TVM,今天终于使用TVM得到了非常满意的结果,而专栏也很长时间没更新了,于是来安利(水)一篇。本来可能用不到TVM,项目其实进展的很顺利,我们初始的tensorflow模型在android端得到了满意的latency,我也可以照常一边修炼我的仙,继续和有奶大定律, 自由单子, Kan-Extension等邪魔外道搏斗…一边稳稳的推进项目进度。无奈scientist一意孤行要上Pyto转载 2021-02-14 16:15:44 · 653 阅读 · 0 评论 -
如何学习TVM的代码?
问题:对陈天奇团队的开源深度学习编译器TVM很感兴趣,特别是看到18年发的论文中提到的在FPGA上的部署。对于基础知识薄弱(如体系架构编译等方面)的学生,应该如何学习TVM的代码呢?如提问有误请指正,求轻喷。相关链接:TVM: End-to-End Optimization Stack for Deep Learning自动生成硬件优化内核:陈天奇等人发布深度学习编译器TVMdmlc/tvm作者:蓝色链接:https://www.zhihu.com/question/268423574/an原创 2021-02-14 10:45:59 · 748 阅读 · 0 评论 -
在Jetson nano上编译安装TVM
在Jetson nano上编译安装TVM前言参考资料编译流程LLVM的安装出现的问题及解决办法前言前面整理了几篇关于TVM的文章:TVM-初识TVMUbuntu16.04安装DockerTVM学习教程接下来就是编译安装TVM了,手头有的系统也就是ubuntu了,在网上查找了一些资料后发现可以在ubuntu系统上部署TVM,于是开开心心的开搞了,然后就是…不停的失败,真的是配环境配的快吐了,直到我在知乎上找到了下面的这篇文章:使用 TVM 在 Jetbot(Jetson Nano) 运行 Yol原创 2021-02-10 21:07:01 · 500 阅读 · 0 评论 -
TVM论文阅读
TVM论文阅读1 介绍1.1 优化的基本挑战1.2 TVM:一个端到端优化堆栈2 优化计算图2.1 计算图2.2 操作符融合2.3 数据布局转换2.4 计算图级别优化的限制3 优化张量操作3.1 Tensor表达式语言3.2 调度空间3.3 协作式嵌套并行化3.4 张量化:生成硬件接口3.5 编译器的延迟隐藏支持4 代码生成和运行时支持4.1 代码生成4.2 运行时支持4.3 自动调优4.4 远程部署性能分析5 评估5.1 树莓派3B评估5.2 NVIDIA Tesla K80和GTX1080评估5.3 P转载 2021-01-29 22:06:02 · 2020 阅读 · 1 评论 -
TVM学习教程
目录Step 1:TVM 视频介绍Step 2:研读 TVM 论文Step 3:了解 TVM 官网中可以学习的资料Step 4:上手 TVM CodeStep 5:TVM 其他相关资料Step 1:TVM 视频介绍https://www.bilibili.com/video/av29521815/Step 2:研读 TVM 论文https://www.usenix.org/system/files/osdi18-chen.pdfStep 3:了解 TVM 官网中可以学习的资料https://tv转载 2021-01-29 12:35:37 · 2625 阅读 · 0 评论 -
Ubuntu16.04安装Docker
安装相关包先更新一下软件源库信息sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common添加软件仓库官方仓库# 添加 Docker 官方的 GPG 密钥(为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥)curl -fsSL https://download.docker.com/l原创 2021-01-28 22:28:05 · 288 阅读 · 0 评论