静态图 是先建好整张图再灌数据;动态图 是边运行边建图。区别在于图什么时候被构建、建完能不能改 。
本质上不管是静态图还是动态图都是由3个部分组成的Tensor、算子(Ops)、依赖关系Edge
这是我们在图捕获得到静态/动态图之后需要这个图Lowering到相应的中间层IR做相关的优化。可以看
三大基本概念
| 概念 | 角色 | 例子 |
|---|---|---|
| 张量 Tensor | 数据载体(边) | 输入 x、权重 W、中间结果 h |
| 算子 Op | 计算单元(节点) | MatMul、Add、ReLU |
| 依赖关系 Edge | 决定执行顺序 | 谁是谁的输入/输出 |
计算图 = 算子 + 张量 + 依赖关系。三者缺一不可。
静态图 vs 动态图
| 维度 | 静态图 | 动态图 |
|---|---|---|
| 建图时机 | 运行前一次性建好 | 运行时逐操作构建 |
| 图结构 | 固定不变 | 每次运行可变 |
| 定义与执行 | 分离 | 合一 |
| 控制流 | 专用算子(tf.cond) | 直接用 Python if/while |
| 调试 | 难 | 易 |
| 优化 | 全局优化强 | 优化受限 |
| 速度 | 快、可预测 | 灵活但开销略大 |
| 部署 | 图可序列化,方便 | 常需转换 |
| 代表 | TF 1.x、tf.function | PyTorch、TF 2.x Eager |
形象比喻
- 静态图:先画好电路图,再通电。图固定,数据流过。
- 动态图:边走边铺路。走到哪建到哪,用完就丢。
控制流差异(最直观)
静态图:两条分支都画进图里,运行时选一条
动态图:只建实际走到的那条分支
现代框架的折中
开发阶段(动态图) 部署/加速(静态图)
易调试、灵活 ──► 高性能、可部署
PyTorch: Eager ──► torch.compile / TorchScript
TF 2.x: Eager ──► @tf.function
趋势:默认动态图,需要时编译成静态图。
最终结论
-
计算图 = 算子 + 张量 + 依赖关系。
-
静态图赢在性能和部署 ,动态图赢在灵活和易调试。
-
现代框架不再二选一,而是动态为主、静态为辅,兼顾开发效率与运行性能。
静态图 动态图 先建完整图 边运行边建图 │ │ ▼ ▼ 结构固定、可优化 结构灵活、易调试 │ │ ▼ ▼ 部署快、性能好 开发快、控制流自然 │ │ └──────────┬──────────────┘ ▼ 现代框架:默认动态 + 按需静态