真实面经题目 · 原创解析
推理优化中为什么常把动态图转成静态图再做算子融合,转换开销如何评估和控制?
这题考动态图和静态图在推理优化中的取舍,重点是静态图提供全局依赖、shape、pattern 和内存信息,便于融合和调度优化;转换开销要靠缓存、shape bucketing、warmup、fallback 和端到端摊销控制。
真实面经题目 · 原创解析
这题考动态图和静态图在推理优化中的取舍,重点是静态图提供全局依赖、shape、pattern 和内存信息,便于融合和调度优化;转换开销要靠缓存、shape bucketing、warmup、fallback 和端到端摊销控制。
动态图的优势是灵活,适合开发和条件分支多的模型,但它在运行时逐步执行,框架很难提前看到完整依赖关系、shape 范围、常量、内存生命周期和可融合 pattern。推理优化常把稳定子图转成静态图,是因为静态图能做全局分析:识别 Conv/MatMul 后接 bias、activation、scale、dequant、residual、norm 等 pattern,做算子融合;做常量折叠、公共子表达式消除、shape 推断、layout 传播、内存复用和调度规划;还可以生成 engine cache、CUDA Graph 或专用 kernel,减少 launch 和中间 tensor 读写。转换本身当然有开销,包括 trace/export、shape specialization、编译优化、engine build、缓存查找和动态 shape 失配。处理方式不是每次请求都转换,而是只对稳定热路径做转换,通过 warmup、离线编译、按 model version/dtype/device/shape bucket 缓存、懒编译、增量编译、fallback 和命中率监控来摊销。是否值得做要看端到端收益:转换成本能否被多次请求复用,融合是否减少中间访存和 launch,动态 shape 覆盖率是否足够,以及语义等价和精度是否通过回归。
动态图按运行时控制流即时执行,开发灵活、调试直接,适合动态分支和不稳定 shape。静态图提前拿到一段计算的节点、边、shape、常量和依赖关系,牺牲一部分灵活性,换来全局优化空间。推理阶段输入模式相对稳定,因此更容易从静态图优化中获益。
算子融合不是把任意两个算子硬拼。优化器需要知道数据依赖、广播规则、shape、dtype、layout、副作用和中间结果是否被其他节点复用。静态图能识别 MatMul + bias + activation、dequant + GEMM、norm + residual、attention 子图等 pattern,并确认融合后语义等价。动态图逐步执行时很难稳定获得这些全局信息。
除了融合,静态图还可以做常量折叠、死节点删除、公共子表达式消除、shape 推断、layout 传播、算子重排、内存生命周期分析和 buffer reuse。对 GPU 推理来说,这些优化能减少中间 tensor 写回、减少显存峰值、减少 kernel launch,并让调度器更容易生成 CUDA Graph 或 engine cache。
动态图转静态图可能包括 trace/export、图规范化、shape specialization、pattern rewrite、kernel 选择、engine build、内存规划、序列化和缓存查找。动态 shape 或控制流变化还可能导致缓存失配、重新编译或 fallback。面试里要承认这些开销真实存在,而不是默认静态图一定更快。
线上通常不会每个请求重新转换。常见做法是离线或 warmup 阶段预编译高频 shape;按模型版本、硬件、dtype、batch、seq length bucket 和优化选项建立 cache key;对长尾 shape 使用通用 fallback;对新 shape 做懒编译或异步编译。shape bucketing 可以提高缓存命中率,但 bucket 太粗会带来 padding 和无效计算。
评估时要看转换耗时、cache 命中率、编译摊销次数、融合后端到端延迟、显存峰值、p95/p99、不同 shape 的覆盖率和 fallback 频率。还要做语义等价、数值误差、动态控制流、异常输入和边界 shape 回归。静态图优化的目标是稳定热路径收益,而不是消灭所有动态图能力。
能执行不代表能充分优化。动态图适合灵活执行,但缺少提前的全局依赖和 shape 信息;静态图能做 pattern rewrite、内存规划、layout 传播和 launch 减少,更适合稳定推理热路径。
主要是减少中间 tensor 写回、减少显存读写、减少 kernel launch、提高 cache 局部性、降低显存峰值,并让后端能选择更专用的 kernel 或 engine。
会增加难度,但不一定失效。可以用 shape bucketing、symbolic shape、部分子图静态化、通用 fallback 和 cache 命中率监控来处理。关键是只优化稳定高频路径。
看一次转换或编译成本、后续 cache 命中次数、每次请求节省的端到端时间,以及该 shape 在真实流量中的频率。如果热 shape 复用多,摊销更容易成立。
融合可能改变计算顺序、累加精度、广播处理、边界 shape 或异常值路径。即使数学上等价,浮点误差和框架语义细节也可能导致输出差异,所以必须回归验证。