AutoSchedule和AutoTVM

简介

AutoTVM

用户自己手写一个模版,在模版里面自己定义一下tune的参数,例如tile size等。给定一个模版,在这个模版里面去搜索参数,使得可以达到一组最好的参数使得张量计算的结果最好。但是,它是一种基于模板的方法,因此仍然需要领域专家为每个平台上的每个算子实现一个性能比较好的模板。今天,TVM 代码库中有超过 15,000 行这些模板的代码。除了非常难以开发之外,这些模板通常效率低下且搜索空间有限,无法实现最佳性能。

Auto Schedule : Template-free Auto Scheduling

为了解决 AutoTVM 的局限性,TVM启动了 Ansor 项目,旨在为张量计算生成代码的全自动自动调度程序。 Ansor 自动调度器仅以张量表达式作为输入,生成高性能代码,无需手动模板。我们在搜索空间构建和搜索算法方面进行了创新。因此,自动调度程序可以以更自动化的方式以更少的搜索时间获得更好的性能。

两者的工作流如下所示:
在这里插入图片描述
表 1 比较了 AutoTVM 和自动调度器中为算子生成代码的工作流程。在 AutoTVM 中,开发人员必须经过三个步骤。在步骤 1 中,开发人员必须用 TVM 的张量表达式语言编写计算定义。这部分相对容易,因为 TVM 的张量表达式语言看起来就像数学表达式。在第 2 步中,开发人员必须编写时间表模板,该模板通常由 20-100 行棘手的 DSL 代码组成。这部分需要目标硬件架构和算子语义的领域专业知识,所以很难。最后一步,第 3 步,由搜索算法自动执行。

在自动调度程序中,我们通过自动搜索空间构建消除了最困难的第 2 步,并使用更好的搜索算法加速了第 3 步。通过进行自动搜索空间构建,我们不仅消除了大量的手动工作,而且还能够探索更多优化组合。这种自动化不是免费的,因为我们仍然需要设计规则来生成搜索空间。但是,这些规则非常通用。它们基于张量表达式的静态分析。我们只需要设计一些通用规则,就可以将它们应用到深度学习中几乎所有的张量计算中。

代码

当我们要调用Auto Schedule的时候,我们采用下面的代码

import os
import numpy as np
import tvm
from tvm import te, auto_scheduler, topi
from tvm.topi.testing import conv2d_nchw_python

num_threads = 1
os.environ["TVM_NUM_THREADS"] = str(num_threads)

@auto_scheduler.register_workload
def conv2d_layer(N, H, W, CO, CI, KH, KW, stride, padding):
    data = te.placeholder((N, CI, H, W), name="data")
    kernel = te.placeholder((CO, CI,
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值