章节摘要:ORT 通过 SEQUENTIAL/PARALLEL 执行模式、Arena 内存池与 intra/inter 线程控制推理并发。显存碎片与 CPU 超线程争用是 P99 抖动的常见根因。
图优化决定了"怎么算更快",执行流与内存决定"算的时候资源怎么分"。三个问题在这一章集中出现:第一,execution_mode 选 SEQUENTIAL 还是 PARALLEL,选错反而变慢;第二,模型理论占用 2GB 显存,ORT 实际占 2.8GB,碎片与过度预分配怎么治;第三,线程配置从网上抄来 intra=16, inter=16,在 GPU 场景或边缘设备上反而把 P99 拉爆。三个问题的共同点是:资源维度的调优必须绑定 EP 与硬件,不能跨场景照搬。
| 资源维度 | 控制项 | 生效场景 |
|---|---|---|
| 算子间调度 | execution_mode | 全 EP |
| 算子内并行 | intra_op_num_threads | CPU EP |
| 算子间并行 | inter_op_num_threads | PARALLEL 模式 |
| 中间张量复用 | Arena / mem_pattern | 静态 shape |
| 显存预分配 | arena_extend_strategy | CUDA/CPU Arena |
| 节 | 主题 | 核心问题 | 关键产出 |
|---|---|---|---|
| 4.1 | 顺序与并行推理模式 | PARALLEL 反而变慢怎么办 | mode 选择决策表 |
| 4.2 | Arena 内存池与复用 | 显存占用超理论值 | 内存治理清单 |
| 4.3 | 线程与 SessionOptions | P99 抖动与 CPU 争用 | 线程配置矩阵 |
算子间并行 vs 算子内并行。
BFC/Arena、显存碎片与 enable_mem_pattern。
intra_op_num_threads、inter_op_num_threads 调优。
资源类问题一律"先量后调":先用 Profile 确认是算子间串行瓶颈、内存分配瓶颈还是线程争用,再改对应配置。改完必须对比 P50 与 P99 两组指标——平均延迟改善但尾延迟恶化,说明资源被极端抢占,不是有效优化。
本章三个主题可以压缩成一句话:算力资源(GPU/CPU 核)怎么并发、内存资源(显存/堆)怎么复用。两张表把本章的决策浓缩:
内存治理三问:张量能复用吗(Arena)、生命周期能预知吗(mem_pattern)、扩容怎么定(arena_extend_strategy)。线程治理三问:GPU 主导吗(intra/inter 归 1)、CPU 有几个物理核(intra 绑核数)、有没有可并行分支(inter 从 1 起步)。
| 症状 | 第一怀疑 | 第二怀疑 |
|---|---|---|
| 显存超理论值 | mem_pattern 未开 | Arena 碎片 |
| 首次 run 卡顿 | mem_pattern 首次规划 | conv algo 搜索 |
| P99 抖动 | 线程争用 | 分区边界拷贝 |
| OOM | 扩容策略 | 并发 Session 数 |
资源调优最容易"改完不知道有没有用",因为测量本身有噪声。三条纪律:第一,用 P50 与 P99 双指标,只看均值会掩盖抖动;第二,每次只改一个变量,改完跑同一份 benchmark;第三,把配置写入策略文件而不是散落在代码里,方便回归对比。第6章会把这些纪律落成可复用的 Profile 流程。
enable_mem_pattern 前后对比显存占用(nvidia-smi 或 memory_allocated)