章节摘要:厘清 ONNX 中间表示、ORT 分层架构与 InferenceSession 生命周期。读完能解释「为什么同一份 .onnx 在不同 EP 上行为可能不同」,并独立完成 PyTorch → ONNX 的首轮导出验证。
部署链路的第一段是"把训练好的模型变成一张可移植的计算图"。三个问题会反复出现:第一,导出的 .onnx 文件到底长什么样,为什么有时候 onnx.load 能读、ORT 却跑不起来;第二,InferenceSession 创建之后发生了什么,为什么创建耗时波动巨大;第三,Session、EP、Kernel 这些术语在代码里分别对应什么,报错信息里提到的名字和文档里的架构图如何一一对上。本章用三节依次拆解:1.1 讲 ONNX 格式与导出参数,1.2 讲 ORT 内部四层结构与 Session 生命周期,1.3 讲核心术语与张量数值契约。
创建 InferenceSession 时发生的事远比"读文件"多:解析模型、做形状推断、按优化级别跑图变换、按 EP 的 GetCapability 分区、为每个节点选 kernel、规划内存。这个流程走完,session.run 才真正开始执行。理解这张图,是后面五章的共同前提。
| 节 | 主题 | 解决的核心问题 | 关键产出 |
|---|---|---|---|
| 1.1 | ONNX 格式与导出链路 | 导出后 ORT 报错或 shape 对不上 | 可用 torch.onnx.export 脚本 + 双重验证 |
| 1.2 | ORT 架构与 Session 模型 | Session 创建到 run 的时序与混合执行 | SessionOptions/providers 最小配置 |
| 1.3 | 核心术语与张量契约 | EP/Kernel/OrtValue 关系与跨 EP 数值差异 | 数值验收基线方案 |
session.run 的性能与行为由"优化级别 + EP 组合 + 内存策略 + 线程数"共同决定,第2、3、4章分别展开其中一项torch.onnx.export 导出一个两层 MLP,用 onnx.checker.check_model 通过onnxruntime.InferenceSession 加载,比较 get_providers() 与实际 devicegraph_optimization_level 为 BASIC 与 ALL,对比 session.run 首次耗时sess.get_session_options() 确认配置生效