晶片層 開放閱讀

靜態圖

Static Graph

概念 ID
static-graph
更新時間
2026-05-29
來源數量
待補

靜態圖(Static Graph)——深度學習編譯與執行的基石範式


3 秒看懂

靜態圖 = 先畫完整張計算藍圖,再喂資料跑。 把所有運算元、張量形狀、依賴關係一次性”凍結”成一張有向無環圖(DAG),編譯器拿到全圖後可以做極致最佳化(運算元融合、記憶體規劃、並行排程),但圖一旦固化就無法執行時動態改變結構。它是深度學習從”研究玩具”走向”工業部署”的關鍵範式躍遷。


3 分鐘產業解釋

為什麼一個”圖”的概念值得產業級關注?

深度學習架構本質上要回答一個問題:怎麼把使用者寫的 Python 數學表達變成能在 GPU/NPU 上高效跑的機器碼?

這裡存在兩種根本範式:

範式通俗描述代表
靜態圖(Define-then-Run)先把整個計算流程”編譯”成一張圖,然後反覆執行TF 1.x、ONNX、TensorRT、TVM
動態圖(Define-by-Run)寫一行算一行,像 Python 原生執行PyTorch 預設模式、TF Eager

靜態圖的核心價值在於:編譯器拿到全圖資訊後,能做跨運算元的全域性最佳化——這在工業部署中直接轉化為更低延遲、更高吞吐、更少視訊記憶體佔用。

產業位置: 今天的主流實踐是 “訓練用動態圖(靈活),部署轉靜態圖(高效)“。PyTorch 2.0 引入的 torch.compile 正是用 torch.fx 捕獲計算圖後編譯為靜態圖執行,代表了兩種範式的融合趨勢。


15 分鐘專家深入

1. 從”執行”到”編譯”:範式分野的本質

動態圖(Eager Mode):

# PyTorch 風格
a = x @ W1 + b1    # 立刻算
a = relu(a)         # 立刻算
y = a @ W2 + b2     # 立刻算
  • 優點: 和 Python 原生體驗一致,print、if、for 隨便用,除錯零門檻。
  • 代價: 每一步都要回 Python 直譯器排程,無法做跨運算元最佳化;每次執行都要重新排程核心。

靜態圖(Graph Mode):

# TensorFlow 1.x 風格 —— 先定義圖,再啟動 Session 執行
a = tf.matmul(x, W1) + b1
a = tf.nn.relu(a)
y = tf.matmul(a, W2) + b2
# 此時沒有計算發生,只是在建置圖
with tf.Session() as sess:
    result = sess.run(y, feed_dict={x: data})  # 真正執行
  • 核心差異: 整個計算流程被序列化為一張 DAG,編譯器/執行時可以看到全貌。

2. 靜態圖的”全圖視野”帶來什麼最佳化?

這是靜態圖的真正產業價值所在,分三個層次:

層次一:運算元融合(Operator Fusion)

未融合:
  MatMul → 寫回視訊記憶體 → BiasAdd → 寫回視訊記憶體 → ReLU → 寫回視訊記憶體
  (3 次視訊記憶體讀寫, 3 次核心啟動開銷)

融合後:
  FusedMatMulBiasReLU → 寫回視訊記憶體
  (1 次視訊記憶體讀寫, 1 次核心啟動)

融合將多個小運算元合併為一個大運算元,減少視訊記憶體頻寬消耗和 GPU kernel launch 開銷。這在 Transformer 推論中尤為關鍵(如 QKV 投影的融合、Attention 中 softmax+scale 的融合)。

層次二:記憶體規劃(Memory Planning / Liveness Analysis)

編譯器對圖做張量生命週期分析——哪些中間結果在同一時刻存活、哪些已不再需要。據此做:

  • 原位複用(In-place operation): 輸出複用輸入的緩衝區
  • 記憶體重用(Memory reuse): 生命週期不重疊的張量共享同一記憶體塊
  • 換入換出策略: 在視訊記憶體緊張時將非活躍張量解除安裝到主機記憶體

在大型模型訓練中(如數百層 Transformer),啟用值的記憶體規劃直接決定能否跑起來。

層次三:排程最佳化(Scheduling & Parallelism)

