数据截至 (上游 commit c187ef3271d5)
06 · torch.compile 编译栈:从字节码到 Triton kernel
这一章讲什么:
torch.compile(model)这一行背后那套三段式流水线(Dynamo → AOTAutograd → Inductor)。读完你会知道:图是从哪抓的、抓不到怎么办、反向图是谁画的、Triton kernel 是谁写的。
1. 它要解决的小问题
eager 模式逐行调度算子,每个 *、+ 都是一次 dispatcher 往返 + 一次 kernel 启动;小算子密集时,GPU 大部分时间在等 CPU 发活。
想要快,就得把一连串算子融合成少数几个大 kernel——这需要拿到「整段计算」的图。但 PyTorch 是 eager 框架,用户代码里可能混着 print、logging、数据依赖控制流,图没法靠 AST 静态分析拿到。
torch.compile 的回答:不读你的源码,直接在解释器层拦截字节码,跑一遍就知道你干了什么。
2. 流水线全景
你的代码 fn(x) / model(x)
│
▼
① Dynamo 拦截 CPython 帧 → 逐条解释字节码 → FX 图 + guards
(torch/_dynamo/) 解释不了 → graph break,该段回落 eager
│
▼
② AOTAutograd fake tensor 跑一遍前向 → 联合图 → partitioner 切出
(torch/_functorch/) 前向图与反向图(编译期就把反向也编译好)
│
▼
③ Inductor 调度(哪些算子融合)→ codegen → Triton(GPU) / C++(CPU) kernel
(torch/_inductor/)
│
▼
运行时 guards 命中 → 直接跑编译产物;不命中 → 重编译或回落