AI 编译器 可视化实验室

用交互式 SVG 呈现计算图、图优化、TVM、MLIR、XLA、自动微分等 AI 编译核心技术。八个模块,纯原生实现。

zero-deps HTML / CSS / JS + SVG requestAnimationFrame prefers-reduced-motion
MODULE 01

计算图构建 · PyTorch → Graph

深度学习框架将模型代码追踪为有向无环图(DAG):算子为节点,张量为边。切换不同模型结构,点击节点查看输入输出张量形状与算子属性。

computation-graph.svg
输入/权重 算子节点 输出 选中

计算图 DAG

PyTorch 通过 torch.fx 或 TorchScript 将 nn.Module 追踪为符号图,节点为算子(Conv/MatMul/ReLU...),边为张量。编译器在此图上做类型推断、形状传播与优化。

节点数
—
边数
—
参数量
—
当前模型
MLP
MODULE 02

图优化 · 常量折叠 / 算子融合 / DCE

左侧为优化前计算图,右侧为优化后。常量折叠在编译期求值常量子图;算子融合将 Conv+Bias+ReLU 合并为单个 kernel 减少访存;死代码消除删除无输出依赖的节点。

graph-optimization.svg
常量 算子 被删除/折叠 融合后

优化 Pass

勾选优化 pass 观察图变化。常量折叠:图中 const×2 在编译期算出,ConstMul 节点被常量替换。算子融合:Conv→Bias→ReLU 三个 kernel 合并为一个 ConvBiasReLU,减少 2 次中间张量读写。DCE:无消费者节点被删除。

优化前节点
—
优化后节点
—
kernel 数
—
访存节省
—
MODULE 03

TVM · AutoTVM / Ansor 自动调优

算子在不同硬件上需选择最优 tile 与循环展开参数。AutoTVM 用模板搜索,Ansor 用进化+代价模型自动生成调度。调整 tile 参数观察矩阵分块策略与调优曲线。

tvm-autotuning.svg
tile 块 循环轴 最优配置 采样点

tile 参数搜索

矩阵乘 C[m,n]=A[m,k]×B[k,n] 按 (bm,bn,bk) 分块:外层遍历块,内层在块内做向量/张量化计算。Ansor 生成随机 schedule,用 XGBoost 代价模型预测性能,进化搜索选优。下方曲线显示调优过程中测量延迟的下降。

tile (bm,bn,bk)
—
采样次数
—
最优延迟
—
加速比
—
MODULE 04

MLIR · 多层中间表示与 Pass 管道

MLIR 通过嵌套 dialect 表示不同抽象层:高层的 toy/linalg → affine → SCF → LLVM IR。每个 Pass 将上层 dialect 下降为下层。点击 Pass 观察逐层 lowering。

mlir-dialects.svg
当前层 已完成 Pass 下降 未处理

Dialect 下降

linalg.generic 表示数据并行计算;affine 将循环结构显式化便于多面体优化;scf 转为结构化控制流;最终 LLVM dialect 直通 LLVM 后端生成机器码。每层保留前层语义并增加低层细节。

当前 dialect
—
Pass 数
—
抽象层
—
剩余 Pass
—
MODULE 05

XLA · HLO IR 与 GPU 融合

XLA 将前端算子编译为 HLO IR,再经融合与代码生成产出 GPU kernel。融合策略把 elementwise + reduce 等 producer-consumer 合并以减少显存带宽压力。切换融合级别观察 kernel 数量变化。

xla-hlo-fusion.svg
HLO 算子 融合组 生成 kernel fusion 边界

XLA 融合策略

HLO IR 是显式数据流图。XLA 三种融合:kLoop(同形状 elementwise 链)、kInput(reduce + elementwise)、kOutput(输出分裂)。融合后多个 HLO 编译为单个 GPU kernel,中间张量留在寄存器/共享内存。

HLO 算子
—
融合级别
—
生成 kernel
—
显存读写
—
MODULE 06

自动微分 · 前向 / 反向模式

前向模式沿计算图传播切线,适合输入少输出多;反向模式(反向传播)先前向求值再反向求梯度,适合输入多输出少(loss 标量)。点击单步观察前向值与梯度在图上的传播。

autodiff.svg
前向值 v 梯度 ∇ 已传播 当前步

反向模式

计算图:z = (x·y) + sin(x)。前向:t₁=x·y=6, t₂=sin(x)≈0.84, z=t₁+t₂≈6.84。反向:∂z/∂t₁=1, ∂z/∂t₂=1;∂z/∂x=∂z/∂t₁·y + ∂z/∂t₂·cos(x)=3+0.34=3.34;∂z/∂y=∂z/∂t₁·x=2。一次反向遍历得到所有输入梯度。

模式
反向
当前步
—
前向值 z
—
∂z/∂x
—
MODULE 07

内存规划 · buffer 分配与复用

编译器为每个中间张量分配 buffer。朴素策略每个张量独立分配导致峰值高;基于活性分析的重叠着色策略让不重叠生命期的 buffer 共享内存。切换策略对比峰值内存。

memory-planning.svg
buffer 生命期 内存槽 (复用) 峰值内存 节省

活性分析与重叠着色

每个 buffer 有 [定义点, 最后使用点] 的生命期区间。若两区间不重叠则可共享同一内存槽(图着色)。朴素分配峰值=Σsize;复用分配峰值=max_t Σ(活跃 size),通常显著降低。模拟搜索/静态规划会进一步做尺寸对齐与碎片整理。

buffer 数
—
策略
—
峰值内存
—
节省
—
MODULE 08

算子库 · cuDNN / MKL / TensorCore

编译器后端将算子映射到高度优化的库:cuDNN 处理 Conv,MKL 处理 CPU 线性代数,TensorCore 做 WMMA 矩阵乘。切换算子与输入配置,观察库选择与 kernel 调用路径。

kernel-library.svg
逻辑算子 cuDNN MKL TensorCore

库选择策略

编译器维护算子→库映射表:Conv 在 GPU 走 cuDNN (Winograd/Implicit GEMM),在 CPU 走 MKL-DNN;MatMul 当形状满足 m,n,k≥16 且对齐时走 TensorCore (WMMA),否则走 cuBLAS。autotuning 会在多个候选 kernel 间实测择优。

算子
Conv2D
后端
—
选择库
—
kernel
—