全圖可見後,編譯器可以:

  • 識別無依賴的子圖並行執行(如多頭注意力的多個 head 平行計算、殘差分支的獨立前向與合併、無依賴運算元間的水平融合)
  • 重疊計算與通訊(如 AllReduce 通訊與下一層計算 overlap)
  • 跨裝置圖切分(Graph Partitioning):自動決定哪些運算元在哪個 GPU 上執行

3. 靜態圖的核心資料結構

┌─────────────────────────────────────────┐
│           Computation Graph (DAG)        │
│                                         │
│  Node = Operator (運算元)                  │
│    - op_type: "Conv2D", "MatMul", ...   │
│    - attrs: kernel_size, stride, ...    │
│    - inputs: [TensorRef, ...]           │
│    - outputs: [TensorRef, ...]          │
│                                         │
│  Edge = Tensor 資料流                    │
│    - dtype: fp16, bf16, fp32, ...       │
│    - shape: [batch, seq, hidden]        │
│    - device placement                   │
│                                         │
│  Metadata:                              │
│    - Control dependencies               │
│    - Training ops (optimizer, gradient) │
│    - Placement constraints              │
└─────────────────────────────────────────┘

圖的 IR(中間表示)是靜態圖系統的靈魂。不同架構/編譯器有自己的 IR:

  • TensorFlow: GraphDef / SavedModel(Protocol Buffer 序列化)
  • ONNX: 開放標準 IR,跨架構互操作的橋樑
  • MLIR(Multi-Level IR): Google 主導的多層級編譯器基礎設施,支援從高層圖 IR 到低層硬體 IR 的逐層 lowering
  • torch.fx: PyTorch 的圖捕獲 IR,用於 torch.compile 的前端

4. 靜態圖的固有挑戰

挑戰說明
動態形狀(Dynamic Shape)序列長度、batch 大小不固定時,靜態圖需要為每種 shape 編譯一個特化版本,或引入 shape 符號化抽象
控制流(Data-dependent branching)if x > 0 這類資料依賴的分支在靜態圖中需要特殊運算元(如 tf.cond、tf.while_loop),表達力受限
除錯困難圖編譯後的執行與使用者原始程式碼失去直接對應關係,報錯資訊晦澀
迭代開銷研究階段頻繁修改模型結構時,每次都要重新”建圖→編譯”,開發體驗差

技術原理

靜態圖建置與執行的完整流程

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  使用者 Python  │     │  圖建置階段   │     │  圖最佳化階段   │
│  API 呼叫     │────▶│  (Build)     │────▶│  (Optimize)  │
│              │     │              │     │              │
│ tf.matmul()  │     │ 生成 DAG IR  │     │ 運算元融合      │
│ tf.relu()    │     │ 節點+邊+屬性  │     │ 常量摺疊      │
│ tf.Variable  │     │              │     │ 死程式碼消除    │
│              │     │              │     │ 版面配置轉換      │
└──────────────┘     └──────────────┘     └──────────────┘
                                                │
                                                ▼
                     ┌──────────────┐     ┌──────────────┐
                     │  執行階段     │     │  程式碼生成/    │
                     │  (Run)       │◀────│  核心編譯     │
                     │              │     │  (CodeGen)   │
                     │ Session.run()│     │              │
                     │ 或等價呼叫   │     │ 生成裝置程式碼  │
                     │              │     │ 或調優核心庫  │
                     └──────────────┘     └──────────────┘

靜態圖與動態圖的關鍵機制對比

                    靜態圖                          動態圖
                    ──────                          ──────
建置時機:      前向+反向全部建置完畢後才執行     每個 op 立即執行
圖結構:        一次建置,反覆執行(引數更新)     每次執行隱式重建圖
Python 互動:   建置期有,執行期無(圖已脫離Python) 每步都回 Python 排程
最佳化能力:      全圖最佳化(融合/排程/記憶體規劃)     僅單運算元級別最佳化
控制流:        需專用運算元(cond/while_loop)     原生 Python if/for
除錯:          困難(需專用工具如 TensorBoard)   簡單(標準 pdb/列印)
典型延遲:      核心啟動少,排程開銷低             每步有 Python 排程開銷

靜態圖中的控制流處理

這是理解靜態圖”表達力邊界”的關鍵:

