---
title: Auto Tiling
description: "在Schedule阶段，系统会根据前端输入的AscIR图生成多种优化后的切分图，Auto Tiling需要评估这些图的最优切分方案及其对应的Kernel性能，从而选出最优模板。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/graphdevg/autofuse_1_0031.html
sourcePath: /source/zh/canncommercial/900/programug/graphdevg/autofuse_1_0031.html
indexId: 380c8d408dc403e22f1c1c026b5568c4eae7335e93b1f94345620a7c44ff672070
---
# Auto Tiling

在Schedule阶段，系统会根据前端输入的AscIR图生成多种优化后的切分图，Auto Tiling需要评估这些图的最优切分方案及其对应的Kernel性能，从而选出最优模板。

Tiling策略决定了Kernel执行时需要使用的核的数量，每次从GM中搬运多少数据到UB内，在UB内需要循环多少次，每次在UB内搬运多少次到GM中等，这些因素共同影响着Kernel的执行性能。Auto Tiling的目标是找到能够实现Kernel最佳执行性能的Tiling策略。

#### 核心流程

图1 Auto Tiling核心流程

Kernel的执行逻辑会在AscIR中表达，Auto Tiling会根据AscIR图的表达提取关键信息，包括：

1. LocalBuffer占用建模
  Auto Tiling求解需确保每一级LocalBuffer的占用在硬件允许的范围内，比如，Kernel申请的TQue(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendcopapi/atlasascendc_api_07_0137.html)/TBuf(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendcopapi/atlasascendc_api_07_0161.html)及临时Buf申请大小之和不能超过硬件的UB大小限制，AscIR会表达出每个Tensor的Location是在GM/UB上，Tensor间的复用关系，自动Tiling根据这些信息将各级LocalBuffer的约束进行符号化表达。

2. 耗时公式建模
  Auto Tiling会对各个API进行性能建模，通过符号化的形式表达这些API在各个流水上的性能，根据AscIR表达的循环轴来确定表达API的调用次数，从而推导出该AscIR的所有API在各个流水上的总耗时，此处假设瓶颈流水线的执行可以较好地掩盖非瓶颈流水线的执行，因此任务执行的总耗时主要体现在瓶颈流水线的时间上，如下图：

  下图表达了三个pipe流水，瓶颈流水为AIV_MTE2，AIV_MTE2在执行时会掩盖AIV_MTE3和AIV_VEC的执行，任务执行的总耗时体现在AIV_MTE2的执行耗时上。

  图2 pipe流水示意图

3. 求解器求解Tiling
  Auto Tiling以算子实现过程中的存储占用不超过NPU各级物理存储大小为约束条件，以最小化瓶颈执行单元的耗时为优化目标，通过建模数据优化模型进行求解。例如，通过启发式求解方法，从初始解开始，在满足约束条件的可行域内，根据性能公式建模的梯度下降方向搜索满足内存要求的解空间，直到公式建模的值达到最小，从而退出寻优流程，返回最优Tiling。


#### 关键技术

- 性能公式建模

  - 目标：性能公式的仿真精度决定了模板选择的准确性及启发式求解的准确性，因此需要对API进行较为精确的性能建模。
  - 实现：

    - 针对AscendC稳定的基础API，自动Tiling模块会根据不同的输入采集性能数据，得到性能与输入的关系，并建立性能模型，通过符号化的技术表达出来。
    - 针对调用AscendC易变的API，自动Tiling模块会基于API调用的逻辑，计算其调用入参和调用次数，生成该API的完整性能模型，从而得到相对准确的性能建模。
- 轴排序求解器

  - 目标：基于性能公式梯度下降的求解方式高度依赖性能公式的精确建模，并且Tiling求解时间存在不确定性，容易出现host bound问题，而API本身对轴的切分有特定的偏好，因此设计了一种轴排序求解器作为迭代求解的替代方案。
  - 实现

    1. 首先需要基于API来确定切分轴的优先级，顺序如下：

      a. 父轴优先级高于子轴。
      b. 规约化类轴高于非规约化类轴。
      c. 广播轴高于非广播轴。
      d. 非最内轴高于最内轴。

    2. 其次再分成两个部分切分，包括：

      - 核内Tiling：按照轴排序的逆序依次遍历，优先将变量调整至最大值，判断是否符合硬件约束条件，若不满足，则通过二分法调整该变量，直到符合硬件约束条件为止，随后调整下一个核内Tiling变量，直至所有的变量均满足硬件约束条件，比如s1tt2、s1tt、s1t、s2t是Tiling相关轴，其切分流程如下：
        优先遍历s2t，调至最大值1024，符合硬件约束条件；然后遍历s1t，调至最大值256，符合硬件约束条件；然后依次调整下个变量s1tt>s1tt2，直到所有的变量均满足硬件约束条件。

        图3 核内Tiling示意图

      - 多核Tiling：识别与多核相关的变量，按从大到小的顺序遍历这些变量，找到更大核数占用的记录，若超出物理核数（以Atlas A2 训练系列产品 / Atlas A2 推理系列产品为例，NPU核数为48）则返回。
        如下图所示，bngs1T是多核切分轴，其切分流程如下。选择策略为：核数占用不同时，优先选择占用核数更大的记录，根据上述策略，最终选定的占用核数为47。

        图4 多核Tiling示意图
