章节摘要:Graph Processing Engine 在 Session 创建时对 ONNX 图做常量折叠、算子融合、布局变换与分区,是「同模型不同延迟」的第一杠杆。
模型导出成功后,Session 创建阶段会先过一遍图优化流水线。这里决定四件事:哪些常量计算被提前算掉(常量折叠)、哪些相邻算子被合并成单个 kernel(算子融合)、张量按什么内存布局存放(布局改写)、整张图被切成几块交给谁执行(图分区)。四个决定共同影响最终延迟,但调试时最容易被忽略——因为图优化是"创建期行为",Profile 里只看到 run 阶段的结果,看不到优化本身。
典型现象:同一个模型,graph_optimization_level 从 ORT_ENABLE_BASIC 换到 ORT_ENABLE_ALL,首帧延迟差几倍;明明只有 GPU,Profile 里却出现大量 Memcpy——这通常是分区把图切碎了,边界拷贝吃掉了 GPU 的收益。本章三节分别讲清加载与折叠、融合与布局、分区与委派。
| 阶段 | 输入 | 输出 | 典型收益 |
|---|---|---|---|
| 图加载 | .onnx 文件 | 验证后的 Graph | 结构合法、shape 明确 |
| 常量折叠 | Graph | 无常量子图的 Graph | 首帧更快、节点数减少 |
| 算子融合 | Graph | 融合后 Graph | kernel launch 减少 |
| 布局改写 | Graph | 偏好布局的 Graph | 对齐 EP 的 NCHW/NHWC |
| 图分区 | Graph + EP 能力 | 若干子图 | 决定拷贝边界 |
| 节 | 主题 | 核心问题 | 关键产出 |
|---|---|---|---|
| 2.1 | 图加载与常量折叠 | 加载期做什么、首帧为什么慢 | 优化级别对比实验 |
| 2.2 | 算子融合与布局改写 | 融合收益机制与失败原因 | 融合前后 Profile 对比 |
| 2.3 | 图分区与子图委派 | 边界拷贝如何吃掉收益 | 分区配置与边界审计 |
图优化阶段的可见性来自日志与环境变量。用 ORT_LOG_LEVEL=VERBOSE 能看到每个 pass 的决策;用 sess_options.optimized_model_filepath 导出优化后的图,再用可视化工具对比优化前后结构。Section 2.1 会给出对比 BASIC 与 EXTENDED 创建耗时的标准做法。