Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 人工智能 / Artificial Intelligence

AI 编译器 / AI Compilers

1. AI 编译器全景——为什么模型需要编译器 / The AI Compiler Landscape and Why Models Need Compilers

2. 编译原理速通——面向 ML 工程师的核心概念 / Compiler Fundamentals for Machine Learning Engineers

3. 中间表示基础——理解 IR 层级与 lowering 链路 / Intermediate Representation Levels and Lowering Pipelines

4. 计算图的构建与表示 / Building and Representing Computational Graphs

5. MLIR 架构、方言与渐进式降级 / MLIR Architecture, Dialects, and Progressive Lowering

6. 算子语义、广播、归约与形状推导 / Operator Semantics, Broadcasting, Reduction, and Shape Inference

7. 模型前端格式:ONNX、TFLite、HLO 与 SavedModel / Model Frontend Formats: ONNX, TFLite, HLO, and SavedModel

8. 图优化 Pass——经典优化在 ML 中的应用 / Graph Optimization Passes for Machine Learning

9. 算子融合——编译器最重要的性能优化 / Operator Fusion as a Core Compiler Optimization

10. 内存规划——Buffer 分配与生命周期管理 / Memory Planning, Buffer Allocation, and Lifetime Management

11. Layout 优化——数据排布转换与内存效率 / Layout Optimization for Data Movement and Memory Efficiency

12. 动态 Shape——符号分析与形状处理 / Dynamic Shapes, Symbolic Analysis, and Shape Processing

13. 硬件约束下的操作调度 / Operation Scheduling Under Hardware Constraints

14. 从模板、DSL 到 IR 降级的代码生成架构 / Code Generation Architectures from Templates and DSLs to IR Lowering

15. CPU 后端:SIMD、分块与多线程 / CPU Backends with SIMD, Tiling, and Multithreading

16. CUDA 后端:合并访存与 Tensor Core / CUDA Backends, Memory Coalescing, and Tensor Cores

17. NPU 后端:脉动阵列与端侧 AI 生态 / NPU Backends, Systolic Arrays, and Edge AI Ecosystems

18. Kernel 性能基础:Roofline 与 Occupancy / Kernel Performance Fundamentals with Roofline and Occupancy

19. CUTLASS 与分层 GEMM 模板 / CUTLASS and Hierarchical GEMM Templates

20. TVM Tensor Expression 与计算调度分离 / TVM Tensor Expressions and Compute-Schedule Separation

21. 使用 Triton 编写高性能 GPU Kernel / Triton for High-Performance GPU Kernels in Python

22. 基于成本模型与实测搜索的自动调度 / Automatic Scheduling with Cost Models and Measurement-Based Search

23. XLA 内部机制:HLO、融合与 SPMD / XLA Internals, HLO, Fusion, and SPMD

24. Torch-MLIR:从 PyTorch 算子到 MLIR 方言 / Torch-MLIR from PyTorch Operators to MLIR Dialects

25. torch.compile:Dynamo、AOTAutograd、Inductor 与 Triton / Torch Compile with Dynamo, AOTAutograd, Inductor, and Triton

26. 从 MLIR 经 LLVM 降级到机器码 / Lowering from MLIR Through LLVM to Machine Code

27. 量化——低精度推理的工程实践 / Engineering Low-Precision Inference with Quantization

28. 分布式编译与训练——多设备编排的编译器支持 / Compiler Support for Distributed Training and Multi-Device Orchestration

29. 生产调试——真实问题的编译器视角排查 / Production Debugging from the Compiler Perspective

30. 未来方向——AI 编译器的新挑战与机遇 / Future Challenges and Opportunities for AI Compilers

本页目录

📅 创建时间:2026-06-03 🏷️ 标签:#AI-Compiler #编译器全景 #前端 #中端 #后端 #torch.compile #TVM #MLIR #XLA 📚 前置知识:[[/04-ai/01-llm-engineering/07-llm-evolution]](LLM 发展脉络) [[/04-ai/01-llm-engineering/02-token-and-context]](Token 与上下文) 📚 相关知识:[[01-compiler-primer]](编译原理速通) [[03-graph-representation]](计算图表示)


┌─────────────────────────────────────────────────────────────────────────────┐
│  📍 场景:你拿到了一个训练好的 PyTorch 模型,需要在生产环境中部署             │
├─────────────────────────────────────────────────────────────────────────────┤
│  问题清单:                                                                 │
│  • 模型是 ResNet-50,在 PyTorch 里推理 1 张图需要 200ms                     │
│  • 客户要求 50 QPS,单卡 A100 理论上能跑 500 QPS                            │
│  • 但实际压测只有 30 QPS,GPU 利用率只有 15%                                │
│  • Python GIL 限制了并行,动态图开销拖累了执行效率                           │
│  • 你的困惑:明明是同一个模型,为什么框架执行效率这么低?                      │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10

AI 编译器全景——为什么模型需要编译器 / The AI Compiler Landscape and Why Models Need Compilers ​

第1节 为什么需要 AI 编译器 ​

1.1 性能鸿沟:硬件 vs 软件的现实差距 ​

在深入 AI 编译器之前,我们先理解一个核心矛盾:硬件潜力 vs 软件实现之间的巨大差距。

以 NVIDIA A100 GPU 为例,这是一块地表最强的 AI 训练芯片之一:

硬件指标A100 SXM4 (80GB)实际利用情况
FP32 算力19.5 TFLOPS—
Tensor FP16312 TFLOPS—
HBM2 带宽2TB/s—
L2 缓存40MB—
SM 数量108 个—