# Python 原生控制流(動態圖天然支援)
if x.sum() > 0:
    y = x * 2
else:
    y = x * -1

# 靜態圖中的等價表達(TensorFlow 1.x 為例)
y = tf.cond(
    tf.reduce_sum(x) > 0,
    lambda: x * 2,
    lambda: x * -1
)
# 兩條分支都會被編譯進圖,執行時根據條件選擇執行哪條
# 代價:兩條分支的記憶體都會被分配(或需要條件記憶體分配機制)

迴圈同理:

# 靜態圖中的迴圈(tf.while_loop)
result = tf.while_loop(
    cond=lambda i, _: i < 10,   # 迴圈條件
    body=lambda i, acc: (i+1, acc+x),  # 迴圈體
    loop_vars=[0, tf.zeros_like(x)]
)
# 迴圈次數可以在執行時動態確定,不需要在圖建置時已知最大值;
# 但若迴圈體內張量形狀變化,需通過 shape_invariants 引數指定形狀約束以避免編譯衝突

圖最佳化 Pass 示例

編譯器對靜態圖施加的最佳化 Pass(以推論場景為例):

原始圖:
  Input → Conv2D → BatchNorm → ReLU → Conv2D → BatchNorm → ReLU → Output

Pass 1 - BN 融入 Conv(Fold BatchNorm):
  Input → [Conv2D+BN_fused] → ReLU → [Conv2D+BN_fused] → ReLU → Output
  (將 BN 的 scale/bias 合併到 Conv 的權重中, 推論時消除 BN 計算)

Pass 2 - 運算元融合:
  Input → [FusedConvBNReLU] → [FusedConvBNReLU] → Output
  (Conv+BN+ReLU 合併為單個核心呼叫)

Pass 3 - 常量摺疊 + 精度轉換:
  Input(fp16) → [FusedConvBNReLU(fp16)] → [FusedConvBNReLU(fp16)] → Output(fp16)
  (將常量預計算, 並將精度降低以利用 Tensor Core)

這種多 Pass 流水線在 TensorRT、TVM、XLA 中是標準實踐。


技術演進史

時期事件意義
~2017Google 釋出 TensorFlow 1.0靜態圖成為工業標準範式,“建圖→Session 執行”流程主導了早期 AI 工業化
~2017ONNX 格式由 Meta(時稱 Facebook)與 Microsoft 聯合發起靜態圖的開放互操作標準,打通訓練→部署的跨架構流轉
~2016–2017PyTorch 開源,以動態圖(define-by-run)體驗迅速崛起研究社群大量轉向動態圖,倒逼 TF 等架構改善易用性
~2017TVM(陳天奇等)釋出將編譯器技術引入深度學習,通過靜態圖的自動調優實現跨硬體部署
~2019TensorFlow 2.0 引入 Eager Execution 為預設模式TF 內部也承認動態圖對研究的重要性,但保留 tf.function 實現圖編譯
~2019MLIR 由 Google Chris Lattner 提出並開源多層級 IR 基礎設施,統一從高層圖到低層硬體的編譯鏈路
~2020JAX 崛起(Google),以 jit 裝飾器做 tracing-based 靜態圖編譯證明”Pythonic 體驗 + 函式式語義 + 自動圖捕獲”的路線可行
~2023PyTorch 2.0 釋出 torch.compile,引入 torch.fx + dynamo + Inductor動態圖架構向靜態圖編譯融合的標誌性事件——“動態建置,靜態執行”
~2023–至今AI 編譯器成為基礎設施競爭焦點(Triton、XLA、MLIR 生態擴張)靜態圖編譯不再是”TF vs PyTorch”的路線之爭,而是所有架構的公共底座

核心趨勢: 靜態圖沒有”消亡”,而是從使用者介面層退隱到編譯器底層。使用者寫動態圖程式碼,架構在背後捕獲並編譯為靜態圖執行。兩種範式走向融合。


技術路線對比

