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