中间表示
3 秒看懂
中间表示 (IR) 是深度学习编译器在将模型从框架语言(如 PyTorch、TensorFlow)转换到硬件可执行代码的过程中,所使用的一种或多种结构化中间描述。它把“面向开发者的表达”与“面向底层的优化和代码生成”解耦,使得同一份模型能经优化后高效运行在不同硬件上。
3 分钟产业解释
在深度学习工程化落地中,IR 是整个软件栈的“脊柱”。它让 AI 芯片厂商不再需要为每一种前端框架重写整个编译器,也令框架开发者不必为每一种硬件适配全套优化。典型的流程是:
- 框架导出图 IR(如 TorchScript IR、TF GraphDef),或由捕获工具(TorchDynamo)将动态图跟踪为中间表示。
- 进入图级优化(算子融合、内存规划、常量折叠)。
- 下降到张量级或指令级 IR(如 XLA 的 HLO、TVM 的 TIR、MLIR 的各种方言)。
- 最终由后端生成目标硬件代码。
目前主流的 IR 体系正在向可扩展、多层级的方向收敛,其中MLIR(多级中间表示)成为产业协同的重点,它允许自定义方言(Dialect),兼顾高层计算图与低层循环优化。其他重要 IR 还包括 ONNX(面向推理的交换格式)、OpenXLA 中的 StableHLO、TorchInductor 使用的中间表示等。
15 分钟专家深入
IR 并非是单一格式,而是一个分层的编译抽象体系。在深度学习中,IR 需要承载:
- 计算图拓扑:有向无环图(DAG)及控制流(if、loop),需保留精确依赖关系。
- 张量形状与数据类型:支持符号形状推导(如 dynamic shape),否则必须在运行时重新编译。
- 算子语义:标准算子库(如 conv2d、matmul)的语义定义,既要精确定义舍入误差行为,又要保持硬件无关性。
- 内存与布局:内存步长(strides)、数据布局(NCHW vs NHWC)的抽象,使编译器能自动插入变换。
- 高级优化标记:如并行策略、融合边界、精度模式(fp16/bf16/int8)。
专家使用 IR 时常面临“表达力 vs 优化确定性”的权衡:更抽象的 IR 描述更简洁但丢失硬件细节,导致 unpredictable performance;过低的 IR 贴近硬件却损害可移植性。MLIR 通过可嵌套的方言部分缓解了这一矛盾——可以用“linalg”方言描述线性代数操作,用“gpu”方言描述 GPU 特异性,再用“scf”处理循环结构,统一在同一个方言下进行渐进式降级(lowering)。
在 TVM 的 Relay 中,IR 采用函数式 SSA(静态单赋值)形式,支持 let-binding 与递归,使得自动微分和梯度裁剪可以编码进 IR 层。XLA 的 HLO 则严格采用静态形状,计算图展开为 HLO 指令序列,适合于 TPU 等数据流架构的自动布局与分片。
最新的趋势是将 IR 与高性能代码生成器紧耦合:如 PyTorch 2 的 Inductor 将后台 FMHA(融合多头注意力)等模式匹配直接输出到 Triton 或 CUDA kernel,其抽象层称为“Inductor IR”或“Prim IR”,它是一种类张量表达式的 SSA 形式,兼具层级下降能力。
技术原理
多层 IR 体系与降级流程
深度学习编译器通常采用三层 IR 架构,以 TVM 和 MLIR 为典型:
Frontend Model (PyTorch / TF)
│ (trace or export)
▼
High-level Graph IR (Relay / StableHLO / Torch FX Graph)
│ 图级优化:算子融合、常量折叠、内存规划、形状推导
▼
Mid-level Tensor IR (TIR / Linalg+Affine)
│ 张量化:循环分块、向量化、内存作用域插入、共享内存 promotion
▼
Low-level IR / Codegen (LLVM IR, CUDA C, target dialect)
│ 寄存器分配、指令调度、二进制生成
▼
Executable Binary
关键机制:
- SSA 形式与 use-def 链:每个中间值只被赋值一次,使数据依赖分析可以快速完成,是死代码消除、公共子表达式消除的基础。
- Dialect(方言):MLIR 允许在同一模块内混合使用不同抽象层次的 IR,通过合法的“转换”将高层方言降级到低层。例如,
tosa.conv2d→linalg.conv_2d→affine.for+memref.load/store→gpu.launch+nvvm。 - 形状推导与动态形状:支持符号维度的 IR 必须携带 shape 函数,优化过程采用“符号整型”推断维度,部分框架会回退到运行时编译(JIT)以处理 unknown dimensions。
- 内存规划:在 IR 层通过 buffer 内联、内存复用和复制消除,可大幅降低峰值显存占用,这在大型 MoE 模型中效果显著。
- 算子融合:图 IR 中通过匹配“生产者-消费者”模式将多个算子合并为一个 kernel,消除中间张量的显存访问。常见融合模式包括 conv-bias-relu、layernorm-后面跟随的注意力等。
并行策略的 IR 表达
分布式训练中的模型并行(张量并行、流水线并行、数据并行)在编译栈中需要 IR 承载。例如,Megatron 风格张量并行需要在 IR 层插入 AllReduce/ReduceScatter 通信操作(非 All-to-All,后者多见于 MoE 的 expert dispatch)。这些通信算子作为 IR 算子,由编译器分配设备并生成相应的集合通信库调用。IR 中的 sharding 注解(如 sharding dialect)可以描述多维分片方案,指导 lower 过程生成 SPMD 代码。
技术演进史
- 框架内 IR 的萌芽(2015-2017):TensorFlow 提出静态计算图 GraphDef,Caffe 使用 Prototxt,它们可以视为最初步的图 IR。但优化能力有限,且与框架紧耦合。
- XLA 与 HLO 成型(2017):Google 推出 XLA 编译器,定义 HLO(High-Level Optimizer)IR,专为 TPU 和张量计算设计。它将 TF 图转为 HLO,进行大量代数优化和融合。
- TVM 引入分层 IR(2018):TVM 提出 Relay(高层函数式 IR)与 TIR(低层张量 IR),首度将 IR 分层的理念普及到深度学习编译领域,使开发者可以自定义硬件后端。
- ONNX 标准化(2017-2019):ONNX 成为跨框架交换的广义 IR,聚焦推理阶段,定义了统一的算子集和版本管理,让模型一次导出多处运行。
- MLIR 挑战单层 IR(2019-2021):Google 开源 MLIR,用方言组装 IR 基础设施,影响巨大。它被集成到 TensorFlow、JAX、TF Lite、IREE 等多个项目中。
- PyTorch 2 的全流程 IR 化(2022-2023):PyTorch 引入 TorchDynamo 捕获 Python 字节码,生成 FX Graph(一种图 IR),再经 Inductor 使用 Wrapper IR 生成 Triton/C++ 内核。同时参与 OpenXLA,推动 StableHLO。
- 产业趋同:2023-2025 年,StableHLO 成为 OpenXLA 的统一输入 IR,MLIR 成为多方的基础设施,各家硬件厂商都基于 MLIR 构建自己的编译栈。
技术路线对比
| 维度 | MLIR+方言 | XLA/HLO 生态 | ONNX | TVM Relay/TIR | TorchInductor IR |
|---|---|---|---|---|---|
| 设计哲学 | 可组合、多级方言,任意扩展 | 单一级别、严格静态形状,张量计算优化 | 可移植的推理格式,标准化算子 | 函数式高层 + 命令式低层,硬件解耦 | 以 Python 为中心的动态图捕获 + 即时代码生成 |
| 优化能力 | 极强,支持跨方言优化,适合全流程 | 强,代数优化、融合、内存分析,面向 TPU/GPU | 中等,主要靠后端实现,标准受限 | 强,自动调度与张量优化,适用于定制硬件 | 强,擅长 Python 级自动微分与融合,依赖 Triton/CUDA |
| 硬件支持 | 最广泛,自研芯片几乎都基于 MLIR | 主要 Google TPU 和 NVIDIA GPU(通过 PJRT) | 各类硬件,但受算子集限制 | CPU、GPU、专用加速器,需要手动开发后端 | NVIDIA GPU(Triton/CUDA),扩展到其他需依赖 Triton 支持 |
| 灵活性 | 极高,可引入自定义方言,混合层次 | 较低,受 HLO 语义约束,动态形状支持弱 | 中,通过 operators 扩展和自定义域 | 高,可以手写调度原语,接近底层 | 较高,通过 torch.compile 自动捕获,用户可控性较弱 |
| 生态成熟度 | 快速增长,已成为事实标准的基础设施 | 稳定,在 Google 内部及外部采用广泛 | 成熟,推理领域存量最大 | 成熟,研究与应用场景广,是很多 AI 芯片的编译起点 | 发展极快,依托 PyTorch 用户基础 |
注:以上对比为定性描述,基于公开设计属性,未引用具体版本性能数据。
上下游
- 上游:深度学习框架(PyTorch、TensorFlow、JAX)、AI 建模者。框架使用 IR 将 Python 代码转化为可优化的形式,需要保证与原有动态语义的兼容性。
- 中游:编译优化厂商和项目(如 OpenXLA、TVM 社区、MLIR 社区),他们维护 IR 的中间层、优化 pass 管道、方言转换规则。
- 下游:AI 芯片供应商(NVIDIA、AMD、Intel、华为、Google TPU、Graphcore、Groq、各类 NPU 公司等),他们将自己的编译器后端对接至标准 IR,或开发专有方言来实现最优映射。此外,部署工具链(如 TensorRT、OpenVINO、ONNX Runtime)将 IR 转换为推理 engine。
IR 层实质上定义了生态的接口话语权:拥有良好 IR 标准的一方,上游能吸引更多框架,下游能绑定更多芯片。
关键指标
衡量 IR 及其编译栈质量的主要技术指标(无具体数据,采用定性描述):
- 端到端延迟:推理时一帧或一批次从输入到输出的时间,对比框架直接运行,编译优化带来的加速比是核心指标。
- 吞吐量:单位时间处理的最大样本数,常受 IR 中内存融合与流水线编排影响。
- 编译时间:IR 生成和优化所需时长,尤其对于大型 MoE 或动态形状模型,编译开销可能抵消运行加速。
- 峰值显存占用:IR 优化后的 runtime memory,内存规划 pass 是其关键。
- 算子覆盖率:IR 所能表达的原始框架算子比例,未覆盖的算子会回退到框架执行(“graph break”),降低性能。
- 优化成功率:特定模式(如 attention、layernorm)被识别并替换为高效 fused kernel 的比例。
供需与市场数据
由于深度学习编译器及 IR 多为开源基础设施,独立市场数据稀缺且未形成单独的商业市场。然而,作为 AI 编译技术栈的核心组件,其战略价值在 AI 芯片和训练部署平台竞争中不断升高。
- 需求端:大模型(LLM、多模态)的参数量从十亿迈向万亿,使得手动优化的 kernel 已经跟不上模型结构演进,对编译器 IR 的自动化优化需求呈爆炸式增长。AI 推理芯片每增加一种,都需要适配,拉动对统一 IR 解决方案的需求。
- 供应端:主要由开源社区和大型科技公司提供。MLIR、OpenXLA、TVM、ONNX 是主要供给来源,闭源芯片厂商(如苹果、特斯拉自研 NPU)内部也会自研 IR 编译栈。目前尚未出现以 IR 为产品的纯商业化公司,更多被融入整体工具链中。
- 市场趋势:IR 层正在从“软件基础设施”向“硬件生态护城河”演进,芯片公司倾向于构建基于 MLIR 的闭源方言以锁定开发者,框架方则试图通过统一 IR 来降低硬件依赖。整体未出现独立第三方市场报告的具体规模数据([未检索到公开独立报告])。
代表公司与资本映射
| 公司/组织 | 关键 IR 项目/产品 | 角色 |
|---|---|---|
| XLA(HLO, StableHLO)、MLIR、IREE | IR 基础设施的主要贡献者,通过 OpenXLA 推动标准化 | |
| Meta | PyTorch 2(TorchDynamo, FX, Inductor IR)、Glow | 前端 IR 捕获与编译,Inductor 后端已将 Triton 作为重要 low-level IR |
| NVIDIA | TensorRT(带 ONNX 支持及内部 IR)、CUDA 编译器(NVVM IR) | 从上层 IR 到 GPU 原生代码的优化与部署 |
| 华为 | MindSpore(MindIR / GHLO,集成 TVM 与 MLIR 技术) | 面向昇腾 NPU 的编译栈,使用类 MLIR/TVM 多级 IR |
| Intel | OpenVINO IR | 面向 CPU/GPU/VPU 的跨平台推理 IR |
| 阿里 | BladeDISC(基于 MLIR 的 AI 编译器) | 动态形状支持与集群化推理,为 MLIR 方言的产业应用 |
| Groq / Graphcore | 专用 IR 编译栈 | 自研芯片的全部优化都依赖自定义 IR,是其技术壁垒之一 |
资本映射方面,以上多为大型科技公司内部项目,并未单独融资。AI 芯片初创公司的估值很大程度上包含其编译栈(含 IR)的技术能力,但 IR 本身不构成独立估值单元。投资者更多关注围绕 IR 形成的生态粘性:掌握 IR 标准的公司对上下游有更强的议价和集成能力。
投资逻辑
- 生态锁定效应:IR 类似于操作系统的 API,一旦框架和模型大量基于某种 IR 生态(如 OpenXLA 的 StableHLO),切换成本高,从而形成持久的竞争力。投资掌握主导 IR 生态的龙头公司(如 Google、Meta)或其深度合作方具有长期价值。
- 硬件适配成本壁垒:AI 芯片创业公司如果能够高效地将 MLIR 方言转换为自有硬件代码,可以显著降低客户迁移成本。因此,编译栈 IR 技术是 AI 芯片初创公司的核心护城河之一。
- 工具链标准化红利:ONNX、MLIR 等开放标准的普及,降低了推理环节的硬件锁定,受益的是能提供最优性能的实现厂牌,而非 IR 持有者本身。投资逻辑转向“执行效率的领先者”,而非“格式的定义者”。
- 风险点:若大模型训练逐渐收敛于少数大型基础模型,定制优化 kernel 可能再度占据主导,削弱通用 IR 的优化价值;另外,若 PyTorch 完全锁定在 Inductor/Triton 路径下,可能削弱其他 IR 生态的份额。
注:以上基于产业逻辑推演,未提供具体投资建议与数字。
常见误读纠偏
- “IR 就是 ONNX 的一种”:ONNX 只是众多 IR 中的一种,专为推理可移植设计。深度学习编译器内部往往有多层 IR,ONNX 更像是标准化的交换 IR,而非优化执行的完整 IR。
- “同一个 IR 优化就能保证在所有硬件上性能一致”:IR 只是抽象的中间表示,真正高效执行需要后端的精细调度和代码生成,硬件特性(如 Tensor Core 尺寸、内存带宽)会极大影响最终性能,IR 层无法消除这种差异。
- “动态图不需要 IR”:PyTorch eager 模式在执行时不显式构建全局图 IR,但 torch.compile 正是使用 TorchDynamo 捕获字节码并生成 FX IR;JAX 也是将所有计算带成 HLO IR。可以说,现阶段几乎所有高性能执行都会经过某种形式的 IR。
- “采用 MLIR 就解决一切适配问题”:MLIR 提供的是框架,具体的方言、转换和优化仍然需要大量人力开发,构建高质量的编译流程需要深厚的编译器经验,并非简单地换成 MLIR 即可。
学习路径
- 基础铺垫:了解编译器基本概念(词法分析、语法分析、优化、代码生成),推荐《编译原理》(龙书) 前几章,或观看 LLVM 相关教程。
- 入门实践:通过 TVM 官方教程学习 Relay 和 TIR,用 AutoTVM 跑通一个模型优化,直观感受图 IR 到张量 IR 的 lowering。
- 深入 MLIR:阅读 MLIR 文档(mlir.llvm.org)下的 “Toy Tutorial”,从头构建一个方言,理解 dialect conversion。再到深度学习领域的方言(Torch-MLIR、TF-MLIR)。
- XLA 与 HLO:研究 XLA 操作语义(StableHLO spec),通过 JAX 示例观察
jax.jit生成的 HLO,使用xla.call_module等工具。 - 产业前沿:关注 PyTorch 2 的
torch.compile和Inductor如何生成 Triton 代码,研究 OpenAI Triton 自身的 IR。
一句话总结
中间表示 (IR) 是深度学习从模型代码到硬件指令的解耦枢纽,既抽象了计算图语义,又为多层编译优化提供了落地载体,其演进直接定义着 AI 软件栈的灵活性和效率边界。
延伸阅读与来源
- MLIR 官方文档: https://mlir.llvm.org/
- TVM 开源项目与论文: “TVM: An Automated End-to-End Optimizing Compiler for Deep Learning” (OSDI 2018), https://tvm.apache.org/
- XLA 架构: “XLA: Optimizing Compiler for Machine Learning” (2017), OpenXLA 项目: https://github.com/openxla
- ONNX 规范: https://onnx.ai/onnx/
- PyTorch 2 技术博客: “Introducing PyTorch 2.0” (pytorch.org/blog)
- 阿里 BladeDISC 介绍: “BladeDISC: A Dynamically Shaped AI Compiler Based on MLIR” (相关论文及开源社区)
- 注:以上内容基于公开开源社区与产业共识,无具体量化数据,所有技术特性源自官方文档说明。部分行业趋势分析为定性演绎,未依赖特定检索数据。