章节摘要:从 ORT_ENABLE_PROFILE 定位热点算子,用 SessionOptions 策略化调参,再在 CI 中固定 ONNX opset、ORT 版本与 EP 组合。性能工作从「手工改参数」升级为可观测、可回归的治理闭环。
前五章把"怎么跑、在哪跑、怎么分资源、怎么压缩"都讲完了,第6章收口成两条线:怎么知道瓶颈在哪(Profiling)与怎么让性能可回归(策略化 + CI)。没有 profile,优化就是盲改;没有 CI 门禁,升级一次 ORT 或换一次 EP 就可能让线上指标静默恶化。
闭环的四步:Profile 定位热点 → 把调参沉淀成命名策略 → 策略随部署 manifest 发布 → CI 回归验证并回到第一步。性能不再是"上线前调一次",而是持续可观测、可回滚的工程活动。
| 环节 | 方法 | 产出物 |
|---|---|---|
| 定位 | ORT_PROFILE / perf_test | Top 算子耗时报告 |
| 调参 | 命名策略包 | low_latency_edge 等 |
| 部署 | metadata + manifest | 版本契约 |
| 回归 | CI 门禁 | 精度 + 延迟指纹 |
| 节 | 主题 | 核心问题 | 关键产出 |
|---|---|---|---|
| 6.1 | Profiling 与瓶颈定位 | 40ms 花在了哪里 | Top 算子 + 瓶颈分类 |
| 6.2 | SessionOptions 调优参数 | 参数组合怎么管 | 命名策略包 |
| 6.3 | 部署模式与 CI 实践 | 升级后如何不翻车 | 版本契约 + CI 门禁 |
ORT_PROFILE、perf_test 与算子耗时占比。
策略单元与 Provider 专有选项。
云/边/端部署与版本契约。
性能治理的三原则贯穿本章:可测量——没有 profile 不谈优化;可回归——每项改动进 CI 有基线对比;可回滚——策略与版本分离,出问题一条命令回滚。三原则把性能工作从"上线前调一次"变成"持续治理"。
| 原则 | 手段 | 反例 |
|---|---|---|
| 可测量 | ORT_PROFILE + 指纹 | 凭感觉调参 |
| 可回归 | CI 门禁 + 基线 | 升级后指标恶化 |
| 可回滚 | 策略版本化 | 参数散落代码 |
| 症状 | 快速定位 | 章节 |
|---|---|---|
| 首帧慢 | 图优化级别 / conv algo | 6.2 |
| 单算子占大头 | Top 算子 | 6.1 |
| 换版本后漂移 | 参数映射 diff | 6.2 |
| 升级后精度崩 | 版本契约 + 回归 | 6.3 |
| P99 长尾 | 线程/内存 | 6.1 |
| 线上比离线慢 | 指纹 diff | 6.1 |
每次调参都留一条结构化记录,字段固定:日期、模型版本、ORT 版本、EP、策略名、改动参数、P50/P99 前后、业务指标、结论。这条记录是团队性能资产的原子单位——半年后没人记得的事,记录记得。
# 调参记录模板 - date: 2025-01-15 - model: model.onnx (sha256 前8位) - ort: 1.17.0 / ep: tensorrt - policy: cloud_trt_fp16_v2 - change: trt_max_workspace_size 1G -> 2G - p50: 9.1 -> 8.2 ms - p99: 15.4 -> 13.9 ms - metric: mAP 0.921 -> 0.920(噪声内) - conclusion: workspace 提升融合,保留
| 术语 | 含义 |
|---|---|
| ORT_PROFILE | ORT 的 profiling 开关,输出 JSON trace |
| Performance Fingerprint | 关键算子和 P99 的性能基线 |
| Policy | 命名的 SessionOptions 参数组合 |
| Contract | 模型 metadata 里声明的部署契约 |
| Model Drift | 线上分布偏移导致指标退化 |