中間表示
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 是主要供給來源,閉源晶片廠商(如Apple、特斯拉自研 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” (相關論文及開源社群)
- 注:以上內容基於公開開源社群與產業共識,無具體量化資料,所有技術特性源自官方文件說明。部分行業趨勢分析為定性演繹,未依賴特定檢索資料。