維度純靜態圖(TF 1.x 風格)純動態圖(PyTorch Eager)混合模式(torch.compile / JAX jit)
使用者體驗差(反直覺的建圖模式)優(等同 Python)良(Pythonic + 首次編譯等待)
除錯難度高低中(需理解 graph break 等概念)
全圖最佳化能力強無強(編譯階段)
動態形狀支援差(需 shape 符號化)天然支援中(正在快速改善)
控制流表達受限(專用運算元)原生 Python部分受限(需 traceable)
推論部署效能優秀一般優秀
跨裝置圖切分成熟手動發展中
當前產業地位遺留/部署主導研究/訓練主流新範式方向

關鍵結論: 純靜態圖作為使用者介面已被動態圖取代,但作為編譯目標仍是所有高效能執行的基石。


上下游

上游:誰提供/需要靜態圖?

使用者程式碼(Python)
    │
    ▼
深度學習架構(PyTorch / TensorFlow / JAX / PaddlePaddle)
    │
    ├── 圖捕獲(Graph Capture / Tracing)
    │     • torch.fx / torch.dynamo
    │     • tf.function / AutoGraph
    │     • JAX jit (jaxpr)
    │
    ▼
靜態計算圖 IR
    │
    ├── 標準化格式:ONNX
    └── 架構內部 IR:GraphDef / MLIR dialect

下游:靜態圖流向哪裡?

靜態圖 IR
    │
    ├──▶ 編譯器後端(最佳化 + 程式碼生成)
    │     ├── XLA(Google,服務 TPU/GPU)
    │     ├── TensorRT(NVIDIA,GPU 推論加速)
    │     ├── TVM / Apache TVM(跨硬體)
    │     ├── Triton(OpenAI,GPU kernel 編寫)
    │     └── 各廠商自研編譯器(昇騰 MindSpore 圖編譯等)
    │
    ├──▶ 模型序列化與交換
    │     └── ONNX → 各推論引擎(ONNX Runtime、TensorRT 等)
    │
    └──▶ 分散式執行引擎
          └── 圖切分 → 跨裝置排程(多 GPU/多節點)

關鍵中介軟體:ONNX 的角色

ONNX(Open Neural Network Exchange)是靜態圖領域的”通用語言”:

  • 定義了一套標準運算元集(運算元版本持續演進)
  • 模型以 Protocol Buffer 格式序列化(.onnx 檔案)
  • 訓練架構匯出 → ONNX → 推論引擎匯入,是目前最廣泛的跨架構部署路徑

關鍵指標

評估靜態圖質量(或編譯器效果)的核心指標:

指標說明
首編譯時間(Time-to-First-Inference)從圖建置到首次可執行的耗時,靜態圖系統通常較長
推論延遲(Latency)單次前向傳播耗時,靜態圖最佳化後的核心優勢
吞吐量(Throughput)單位時間處理樣本數,batch 越大靜態圖優勢越明顯
視訊記憶體峰值(Peak Memory)圖最佳化(記憶體重用/原位操作)可顯著降低
運算元融合率融合運算元數 / 總運算元數,衡量編譯器最佳化深度
圖捕獲覆蓋率能被成功編譯的程式碼佔比(混合模式下,未覆蓋部分退回 eager)
跨 shape 泛化能力同一編譯結果能覆蓋多少種輸入形狀(動態 shape 支援)

供需與市場資料

為什麼靜態圖(編譯最佳化)成為產業熱點?

  1. 模型越來越大,部署成本飆升: 大語言模型推論成本是訓練成本的持續消耗項。靜態圖編譯最佳化(運算元融合、量化、記憶體最佳化)是不改變模型就能降低推論成本的最直接手段。

  2. 硬體碎片化: NVIDIA GPU、AMD GPU、Google TPU、國產 NPU、行動端 NPU……硬體越來越多。靜態圖作為編譯器的輸入,是實現**“一次建圖,多硬體部署”**的關鍵抽象層。

  3. 編譯器人才稀缺: 能做 AI 編譯器(融合編譯器技術 + 深度學習 domain knowledge)的團隊全球極少。掌握 MLIR、TVM、XLA 等技術的工程師成為各廠爭奪的稀缺資源。

市場規模參考

靜態圖編譯最佳化不是獨立產品類別,而是嵌入在以下市場中:

  • AI 編譯器/推論最佳化工具鏈:嵌入在推論架構(TensorRT、ONNX Runtime、各廠自研引擎)中,整體推論最佳化市場隨 AI 部署規模同步擴張。
  • AI 基礎設施軟體:各雲端廠商/AI 公司均在自研或定製編譯器棧,作為差異化競爭力的核心組成部分。