现在的问题是:为什么你的 PyTorch 模型只用了 15% 的 GPU 算力?

1.2 性能瓶颈的四大来源 ​

让我们逐一分析为什么原生 PyTorch 执行如此低效:

① Python 解释器开销

python
# PyTorch 原生执行:每次 op 都需要 Python → C++ 桥接
import torch

model = torch.nn.Linear(512, 512)
x = torch.randn(1, 512)

# 实际执行路径:
# 1. Python 解释器解析 model(x)
# 2. 调用 torch 库的 Python wrapper
# 3. Python GIL 获取全局锁
# 4. C++ 运行时处理 tensor 操作
# 5. CUDA kernel 调度
# 6. 结果返回 Python

result = model(x)  # 这个简单操作背后是数十次 Python/C++ 上下文切换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Python GIL(全局解释器锁)意味着即使在 CPU 端,多线程也无法真正并行。对于 I/O bound 的 op dispatch 来说,这是巨大的开销。

② 动态图的开销

PyTorch 的动态图是其最大的优势,但也是性能噩梦的来源:

python
# 动态图:每次前向都重新构建计算图
for i in range(1000):
    if condition(x):  # 运行时才知道走哪条路
        y = model1(x)  # 图结构可能每次都不同
    else:
        y = model2(x)
    
    # PyTorch 必须重新追踪、重新调度、重新分配内存
    loss = criterion(y, target)
    loss.backward()
1
2
3
4
5
6
7
8
9
10

③ Kernel 粒度问题

GPU 上每个小操作都会触发一次 kernel 启动:

python
# 问题:太多小 kernel
x = x + 1      # kernel 1: element-wise add
x = x * 2      # kernel 2: element-wise mul  
x = x - 3      # kernel 3: element-wise sub
x = x / 4      # kernel 4: element-wise div

# 解决方案:Kernel Fusion(核融合)
# 将 4 个 element-wise op 融合成 1 个 kernel
# x = (x + 1) * 2 - 3 / 4  →  single fused kernel
1
2
3
4
5
6
7
8
9

④ 内存访问效率

GPU 的高算力需要高带宽支撑,但不良的内存访问模式会导致"高算力、低效率":

内存墙问题(Memory Wall):
┌────────────────────────────────────────────────────┐
│  A100 FP16 算力: 312 TFLOPS                        │
│  HBM2 带宽:    2 TB/s                             │
│  比值: 每字节内存需要 156K 次浮点运算               │
│                                                    │
│  如果 kernel 复用率低,大量时间浪费在等内存         │
└────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8

1.3 编译优化的潜力 ​

编译优化能带来什么级别的性能提升?看实测数据:

优化技术ResNet-50 加速比Transformer 加速比
无优化 (PyTorch Eager)1.0x (baseline)1.0x (baseline)
torch.compile + Inductor1.5-2.0x1.3-1.8x
XLA + TensorFlow1.8-2.5x1.5-2.0x
TensorRT2.0-3.0x2.0-4.0x
TVM + AutoTVM1.5-2.5x1.3-2.0x
torch.compile + Triton1.8-2.5x1.5-2.2x

为什么能加速? 编译器通过以下手段:

  1. Kernel Fusion:将多个小 op 融合成一个大 kernel,减少内存访问
  2. 内存规划:预分配 GPU 显存,减少 malloc/free 开销
  3. 算子融合:将相邻的 matmul + bias + activation 融合
  4. 常量折叠:将编译时可知的常量直接算出来
  5. 布局优化:选择最优的 tensor 内存布局

第2节 AI 编译器在系统中的位置 ​

2.1 AI 系统全栈架构图 ​

理解编译器,首先要理解它在整个 AI 系统中的位置:

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        AI System Stack (Full Stack)                              │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                        应用层 (Application Layer)                        │    │
│  │   ┌──────────────┐ ┌──────────────┐ ┌──────────────┐                  │    │
│  │   │   PyTorch    │ │  TensorFlow  │ │     JAX      │  ...             │    │
│  │   │  (Eager/FX)  │ │  (Graph/Kera)│ │  (Functional)│                  │    │
│  │   └──────────────┘ └──────────────┘ └──────────────┘                  │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                      编译器层 (Compiler Layer) ⭐ 核心区域               │    │
│  │                                                                         │    │
│  │   ┌─────────────────────────────────────────────────────────────────┐  │    │
│  │   │  前端 (Frontend) - Graph Construction & Optimization            │  │    │
│  │   │  • TorchDynamo / FX / Grappler / XLA                            │  │    │
│  │   │  • 动态图 → 静态图                                                │  │    │
│  │   │  • Shape/Dtype 推理                                              │  │    │
│  │   └─────────────────────────────────────────────────────────────────┘  │    │
│  │                                    ↓                                       │    │
│  │   ┌─────────────────────────────────────────────────────────────────┐  │    │
│  │   │  中端 (Middle-End) - IR Optimization                            │  │    │
│  │   │  • MLIR / TVM Relay / XLA HLO                                   │  │    │
│  │   │  • 算子融合 / 常量折叠 / 代数化简                                 │  │    │
│  │   │  • 布局优化 / 内存规划                                            │  │    │
│  │   └─────────────────────────────────────────────────────────────────┘  │    │
│  │                                    ↓                                       │    │
│  │   ┌─────────────────────────────────────────────────────────────────┐  │    │
│  │   │  后端 (Backend) - Code Generation                               │  │    │
│  │   │  • Inductor / TensorRT / TVM TOPI / XLA Backend                 │  │    │
│  │   │  • LLVM / NVCC / Triton                                         │  │    │
│  │   │  • 生成 GPU kernel / CPU kernel                                  │  │    │
│  │   └─────────────────────────────────────────────────────────────────┘  │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                        运行时层 (Runtime Layer)                         │    │
│  │   ┌──────────────┐ ┌──────────────┐ ┌──────────────┐                  │    │
│  │   │    CUDA      │ │    ROCm      │ │    CPU      │  ...             │    │
│  │   │  (NVIDIA)    │ │   (AMD)      │ │ (x86/Arm)   │                  │    │
│  │   └──────────────┘ └──────────────┘ └──────────────┘                  │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │                        硬件层 (Hardware Layer)                          │    │
│  │   ┌──────────────┐ ┌──────────────┐ ┌──────────────┐                  │    │
│  │   │  A100/H100   │ │    MI300     │ │    Xeon     │  ...             │    │
│  │   │  (NVIDIA)    │ │    (AMD)     │ │ (Intel)     │                  │    │
│  │   └──────────────┘ └──────────────┘ └──────────────┘                  │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

