芯片层 开放阅读

静态图

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 原生体验一致,printiffor 随便用,调试零门槛。
  • 代价: 每一步都要回 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.condtf.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 节结构 公司投研页 沿产业链找到受益公司 投资课 把概念转成可跟踪模型