[未充分揭露] 獨立的”靜態圖編譯”市場規模資料,因其作為技術元件嵌入更大系統中。可參考推論伺服器/架構相關市場規模作為間接指標。


代表公司與資本對映

公司/組織靜態圖相關版面配置角色
GoogleXLA(TPU/GPU 編譯器)、MLIR(開源 IR 基礎設施)、JAX(jit 編譯)、TF SavedModel編譯器基礎設施主導者
NVIDIATensorRT(推論編譯最佳化)、TensorRT-LLM、cuDNN 圖級 APIGPU 推論最佳化的事實標準
Meta / PyTorchtorch.compile(dynamo + Inductor)、torch.fx、ExecuTorch動態圖→靜態圖融合的推動者
Apache TVM 專案TVM / Unity(自動調優編譯器,跨硬體)開源跨平台編譯器代表
OpenAITriton(GPU kernel DSL,被 Inductor 後端採用)Kernel 程式設計新範式
MicrosoftONNX Runtime(跨平台推論引擎)、ONNX 標準聯合主導推論部署中介軟體
華為MindSpore 圖編譯(CANN 運算元編譯)、昇騰推論引擎國產 AI 編譯器自主路線
百度PaddlePaddle 靜態圖(早期定位 + PHI 運算元庫)國產架構代表
IntelOpenVINO(模型最佳化與推論部署)、oneDNN邊緣推論最佳化
AppleCore ML(模型編譯與部署)、MLX(動態+編譯混合)端側部署編譯

投資邏輯

核心觀點

靜態圖不是”一個產品”,而是 AI 基礎設施中不可替代的編譯最佳化層。

投資對映思路

  1. “賣鏟子”邏輯 —— 編譯器/推論引擎廠商:

    • NVIDIA(TensorRT 是其推論護城河的核心元件)
    • 具備自研 AI 編譯器能力的雲端廠商(Google、華為、百度等)在推論成本上有結構性優勢
  2. “路基”邏輯 —— 編譯器基礎設施:

    • MLIR 已成為事實上的編譯器 IR 標準,圍繞 MLIR 的工具鏈和人才是稀缺資源
    • Triton 等 kernel DSL 正在重塑 GPU 程式設計範式
  3. “瓶頸”邏輯 —— 硬體碎片化催生編譯器需求:

    • 每出一款新 AI 晶片,都需要編譯器適配。編譯器能力直接決定硬體的實際可用效能
    • 國產 AI 晶片的競爭,很大程度上是編譯器生態的競爭

風險提示

  • 編譯器技術壁壘高但商業模式不易獨立成立(通常嵌入更大產品中)
  • 架構高度碎片化導致編譯器生態分裂,標準統一程序不確定
  • 硬體迭代速度快,編譯器需持續跟進,研發投入大

常見誤讀糾偏

誤讀 1:“靜態圖已經被淘汰了,現在都用動態圖”

糾偏: 靜態圖作為使用者介面確實已非主流,但作為編譯器目標從未離場——恰恰相反,它的重要性在增加。torch.compile 的本質就是把動態圖程式碼捕獲為靜態圖再編譯執行。JAX 的 jit 同理。**“動態圖做介面,靜態圖做執行”**是當前範式,不是靜態圖消亡。

誤讀 2:“靜態圖不能處理動態形狀”

糾偏: 靜態圖處理動態形狀確實更復雜,但並非不可能。解決方案包括:

  • 形狀符號化(Symbolic Shapes): 用符號變量表示未知維度,編譯時生成含符號的通用核心,執行時特化
  • 多版本編譯: 為常見的幾種 shape 各編譯一個版本,執行時根據實際 shape 選擇
  • Dynamic Batching: 推論引擎層面將不同長度的請求 padding 到統一 shape

XLA 和 TensorRT 近年都在大幅改善動態 shape 支援。準確說法是”靜態圖處理動態 shape 的開銷更高、更復雜”,而非”不能”。

誤讀 3:“TensorFlow = 靜態圖,PyTorch = 動態圖”