2.2 编译器的核心职责 ​

AI 编译器不是单一组件,而是一整套优化工具链。它的核心职责:

职责具体工作例子
图构造将用户代码转化为计算图PyTorch FX tracing, TF Grappler
图优化在图级别做优化算子融合、常量折叠、公共子表达式消除
算子优化为特定硬件生成高效 kernelTriton kernel fusion
代码生成生成目标硬件的可执行代码LLVM IR → PTX/SASS
内存优化最小化显存占用和访问延迟显存池、零拷贝

第3节 全链路:从 PyTorch 到 GPU 指令 ​

这是最关键的一节。我们追踪一个 PyTorch 模型如何一步步变成 GPU 可执行指令。

3.1 PyTorch → GPU 的完整编译流水线 ​

┌─────────────────────────────────────────────────────────────────────────────────┐
│                    PyTorch → GPU 完整编译链路 (PyTorch 2.x)                     │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  Step 1: Python 代码                                                             │
│  ══════════════════                                                               │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  model = ResNet50()                    # 用户写的 Python 代码           │    │
│  │  x = torch.randn(1, 3, 224, 224)      # 动态创建 tensor                 │    │
│  │  output = model(x)                     # 动态图执行                     │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 2: TorchDynamo 拦截 (graph capture)                                       │
│  ════════════════════════════════════════                                       │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # Dynamo 拦截 Python bytecode,重建计算图                               │    │
│  │  compiled_model = torch.compile(model, backend="inductor")              │    │
│  │                                                                          │    │
│  │  # Dynamo 捕获的 FX Graph:                                                │    │
│  │  # graph():                                                              │    │
│  │  #   %x : [num_users=1] = placeholder[target=x]                         │    │
│  │  #   %conv1 : [num_users=1] = call_module[target=model.conv1](%x)      │    │
│  │  #   %bn1 : [num_users=1] = call_module[target=model.bn1](%conv1)       │    │
│  │  #   %relu : [num_users=1] = call_function[target=torch.relu](%bn1)    │    │
│  │   return %relu                                                          │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 3: FX Graph → Inductor IR                                                 │
│  ════════════════════════════════════════════                                   │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # Inductor 接收 FX Graph,进一步 lower 到自己的 IR                      │    │
│  │                                                                          │    │
│  │  # Inductor IR (类似 loop nest 表示):                                    │    │
│  │  with Scheduler("CPP")(graph) as scheduler:                              │    │
│  │      scheduler.enqueue(convolution_1)      # Conv + BN + ReLU 融合      │    │
│  │      scheduler.enqueue(matmul_1)            # Gemm                         │    │
│  │      scheduler.enqueue(softmax_1)           # Softmax                    │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 4: Inductor Kernel 生成                                                   │
│  ════════════════════════════════════════                                      │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # Inductor 生成 Triton 或 CUDA C++ 代码                                 │    │
│  │                                                                          │    │
│  │  # Triton kernel (融合后的单 kernel):                                   │    │
│  │  @triton.jit                                    # 生成高效融合 kernel  │    │
│  │  def fused_conv_bn_relu(in_ptr, out_ptr, ...):                         │    │
│  │      # 将 Conv + BN + ReLU 三合一,减少 2/3 的显存读写                   │    │
│  │      pid = tl.program_id(axis=0)                                        │    │
│  │      ...                                                                 │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 5: CUDA/PTX → SASS (GPU 机器码)                                          │
│  ════════════════════════════════════════════════════                         │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # NVCC 或 Triton 编译器将代码编译成 GPU 指令                             │    │
│  │                                                                          │    │
│  │  # PTX (Pseudo-Code, 类似汇编):                                         │    │
│  │  ld.global.f16 [%r8], [%r9]           # 加载输入                        │    │
│  │  fma.rn.f16 %r10, %r8, %r11, %r12     # FMA 运算                        │    │
│  │  ReLU: @max(%r10, 0)                   # 激活函数                        │    │
│  │  st.global.f16 [%r13], [%r10]          # 存储输出                        │    │
│  │                                                                          │    │
│  │  # SASS (实际 GPU 机器码,A100):                                        │    │
│  │  I2F R8, R9;                          # int to float                    │    │
│  │  FFMA R10, R8, R11, R12;              # fused FMA                       │    │
│  │  MAX R10, R10, R0;                    # ReLU (融合在同一条指令流)        │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 6: GPU 执行                                                               │
│  ══════════════════════════                                                      │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # GPU 真正执行编译后的代码                                              │    │
│  │                                                                          │    │
│  │  SM 0-107: 各自并行执行 fused kernel                                     │    │
│  │  每 SM 同时处理多个 thread block                                         │    │
│  │  寄存器共享 → L1 cache → L2 cache → HBM                                 │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80

