首先给出一个TVM 相关的介绍,这个是Tianqi Chen演讲在OSDI18上用的PPThttps://files.cnblogs.com/files/jourluohua/Tianqi-Chen-TVM-Stack-Overview.rar

对于图优化来说,位于整个软件编译栈比较高的层次:

首先给出计算图的定义

Computational graphs: a common way to represent programs in deep learning frameworks

对于图优化来说,有很多种图优化手段:Operator Fusion
Constant Parameter Path Pre-Computation
Static Memory Reuse Analysis
Data Layout Transformation
AlterOpLayout
SimplifyInference

这里仅以Operator Fusion做例子介绍

Operator fusion : combine multiple operators together into a single kernel without saving the intermediate results back into global memory

也就说是说算子融合省掉了中间数据的store过程

在TVM中,有三种融合规则:

其中,算子属于哪一类是算子本身的特性(这个地方不是特别懂,这个属性有非常多的值),但是能融合的规则只有这三种。

但是这种store是如何减少的,在IR上有明确的体现。

下边的例子,我会使用tvm.relay来进行介绍,relay是TVM中实现的一种高级IR,可以简单理解为另一种计算图表示。其在TVM所处的位置如下图所示

比如,我们假设我们要完成一个y = exp(x+1.0)的计算图

给出测试代码(来自于源码中的test_pass_fuse_ops.py,有改动):

import tvm
from tvm import relay def test_fuse_simple():
"""Simple testcase."""
def before():
x = relay.var("x", shape=(10, 20))
y = relay.add(x, relay.const(1, "float32"))
z = relay.exp(y)
return relay.Function([x], z) def expected():
x = relay.var("p", shape=(10, 20))
y = relay.add(x, relay.const(1, "float32"))
z = relay.exp(y)
f1 = relay.Function([x], z)
x = relay.var("x", shape=(10, 20))
y = relay.Call(f1, [x])
return relay.Function([x], y) z = before()
z = relay.ir_pass.infer_type(z)
# print(z.astext())
zz = relay.ir_pass.fuse_ops(z, opt_level=2)
print(zz.astext())
zz = relay.ir_pass.infer_type(zz)
zz = relay.ir_pass.fuse_ops(zz)
zz = relay.ir_pass.infer_type(zz)
after = relay.ir_pass.infer_type(expected())
# print(after.astext())
assert relay.ir_pass.alpha_equal(zz, after)

在融合前,其IR(方便用户看的一种形式,不是真正的IR)

fn (%x: Tensor[(10, 20), float32])
-> Tensor[(10, 20), float32] {
%0 = fn(%p0: Tensor[(10, 20), float32],
%p1: float32)
-> Tensor[(10, 20), float32] {
%1 = add(%p0, %p1)
%1
}
%2 = %0(%x, 1f)
%3 = fn(%p01: Tensor[(10, 20), float32])
-> Tensor[(10, 20), float32] {
%4 = exp(%p01)
%4
}
%5 = %3(%2)
%5
}

融合后:

fn (%x: Tensor[(10, 20), float32])
-> Tensor[(10, 20), float32] {
%0 = fn(%p0: Tensor[(10, 20), float32])
-> Tensor[(10, 20), float32] {
%1 = add(%p0, 1f)
%2 = exp(%1)
%2
}
%3 = %0(%x)
%3
}

可以很明显的发现,省掉了一次数据store过程

TVM图优化(以Op Fusion为例)的更多相关文章

  1. TVM图优化与算子融合

    TVM图优化与算子融合 计算图的定义 Computational graphs: a common way to represent programs in deep learning framewo ...

  2. 『The Captain 最短路建图优化』

    The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...

  3. BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化

    我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...

  4. MXNet 图优化与算子融合

    MXNet 图优化与算子融合Graph Optimization and Quantization based on subgraph and MKL-DNN Purpose MKL-DNN引入了两个 ...

  5. 深入理解图优化与g2o:g2o篇

    内容提要 讲完了优化的基本知识,我们来看一下g2o的结构.本篇将讨论g2o的代码结构,并带着大家一起写一个简单的双视图bundle adjustment:从两张图像中估计相机运动和特征点位置.你可以把 ...

  6. 深入理解图优化与g2o:图优化篇

    前言 本节我们将深入介绍视觉slam中的主流优化方法——图优化(graph-based optimization).下一节中,介绍一下非常流行的图优化库:g2o. 关于g2o,我13年写过一个文档,然 ...

  7. CF 291E. Tree-String Problem [dfs kmp trie图优化]

    CF291E 题意:一棵树,每条边上有一些字符,求目标串出现了多少次 直接求目标串的fail然后一边dfs一边跑kmp 然后就被特殊数据卡到\(O(n^2)\)了... 因为这样kmp复杂度分析的基础 ...

  8. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  9. 视觉SLAM漫淡(二):图优化理论与g2o的使用

    视觉SLAM漫谈(二):图优化理论与g2o的使用 1    前言以及回顾 各位朋友,自从上一篇<视觉SLAM漫谈>写成以来已经有一段时间了.我收到几位热心读者的邮件.有的希望我介绍一下当前 ...

随机推荐

  1. 通过OpenCL内核代码猜测设备寄存器个数

    在OpenCL标准中,没有给出查看计算设备一共有多少寄存器,至少能分配给每个work-item多少寄存器使用的特征查询.而由于一个段内核代码是否因寄存器紧缺而导致性能严重下降也是一个比较重要的因素,因 ...

  2. vue 组件之间通信

    父传子 **父组件代码** <template> <header-box :title-txt="showTitleTxt"></header-box ...

  3. 顺序容器删除元素 vector list deque

    #include <iostream>#include <list>#include <algorithm>#include <string> usin ...

  4. Build Telemetry for Distributed Services之Jaeger

    github链接:https://github.com/jaegertracing/jaeger 官网:https://www.jaegertracing.io/ Jaeger: open sourc ...

  5. Spark2.0协同过滤与ALS算法介绍

    ALS矩阵分解 一个 的打分矩阵 A 可以用两个小矩阵和的乘积来近似,描述一个人的喜好经常是在一个抽象的低维空间上进行的,并不需要把其喜欢的事物一一列出.再抽象一些,把人们的喜好和电影的特征都投到这个 ...

  6. maven创建父项目和子项目

    创建父级项目 new    -----    others    ------ maven project 创建好后删除,pom.xml以外的文件 点击pom.xml文件,修改Packaging属性为 ...

  7. MIGO 收货

    ls_code-gm_code = '01'. 01 - MB01 - Goods Receipts for Purchase Order 02 - MB31 - Goods Receipts for ...

  8. JAVA 基础编程练习题40 【程序 40 字符串排序】

    40 [程序 40 字符串排序] 题目:字符串排序. package cskaoyan; public class cskaoyan40 { @org.junit.Test public void a ...

  9. 比特币 难度值(difficulty)

    难度(Difficulty) 难度是对挖矿困难程度的度量,即指:计算符合给定目标的一个HASH值的困难程度.比特币网络有一个全局的区块难度,有效的区域必须有一个HASH值,该HASH值必须小于给定的目 ...

  10. .Netcore 2.0 Ocelot Api网关教程(10)- Headers Transformation

    本文介绍Ocelot中的请求头传递(Headers Transformation),其可以改变上游request传递给下游/下游response传递给上游的header. 1.修改ValuesCont ...