一句话定义:动态图(Eager Mode)是“边执行边建图”,每行代码立即运行;静态图(Graph Mode)是“先建图、再执行”,把计算描述成一张图后交给运行时或编译器统一优化。
打个比方:动态图像你照着菜谱一步步做菜,切完菜马上炒,随时尝味道调整;静态图像先把整条工艺流程写清楚,再交给中央厨房批量生产。后者能提前看到所有步骤:哪些能合并,哪些能并行,哪些中间结果不用存,哪些算子能换成更快实现,还能减少 Python 解释器反复调度的开销。所以同一个模型换成图模式,常常能快一截,尤其在推理、固定形状、重复迭代的场景。训练也能用图,但控制流和动态形状一多,收益与难度都会上升。
动态图的优势是调试直观:能打断点、打印张量、跟着 Python 控制流走,报错通常就在那一行。图模式则先捕获再执行,报错可能变成图级别的,堆栈和变量名容易丢失,断点也不直观;动态 shape、随机数和 Python 副作用需要额外处理。两者并非二选一,主流框架通常支持切换或混合使用。相近概念也要区分:图模式不等于编译,但常借助编译器;也不等于分布式,更不等于 ONNX 这类交换格式。
| 维度 | 动态图 Eager | 静态图 Graph |
|---|---|---|
| 执行方式 | 立即执行 | 先捕获后执行 |
| 调试体验 | 直观 | 间接、门槛高 |
| 性能空间 | 灵活但有调度开销 | 优化空间大 |
| 控制流 | Python 原生 | 需图内表达 |
| 典型场景 | 研究、调试 | 部署、稳定负载 |
对从业者,实用策略是:先用动态图验证正确性,再用图模式提速;遇到瓶颈先做性能分析,再决定是否图化;注意固定 batch 或序列长度,避免图里夹杂 Python 副作用。对普通人,你用的聊天、翻译或推荐服务偶尔“预热”后变快,背后可能就是在建图编译。具体框架支持范围与行为,以官方页面为准。