3.2 TensorFlow → GPU 的编译链路 ​

┌─────────────────────────────────────────────────────────────────────────────────┐
│                  TensorFlow → GPU 完整编译链路 (TF 2.x + XLA)                   │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  Step 1: Python 代码                                                             │
│  ══════════════════                                                               │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  model = tf.keras.applications.ResNet50()     # TF Keras 代码            │    │
│  │  x = tf.random.normal([1, 224, 224, 3])      # TF tensor               │    │
│  │  output = model(x, training=False)             # 图执行模式              │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 2: Grappler 图优化 (TF Grappler)                                          │
│  ═══════════════════════════════════════════════════                          │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # Grappler 是 TF 的图优化器,执行一系列优化 pass                         │    │
│  │                                                                          │    │
│  │  # GraphDef (protobuf):                                                 │    │
│  │  node {                                                                │    │
│  │    name: "conv2d"                                                      │    │
│  │    op: "Conv2D"                                                       │    │
│  │    input: "input:0"                                                    │    │
│  │    input: "conv2d/kernel:0"                                            │    │
│  │    attr { key: "padding" value { s: "SAME" } }                        │    │
│  │  }                                                                     │    │
│  │                                                                          │    │
│  │  # Grappler 优化:                                                       │    │
│  │  • Constant folding: 折叠常量节点                                       │    │
│  │  • Layout optimizer: NHWC → NCHW (cuDNN 友好)                          │    │
│  │  • Arithmetic optimizer: 合并乘加运算                                   │    │
│  │  • Remapper: 替换成更高效的融合 op                                      │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 3: XLA 编译 (开启 tf.function(jit_compile=True))                          │
│  ═════════════════════════════════════════════════════════════               │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # XLA (Accelerated Linear Algebra) 将 TF Graph 编译成 HLO               │    │
│  │                                                                          │    │
│  │  # HLO (High Level Operations):                                         │    │
│  │  ENTRY %convolution.10 {                                              │    │
│  │    %Arg_0.1 = f32[1,224,224,3] parameter(0)                           │    │
│  │    %Arg_1.2 = f32[7,7,3,64] parameter(1)                               │    │
│  │    %convolution.6 = f32[1,112,112,64]                                  │    │
│  │      convolution(f32[1,224,224,3] %Arg_0.1,                             │    │
│  │                  f32[7,7,3,64] %Arg_1.2),                               │    │
│  │        window={size=7x7 stride=2x2 pad=3_3_3_3},                       │    │
│  │        dim_labels=b01o_01io->b01o,                                     │    │
│  │        backend_config="convolution_dimension_numbers"                   │    │
│  │    ROOT %tuple = (f32[1,112,112,64]) tuple(%convolution.6)              │    │
│  │  }                                                                     │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 4: XLA HLO 优化 (HLO Optimization)                                        │
│  ════════════════════════════════════════════════════════                    │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # XLA 对 HLO 进行一系列优化                                            │    │
│  │                                                                          │    │
│  │  • AlgebraicSimplifier: 代数化简                                        │    │
│  │  • ConvolutionAlgorithmChooser: 选择最优卷积算法                        │    │
│  │  • LayoutAssignment: 优化内存布局                                       │    │
│  │  • InstructionFusion: 融合相邻指令                                      │    │
│  │  • CollectivePermuteOptimizer: 优化集合通信                             │    │
│  │                                                                          │    │
│  │  # 融合后的 HLO:                                                       │    │
│  │  # Conv + BiasAdd + Activation 融合成一个 fusion                        │    │
│  │  %fused_conv.1 = f32[1,112,112,64] custom-call(...),                    │    │
│  │    calls=%convolution+bias+relu                                        │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 5: LLVM → PTX → SASS                                                      │
│  ════════════════════════════════════════════════════════════                │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # XLA 后端使用 LLVM 生成代码                                            │    │
│  │                                                                          │    │
│  │  HLO → LLVM IR → Machine IR → PTX → SASS                                │    │
│  │                                                                          │    │
│  │  # LLVM IR (中间表示):                                                  │    │
│  │  define void @conv_kernel(ptr %out, ptr %in, ptr %filter) #0 {         │    │
│  │    %ptr = alloca ptr                                                    │    │
│  │    ...                                                                  │    │
│  │    %val = call @llvm.nvvm.ldg.f32.f32(ptr %in)                         │    │
│  │    %result = fmul %val, %filter_val                                    │    │
│  │    store float %result, ptr %out                                        │    │
│  │  }                                                                      │    │
│  │                                                                          │    │
│  │  # PTX (最终生成):                                                      │    │
│  │  .visible .entry _Z12conv_kernel(...)                                  │    │
│  │  ld.global.f32 %f1, [%r2];                                             │    │
│  │  cvt.f32.f32 %f2, %r1;                                                 │    │
│  │  fma.rn.f32 %f3, %f1, %f2, %f4;                                        │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│  Step 6: CUDA Runtime 执行                                                      │
│  ═════════════════════════════                                                  │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # GPU 执行最终生成的 SASS 代码                                          │    │
│  │                                                                          │    │
│  │  cudaModuleLoad()      # 加载编译好的 cubin                             │    │
│  │  cudaModuleGetFunction() # 获取 kernel 函数                              │    │
│  │  cudaLaunchKernel()     # 启动 kernel                                   │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

