TVM 与 IREE 的调度算法对比
文章目录
- [TVM 与 IREE 的调度算法对比](#TVM 与 IREE 的调度算法对比)
- [1. TVM 的调度算法体系(TVM, AutoTVM, AutoScheduler)](#1. TVM 的调度算法体系(TVM, AutoTVM, AutoScheduler))
-
- [1.1 TVM 手写调度(TIR Schedule)](#1.1 TVM 手写调度(TIR Schedule))
-
- [✔ Topological Scheduling(拓扑调度)](#✔ Topological Scheduling(拓扑调度))
- [✔ Compute-Ahead / Inline / Fuse 调度(Heuristic)](#✔ Compute-Ahead / Inline / Fuse 调度(Heuristic))
- [1.2 TVM AutoTVM(旧体系)](#1.2 TVM AutoTVM(旧体系))
-
- [✔ Simulated Annealing(模拟退火)为主](#✔ Simulated Annealing(模拟退火)为主)
- [1.3 TVM AutoScheduler(Ansor,新体系)](#1.3 TVM AutoScheduler(Ansor,新体系))
-
- 核心算法包括:
- [✔ Sketch Generation(启发式生成"草图")](#✔ Sketch Generation(启发式生成“草图”))
- [✔ Evolutionary Search(遗传算法)](#✔ Evolutionary Search(遗传算法))
- [✔ ML-based Cost Model(XGBoost → GNN)](#✔ ML-based Cost Model(XGBoost → GNN))
- [✔ Locality-aware Tiling / Cache-aware Scheduling(启发式)](#✔ Locality-aware Tiling / Cache-aware Scheduling(启发式))
- [TVM 自动调度小结](#TVM 自动调度小结)
- [2. IREE 的调度算法体系](#2. IREE 的调度算法体系)
- [2.1 Graph-level(MHLO/StableHLO → Linalg)](#2.1 Graph-level(MHLO/StableHLO → Linalg))
-
-
- [✔ Topological Scheduling(拓扑调度)](#✔ Topological Scheduling(拓扑调度))
- [✔ Pattern-based Fusion(模式驱动融合)](#✔ Pattern-based Fusion(模式驱动融合))
-
- [2.2 Linalg-level(Kernel-level)](#2.2 Linalg-level(Kernel-level))
-
-
- [✔ Tiling + Loop Promotion(启发式规则)](#✔ Tiling + Loop Promotion(启发式规则))
- [✔ Linalg → Vector → LLVM 转换序列(固定 pass pipeline)](#✔ Linalg → Vector → LLVM 转换序列(固定 pass pipeline))
- [✔ LLVM Machine Scheduler = List Scheduling + Critical Path Scheduling](#✔ LLVM Machine Scheduler = List Scheduling + Critical Path Scheduling)
-
- [2.3 IREE GPU 后端(Vulkan / Metal)](#2.3 IREE GPU 后端(Vulkan / Metal))
-
-
- [✔ Software Pipeline / Loop Peeling(规则)](#✔ Software Pipeline / Loop Peeling(规则))
- [✔ Tile-based Workgroup Scheduling](#✔ Tile-based Workgroup Scheduling)
-
- [IREE 总结表](#IREE 总结表)
- 最终对比(浓缩版)
TVM = Graph IR + TIR + AutoScheduler
IREE = Graph IR(MLIR)+ Linalg / Tiling / Vectorization + LLVM Backend
它们的调度层次不同,因此调度算法体系也不一样。
1. TVM 的调度算法体系(TVM, AutoTVM, AutoScheduler)
TVM 的调度可以分成 手写 schedule(TIR) 和 自动调度(AutoTVM/Ansor) 两类,各自使用不同的调度算法。
1.1 TVM 手写调度(TIR Schedule)
这是图级 → kernel-level 调度,不涉及自动搜索。
核心算法:
✔ Topological Scheduling(拓扑调度)
Relay Graph → TIR 时先进行拓扑排序,确保 operator 依赖有序。
✔ Compute-Ahead / Inline / Fuse 调度(Heuristic)
例如:
compute_atcompute_inlinefusereordertilevectorizeunroll
这些不是自动算法,而是 DSL 主导的人类调度规则。
1.2 TVM AutoTVM(旧体系)
AutoTVM 是依靠 人工模板 + 搜索算法的系统:
✔ Simulated Annealing(模拟退火)为主
用于探索 schedule 的参数空间。
附带:
- Random Search
- Grid Search
- XGBoost Cost Model(训练后指导退火过程)
AutoTVM 的搜索是 基于 cost model + 退火。
1.3 TVM AutoScheduler(Ansor,新体系)
Ansor 是目前 TVM 的主要自动调度框架,算法更系统。
核心算法包括:
✔ Sketch Generation(启发式生成"草图")
这些草图通过:
- 规则(tiling、split、unroll、vectorize)
- 算法模板(卷积、matmul、dense)
不是搜索,是 启发式结构生成。
✔ Evolutionary Search(遗传算法)
在草图空间内,用遗传算法搜索 schedule 参数:
- Mutation
- Crossover
- Population-based Evolution
TVM 官方文档中明确指出:
Ansor 的主搜索算法为 Genetic Search(进化式搜索)。
✔ ML-based Cost Model(XGBoost → GNN)
- 测量 kernel
- 回归预测 performance
- 指导演化搜索方向
✔ Locality-aware Tiling / Cache-aware Scheduling(启发式)
适合 GPU/CPU/NPU 后端,和 schedule rules 内建。
TVM 自动调度小结
| 层级 | TVM 使用的调度算法 |
|---|---|
| Graph-level | Topological Scheduling, Op Fusion |
| Kernel-level 手写 | TIR schedule rules(人为规则) |
| AutoTVM | Simulated Annealing + Cost Model |
| AutoScheduler(Ansor) | Sketch + Evolutionary Search + ML Cost Model |
2. IREE 的调度算法体系
IREE 基于 MLIR,所以调度逻辑非常工程化、层次清晰:
核心是:Linalg + Tiling + Vectorization + LLVM Pass Pipeline
IREE 的调度整体更偏 规则(rule-based) ,不像 TVM 那样大量搜索。
IREE 追求 predictable + compile-time 快速。
2.1 Graph-level(MHLO/StableHLO → Linalg)
✔ Topological Scheduling(拓扑调度)
所有 MLIR 图框架必备。
✔ Pattern-based Fusion(模式驱动融合)
IREE 通过 MLIR 的 pattern rewrite 做 operator fusion,比如:
- elementwise fusion
- producer-consumer fusion
- tile-and-fuse
算法是 deterministic,无需搜索。
2.2 Linalg-level(Kernel-level)
这里是 IREE 调度的核心。IREE 的 kernel 调度依赖以下算法:
✔ Tiling + Loop Promotion(启发式规则)
IREE 主要使用 rule-based tiling:
- tile size 由硬件配置 + 经验规则决定
- promotion 将 tile 提升到 SRAM(支持 NPU / GPU 双后端)
并不是搜索,而是 硬件描述 + heuristic。
✔ Linalg → Vector → LLVM 转换序列(固定 pass pipeline)
这本质上是一组转换规则:
- Tiling
- Fusion
- Vectorization
- Unrolling
- Bufferization
- LLVM Lowering
- Instruction Scheduling → LLVM 后端(List Scheduling / MachineScheduler)
LLVM 后端调度器最终负责具体的指令级调度:
✔ LLVM Machine Scheduler = List Scheduling + Critical Path Scheduling
IREE 直接依赖 LLVM 的经典调度算法。
2.3 IREE GPU 后端(Vulkan / Metal)
GPU 层调度包含:
✔ Software Pipeline / Loop Peeling(规则)
- warp-level 分块
- vector load/store
- subgroup reduction
✔ Tile-based Workgroup Scheduling
固定 mapping,例如:
- workgroup 分配 tile
- local memory reuse
完全 rule-based,没有搜索。
IREE 总结表
| 层级 | IREE 的调度算法 |
|---|---|
| Graph-level | Topological Sort + Pattern-based Fusion |
| Linalg-level | Rule-based Tiling, Tile-and-Fuse, Vectorization |
| Bufferization | Heuristic Allocation |
| LLVM Backend | List Scheduling + Critical Path(LLVM 默认) |
| GPU Backend | Rule-based tiling + pipeline |
IREE 基本不做自动搜索,属于 规则驱动编译器。
最终对比(浓缩版)
| 框架 | 调度思路 | 主算法 |
|---|---|---|
| TVM | Auto + Search | Simulated Annealing, Evolutionary Search, ML Cost Model |
| IREE | Rule-based + LLVM backend | Pattern Fusion, Tiling Rules, LLVM List Scheduling |