糾偏: 這是 2017–2019 年的刻板印象。TF 2.x 預設 Eager + tf.function 圖編譯;PyTorch 2.0 的 torch.compile 本質也是圖編譯。兩種架構都在融合兩種範式,區別更多在於編譯器實現路徑和社群生態,而非”靜態 vs 動態”的二元對立。

誤讀 4:“靜態圖一定比動態圖快”

糾偏: 靜態圖提供了最佳化的可能性,但不自動等於更快。一張沒有經過任何最佳化 Pass 的靜態圖,執行效率可能和動態圖相當甚至更低(序列化/反序列化開銷)。真正的效能優勢來自於編譯器最佳化(融合、排程、記憶體規劃)。另外,如果模型很小(如簡單 MLP),動態圖的排程開銷可以忽略,靜態圖的優勢不顯著。靜態圖的效能優勢隨模型複雜度和 batch size 增大而增大。


學習路徑

入門(理解概念)

  1. PyTorch 官方文件 torch.compile 教程 —— 從動態圖到編譯的體驗
  2. TensorFlow tf.function 指南 —— 理解 AutoGraph 如何將 Python 轉為圖
  3. 動手:用 Netron 工具視覺化一個 ONNX 模型,觀察靜態圖的節點與邊

進階(理解最佳化)

  1. 學習 TVM 教程(TVM 文件中的 “Tensor Operations” 和 “Optimizing Operators” 章節)
  2. 閱讀 XLA 概述文件 —— 瞭解 Google 的圖編譯最佳化 Pass
  3. 研究 TensorRT 的最佳化流程(層融合、精度校準、Kernel Auto-tuning)

深入(理解編譯器)

  1. 研讀 MLIR 概念論文 “MLIR: A Compiler Infrastructure for the End of Moore’s Law”(Chris Lattner et al.)
  2. 閱讀 PyTorch 2.0 架構部落格(dynamo → AOTAutograd → Inductor 的 pipeline)
  3. 研究陳天奇 TVM 論文 “TVM: An Automated End-to-End Optimizing Compiler for Deep Learning”

實踐

  1. 將一個 PyTorch 模型匯出為 ONNX,用 ONNX Runtime 對比最佳化前後的推論延遲
  2. 用 torch.compile 編譯一個 Transformer 模型,觀察 compilation time vs inference speedup 的權衡
  3. 嘗試在 Triton 中編寫一個自定義融合運算元,理解 kernel 編譯層面的最佳化

一句話總結

靜態圖是深度學習從”能跑”到”跑得快”的技術基石——使用者介面層面它已讓位於動態圖的靈活性,但在編譯器底層,它作為全域性最佳化的唯一載體,正成為 AI 基礎設施中最關鍵的隱性競爭力。


延伸閱讀與來源

資源型別說明
TVM 論文:TVM: An Automated End-to-End Optimizing Compiler for Deep Learning學術論文AI 編譯器領域的奠基性工作
MLIR 論文:MLIR: Scaling Compiler Infrastructure for Domain Specific Computation學術論文現代 AI 編譯器 IR 基礎設施
PyTorch 2.0 官方部落格 / Architecture Overview官方文件理解 dynamo + Inductor 架構
TensorFlow Graph 指南官方文件經典靜態圖系統的設計思路
NVIDIA TensorRT Developer Guide官方文件推論編譯最佳化的工業實踐
ONNX 官方文件(onnx.ai)標準文件靜態圖互操作標準
Deep Learning Compilation (陳天奇 talks / TVM tutorials)教程/演講編譯器技術的直覺建立
Triton 文件(triton-lang.org)官方文件GPU kernel 程式設計新範式

注:本文技術描述基於深度學習編譯領域的公開論文、架構文件與社群共識。具體架構版本的效能資料因硬體、模型、配置差異較大,建議以實際 benchmark 為準。市場資料方面,AI 編譯器尚無獨立市場研究,相關判斷基於產業觀察定性分析。

source: 公開揭露與公開資料整理 本頁僅用於產業鏈學習、資訊檢索和研究輔助;不構成投資建議,不預測漲跌,不提供買賣、部位或目標價建議。
完整概念頁 複盤 13 節結構 公司投研頁 沿產業鏈找到受益公司 投資課 把概念轉成可跟蹤模型