3.3 ONNX → 多后端编译 ​

ONNX 作为中间格式,可以编译到多个目标后端:

┌─────────────────────────────────────────────────────────────────────────────────┐
│                           ONNX → 多后端编译链路                                  │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  ONNX Model (Protocol Buffer)                                                    │
│  ════════════════════════                                                         │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  # ONNX 模型是 protobuf 格式                                             │    │
│  │  # 包含计算图结构和权重参数                                                │    │
│  │                                                                          │    │
│  │  ir_version: 8                                                          │    │
│  │  opset_import: [""]  # opset version                                     │    │
│  │  graph {                                                               │    │
│  │    node {                                                              │    │
│  │      input: ["input"]                                                  │    │
│  │      output: ["conv_out"]                                              │    │
│  │      op_type: "Conv"                                                   │    │
│  │    }                                                                   │    │
│  │  }                                                                     │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                    ↓                                             │
│              ┌───────────────────┼───────────────────┐                         │
│              ↓                   ↓                   ↓                          │
│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐             │
│  │  ONNX Runtime    │ │    onnx2torch     │ │    onnx2tf         │             │
│  │  (Direct exec)   │ │  (→ PyTorch)      │ │  (→ TensorFlow)   │             │
│  └───────────────────┘ └───────────────────┘ └───────────────────┘             │
│              ↓                   ↓                   ↓                          │
│  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐             │
│  │  ORT → Inductor   │ │  PyTorch FX Graph │ │  TF GraphDef      │             │
│  │  (via ONNX → FX)  │ │  → Inductor       │ │  → Grappler → XLA │             │
│  └───────────────────┘ └───────────────────┘ └───────────────────┘             │
│                                                                                  │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  其他后端:                                                               │    │
│  │  • ONNX → TVM (via ONNX Frontend)                                       │    │
│  │  • ONNX → TFLite (via onnx-tf / onnx2tflite)                           │    │
│  │  • ONNX → TensorRT (via onnx-tensorrt)                                  │    │
│  │  • ONNX → onnx-mlir (→ SPIR-V for GPU/Vulkan)                          │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

第4节 主流编译器生态概览 ​

4.1 编译器横向对比 ​

编译器开发方定位核心优势主要用户
XLAGoogleTF 官方编译器HLO 优化强大、TPU 原生TensorFlow 用户、TPU 用户
TVMApache开源编译器栈硬件无关、AutoTVM/AutoScheduler研究者、自定义硬件用户
MLIRGoogle/LLVM编译器基础设施多级 IR、模块化编译器开发者、新硬件厂商
torch.compileMeta/PyTorchPyTorch 官方编译与 PyTorch 无缝集成PyTorch 用户
TensorRTNVIDIA高性能推理引擎CUDA 深度优化、INT8/FP16推理部署、NVIDIA 用户
TritonOpenAIGPU 编程框架Pythonic、高 throughput深度学习研究者

4.2 XLA 深度解析 ​

XLA (Accelerated Linear Algebra) 是 Google 的开源编译器,现在是 LLVM 的子项目:

python
# TensorFlow 中启用 XLA
import tensorflow as tf

# 方式 1: 全局启用
tf.config.optimizer.set_jit(True)

# 方式 2: 对特定函数启用
@tf.function(jit_compile=True)  # 启用 XLA 编译
def forward(x):
    # XLA 会将这个函数的计算图编译成优化的机器码
    x = tf.layers.dense(x, 256, activation='relu')
    x = tf.layers.dense(x, 128, activation='relu')
    return tf.matmul(x, tf.transpose(x))
1
2
3
4
5
6
7
8
9
10
11
12
13

XLA 优化手段:

优化类型说明效果
Fusion融合多个 op 为一个 kernel减少显存带宽压力
Layout Optimization选择最优 tensor 布局利用硬件特性
Algebraic Simplifier代数化简减少计算量
Constant Propagation常量传播编译期计算
Tuple Simplifier简化元组结构减少内存分配
Batch Norm folding折叠 BN 层减少 kernel 数量

4.3 TVM 深度解析 ​

TVM (Tensor Virtual Machine) 是 Apache 顶级项目,定位为"编译整个深度学习栈":

┌─────────────────────────────────────────────────────────────────────────────────┐
│                              TVM 架构                                            │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  Frontends                    Relay IR                    Backends              │
│  ═════════                    ════════                    ═════════             │
│                                                                                  │
│  ┌──────────┐                ┌─────────────────┐          ┌──────────────────┐  │
│  │ ONNX     │───────┐       │                 │          │ LLVM (CPU/GPU)   │  │
│  └──────────┘       │       │    Relay IR     │          ├──────────────────┤  │
│  ┌──────────┐       ├──────▶│                 │─────────▶│ CUDA (NVIDIA)    │  │
│  │TensorFlow│───────┤       │  (ML 专用 DSL)  │          ├──────────────────┤  │
│  └──────────┘       │       │                 │          │ ROCm (AMD)       │  │
│  ┌──────────┐       ├──────▶│  • 多后端支持    │          ├──────────────────┤  │
│  │ PyTorch  │───────┤       │  • 动态 shape   │          │ Vulkan (GPU)     │  │
│  └──────────┘       │       │  • 符号变量     │          ├──────────────────┤  │
│  ┌──────────┐       ├──────▶│                 │          │ TVM VM          │  │
│  │ MXNet    │───────┘       └─────────────────┘          └──────────────────┘  │
│  └──────────┘                │         │                                        │
│                              │         ▼                                        │
│                              │  ┌─────────────────┐                             │
│                              └──│  Lowering       │                             │
│                                 │  to TE/TIR      │                             │
│                                 └─────────────────┘                             │
│                                              │                                  │
│                                              ▼                                  │
│                                 ┌─────────────────┐                             │
│                                 │   TE (Tensor    │                             │
│                                 │   Expression)   │                             │
│                                 └─────────────────┘                             │
│                                              │                                  │
│                                              ▼                                  │
│                                 ┌─────────────────┐                             │
│                                 │  AutoTVM /      │                             │
│                                 │  AutoScheduler   │                             │
│                                 │  (自动调优)      │                             │
│                                 └─────────────────┘                             │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

TVM 的独特优势:AutoTVM 和 AutoScheduler

python
# TVM 自动调优示例
import tvm
from tvm import autotvm

# 定义调度空间
@autotvm.template("conv2d")
def conv2d(N, H, W, CO, CI, KH, KW, stride, padding):
    # 定义计算
    X = tvm.placeholder((N, CI, H, W), name='X')
    W = tvm.placeholder((CO, CI, KH, KW), name='W')
    Y = tvm.compute(
        (N, CO, (H+2*padding-KH)//stride+1, (W+2*padding-KW)//stride+1),
        lambda n, co, h, w: tvm.sum(
            X[n, ci, h*stride+kh, w*stride+kw] * W[co, ci, kh, kw],
            axis=[ci, kh, kw]
        ), name='Y', tag='conv2d')
    
    # 定义调度
    s = tvm.create_schedule(Y.op)
    # ... 定义调度空间
    
    return s, [X, W, Y]

# 自动搜索最优调度
task = autotvm.task.create("conv2d", args=(1, 7, 224, 64, 3, 224, 224, 1, 1),
                            target='cuda')
tuner = autotvm.tcheduler.GATuner(task)
tuner.tune(n_trial=1000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

4.4 torch.compile 深度解析 ​

PyTorch 2.0 引入的 torch.compile 是 Game Changer:

python
import torch

# 三种编译模式
model = ResNet50()

# 1. default 模式: 平衡编译时间和性能
compiled = torch.compile(model)

# 2. reduce-overhead: 减少 Python 开销
compiled = torch.compile(model, mode="reduce-overhead")

# 3. max-autotune: 最大优化(编译时间长)
compiled = torch.compile(model, mode="max-autotune")

# 4. max-autotune-no-cudagraphs: 禁用 cuDNN graphs
compiled = torch.compile(model, mode="max-autotune-no-cudagraphs")

# 使用
x = torch.randn(1, 3, 224, 224, device='cuda')
output = compiled(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

torch.compile 的编译阶段:

阶段组件说明
DynamoTorchDynamo拦截 Python bytecode,构建 FX Graph
AOTAOTDispatcherAhead-of-time 追踪,用于 export
BackendInductor生成优化后的 kernel
CodegenTriton/C++生成具体硬件代码

4.5 Triton:Pythonic GPU 编程 ​

Triton 让写 GPU kernel 变得像写 NumPy:

python
import triton
import triton.language as tl

@triton.jit
def fused_kernel(
    in_ptr, out_ptr,
    stride_in, stride_out,
    n_elements: tl.constexpr,
    BLOCK_SIZE: tl.constexpr
):
    # Triton 自动处理线程块和内存访问
    pid = tl.program_id(axis=0)           # 获取程序 ID
    block_start = pid * BLOCK_SIZE        # 计算数据偏移
    offsets = block_start + tl.arange(0, BLOCK_SIZE)  # 生成偏移量
    mask = offsets < n_elements            # 边界掩码
    
    # 向量化加载(自动合并内存访问)
    x = tl.load(in_ptr + offsets, mask=mask, other=0.0)
    
    # 融合操作:Conv + BN + ReLU 在一个 kernel 完成
    y = tl.dot(x, weight)                  # Matrix multiply
    y = y + bias                           # Bias add
    y = tl.maximum(y, 0)                   # ReLU
    
    tl.store(out_ptr + offsets, y, mask=mask)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

第5节 编译器的核心矛盾 ​

5.1 动态性 vs 优化空间 ​

这是 AI 编译器面临的最本质矛盾:

┌─────────────────────────────────────────────────────────────────────────────────┐
│                      动态性 vs 优化空间的矛盾                                   │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  动态性(Dynamic)                    优化空间(Optimization)                    │
│  ══════════════════                   ═══════════════════════                    │
│                                                                                  │
│  • 动态 shape: [batch, seq_len, hidden]    • 常量折叠: 编译时计算常数              │
│    运行时才知道具体值                    减少运行时计算                           │
│                                           │                                       │
│  • 条件分支:                           • 算子融合: 合并相邻 op                    │
│    if x > 0:                             Conv + BN + ReLU → 一个 kernel          │
│        y = f1(x)                          │                                       │
│    else:                                 • 内存布局优化:                           │
│        y = f2(x)                          NCHW vs NHWC vs NCHWc                   │
│    运行时才知道走哪条                      │                                       │
│    │                                    • 内存规划:                               │
│  • Python 控制流:                        预分配显存,减少 malloc/free               │
│    for i in range(n):                      │                                       │
│        x = step(x)                      • 代码生成:                                │
│    n 是变量                               生成针对特定硬件优化的代码                 │
│    │                                                                             │
│  • 数据依赖:                                                                          │
│    y = x[mask]  # mask 是 tensor                                                      │
│    无法预知索引                                                                          │
│                                                                                  │
│  ═══════════════════════════════════════════════════════════════════              │
│                                                                                  │
│  结论: 动态性越高 → 编译器能看到的信息越少 → 优化空间越小                          │
│                                                                                  │
│  但动态性是 PyTorch 的核心优势(易用性、debug 友好),不能放弃                       │
│                                                                                  │
│  ═══════════════════════════════════════════════════════════════════              │
│                                                                                  │
│  解决方案:                                                                              │
│                                                                                  │
│  ┌─────────────────────────────────────────────────────────────────────────┐    │
│  │  1. Partial Evaluation (部分求值)                                        │    │
│  │     先编译已知的静态部分,保留动态部分                                      │    │
│  │                                                                              │    │
│  │  2. Speculation (投机执行)                                                │    │
│  │     假设分支走向,反编译优化,错了再回退                                    │    │
│  │                                                                              │    │
│  │  3. JIT Compilation (即时编译)                                            │    │
│  │     运行时收集 shape 信息,动态编译优化版本                                 │    │
│  │                                                                              │    │
│  │  4. Dynamic Shape 专用编译器                                               │    │
│  │     TVM dynamic dispatch、PyTorch AOTAutograd                            │    │
│  └─────────────────────────────────────────────────────────────────────────┘    │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

5.2 各框架的权衡策略 ​

框架策略优点缺点
TensorFlow静态图优先极致优化调试困难
PyTorch动态图优先易用友好优化受限
JAX函数式+jit数学表达优雅学习曲线陡
Triton手动融合性能可控编程门槛高
TVMAuto-tuning硬件无关调优时间长

第6节 学习路径与章节依赖 ​

6.1 章节依赖图 ​

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        AI 编译器系列学习路径                                      │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│                                                                                  │
│     ┌─────────────────────┐                                                      │
│     │  LLM 发展脉络        │                                                      │
│     │  (07-llm-evolution) │                                                      │
│     └──────────┬──────────┘                                                      │
│                │                                                                  │
│                ▼                                                                  │
│     ┌─────────────────────┐                                                      │
│     │ 00-编译器全景        │  ←  你在这里 (起点)                                   │
│     │ (本文件)             │                                                      │
│     └──────────┬──────────┘                                                      │
│                │                                                                  │
│       ┌────────┴────────┐                                                        │
│       ▼                 ▼                                                         │
│  ┌───────────┐    ┌───────────┐                                                  │
│  │01-编译原理 │    │03-计算图  │                                                  │
│  │ 速通      │    │ 表示      │                                                  │
│  └─────┬─────┘    └─────┬─────┘                                                  │
│        │                 │                                                         │
│        │                 │                                                         │
│        ▼                 │                                                         │
│  ┌───────────┐          │                                                         │
│  │02-IR基础  │◀─────────┘                                                         │
│  │(本文件)   │  前置                                                                │
│  └─────┬─────┘                                                                     │
│        │                                                                           │
│        ▼                                                                           │
│  ┌───────────┐                                                                    │
│  │04-MLIR架构│                                                                     │
│  │           │                                                                     │
│  └─────┬─────┘                                                                     │
│        │                                                                           │
│        ▼                                                                           │
│  ┌───────────┐                                                                    │
│  │05-Inductor│                                                                     │
│  │           │                                                                     │
│  └─────┬─────┘                                                                     │
│        │                                                                           │
│        ▼                                                                           │
│  ┌───────────┐                                                                    │
│  │06-TVM深度 │                                                                     │
│  │           │                                                                     │
│  └─────┬─────┘                                                                     │
│        │                                                                           │
│        ▼                                                                           │
│  ┌───────────┐                                                                    │
│  │07-实战部署│                                                                     │
│  │           │                                                                     │
│  └───────────┘                                                                    │
│                                                                                  │
│  ════════════════════════════════════════════════════════════════════════════    │
│                                                                                  │
│  学习顺序建议:                                                                    │
│  1. 先读 00-编译器全景,了解全貌(30分钟)                                        │
│  2. 再读 01-编译原理速通,理解基础概念(45分钟)                                  │
│  3. 然后读 02-IR基础,理解中间表示(45分钟)                                     │
│  4. 03-计算图表示可与 01/02 并行阅读(30分钟)                                   │
│  5. 后续章节按顺序深入(各60分钟+)                                              │
│                                                                                  │
│  预计总学习时间: 4-6 小时                                                         │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

6.2 快速入门路线 ​

如果你只想快速上手部署,看这里:

目标推荐路径所需时间
快速优化 PyTorch 模型00 → torch.compile 章节1小时
部署到 NVIDIA GPU00 → TensorRT 章节2小时
部署到移动端00 → TVM → TFLite 章节3小时
深入理解编译器全系列6小时+

第7节 为什么编译器知识对 AI 工程师重要 ​

7.1 行业趋势 ​

AI 编译器正在成为 AI 工程师的必备技能:

┌─────────────────────────────────────────────────────────────────────────────────┐
│                        AI 编译器的演进趋势                                        │
├─────────────────────────────────────────────────────────────────────────────────┤
│                                                                                  │
│  过去 (2015-2020):                                                              │
│  ══════════════════                                                              │
│  • 框架自带 runtime,无编译器优化                                                │
│  • 性能瓶颈靠手写 CUDA kernel                                                   │
│  • 部署靠原生模型文件                                                            │
│                                                                                  │
│  现在 (2020-2024):                                                              │
│  ══════════════════                                                              │
│  • torch.compile、PyTorch 2.0 发布                                              │
│  • XLA 成为 TF/TPU 标准                                                         │
│  • TensorRT 成为推理标配                                                         │
│  • TVM 在嵌入式/ASIC 领域广泛应用                                               │
│  • Triton 让自定义 kernel 变得简单                                               │
│                                                                                  │
│  未来 (2024+):                                                                  │
│  ══════════════════                                                              │
│  • 编译器成为 AI 框架标配                                                        │
│  • AI 编译器 + AI 芯片深度结合                                                   │
│  • Auto-tuning 成为主流                                                          │
│  • 跨框架编译优化成为可能                                                        │
│                                                                                  │
│  ════════════════════════════════════════════════════════════════════════════    │
│                                                                                  │
│  结论: 编译器知识 = AI 工程师的核心竞争力                                        │
│                                                                                  │
└─────────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

7.2 岗位需求 ​

岗位为什么需要编译器知识
AI 框架开发理解、优化框架的编译流程
模型部署工程师优化推理性能、选择最优后端
AI 芯片工程师开发编译器后端、芯片适配
性能优化工程师定位性能瓶颈、应用编译器优化
MLOps 工程师构建高效推理服务、模型压缩优化

7.3 核心收益 ​

学习 AI 编译器的三大收益:
════════════════════════════════════════════════════════════

✅ 性能提升 2-10x
   编译器能将你的模型性能提升 2-10 倍
   等价于: 节省 50-90% 的硬件成本
   或: 提升 2-10x 的吞吐量

✅ 问题定位能力
   理解编译器 = 理解模型执行全过程
   能够定位: 为什么 GPU 利用率低?
            为什么显存溢出?
            为什么推理这么慢?

✅ 架构思维提升
   编译器是 AI 系统的核心基础设施
   理解它 = 理解 AI 系统的本质
════════════════════════════════════════════════════════════
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

升华 ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                        AI 编译器设计哲学                                      │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  1. 抽象层次决定优化空间                                                       │
│     ┌──────────────────────────────────────────────────────────────────┐     │
│     │ 越高的抽象 → 编译器能看到越多信息 → 优化空间越大                   │     │
│     │ 越低的抽象 → 越接近硬件 → 优化越精细                              │     │
│     └──────────────────────────────────────────────────────────────────┘     │
│                                                                              │
│  2. 动态性是易用性的代价                                                       │
│     ┌──────────────────────────────────────────────────────────────────┐     │
│     │ 动态 shape/控制流 → 易用友好 → 但优化受限                          │     │
│     │ 静态化 → 极致优化 → 但失去灵活性                                  │     │
│     │ 编译器的工作: 在两者之间找到最佳平衡点                              │     │
│     └──────────────────────────────────────────────────────────────────┘     │
│                                                                              │
│  3. 分层解耦是复杂系统的唯一出路                                               │
│     ┌──────────────────────────────────────────────────────────────────┐     │
│     │ Frontend → IR1 → IR2 → ... → IRn → Backend                      │     │
│     │ 每层只做一件事,通过 IR 层级逐步 lowering                          │     │
│     │ 好处: 可组合、可扩展、可维护                                       │     │
│     └──────────────────────────────────────────────────────────────────┘     │
│                                                                              │
│  4. 性能 = 硬件适配 + 算法优化 + 内存优化                                      │
│     ┌──────────────────────────────────────────────────────────────────┐     │
│     │ 硬件适配: 为目标硬件生成最优指令                                   │     │
│     │ 算法优化: 算子融合、代数化简、常量折叠                             │     │
│     │ 内存优化: 布局优化、预分配、零拷贝                                 │     │
│     │ 三者缺一不可,编译器是三者的统一实现                                │     │
│     └──────────────────────────────────────────────────────────────────┘     │
│                                                                              │
└─────────────────────────────────────────────────────────────────────────────┘

核心一句话: AI 编译器是在"表达力"和"性能"之间寻找最优平衡的工程艺术。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

"AI 可查 vs 必须理解"清单 ​

必须理解(不理解就等于不会):

  • 🔴 为什么需要 AI 编译器:硬件算力 vs 软件实现的 gap,200ms vs 50ms QPS 的差距来源
  • 🔴 编译器的三层架构:Frontend (图构造) → Middle-End (IR优化) → Backend (代码生成)
  • 🔴 PyTorch → GPU 的完整链路:TorchDynamo → FX → Inductor → Triton/CUDA → PTX → SASS
  • 🔴 TensorFlow → GPU 的完整链路:TF Graph → Grappler → XLA HLO → LLVM → PTX → SASS
  • 🔴 动态性 vs 优化空间的矛盾:为什么动态图优化困难,编译器的权衡策略
  • 🔴 Kernel Fusion 的原理:为什么融合多个 op 能带来性能提升
  • 🔴 主流编译器的定位差异:XLA (TF/TPU)、TVM (开源/硬件无关)、torch.compile (PyTorch)、TensorRT (NVIDIA 推理)

AI 可查(知道去哪查就行):

  • ✅ 具体的 XLA HLO 操作列表和语义
  • ✅ TVM 的调度原语和 API
  • ✅ Triton kernel 的 API 细节
  • ✅ TensorRT 的 API 和部署流程
  • ✅ ONNX 到各框架的具体转换方法
  • ✅ 某个特定硬件的指令集特性
  • ✅ 某个具体优化 Pass 的实现细节

学习状态:🟡 开始学习

最后更新于:

Pager
上一篇← 人工智能 / Artificial Intelligence
下一篇2. 编译原理速通——面向 ML 工程师的核心概念 / Compiler Fundamentals for Machine Learning Engineers

持续记录,持续成长

Copyright © Tidenflow