onnx之优化器
之前的OpenPPL有个章节讲到过优化器onnx里面也有个优化器相关介绍如下一、优化器的本质ONNX Core Optimizer 是在图级别工作的与EPExecution Provider无关。textONNX模型计算图→ Optimizer图变换→ 优化后的计算图 → EP执行关键点优化器在EP之前运行它不关心后续是哪个EP执行。二、优化器对两类EP的影响1. 解释型EP逐个算子调用如CPUExecutionProvider、CUDAExecutionProvider基础模式text优化后的图 → EP逐个调用算子内核优化器有效的原因虽然EP是逐个算子执行但图结构已经改变例如ConvBN被融合成一个节点 → EP只需调用1次而不是2次算子数量减少内核调用次数减少实际效果优化对解释型EP的效果常量折叠✅ 减少计算量算子融合✅ 减少内核调用死代码消除✅ 减少执行节点2. 编译型EP如TensorRT、OpenVINO如TensorrtExecutionProvider、OpenVINOExecutionProvidertext优化后的图 → 编译型EP接收 → 进一步做硬件级优化 → 生成特定引擎优化器仍然有效编译型EP虽然会做自己的优化但接收的图越干净编译效果越好例如ONNX Optimizer 先融合ConvBNTensorRT 就不需要再处理这个模式减少编译型EP需要处理的工作量三、优化器的生效时机text时间线 ─────────────────────────────────────────────────────────→ 1. 创建Session ↓ 2. 加载模型 ↓ 3. 【优化器运行】 ← 时刻 ↓ 4. 图变换完成 ↓ 5. EP获取优化后的图 ↓ 6. EP执行解释型或编译编译型代码层面pythonsess_options ort.SessionOptions() sess_options.graph_optimization_level ort.GraphOptimizationLevel.ORT_ENABLE_ALL session ort.InferenceSession(model.onnx, sess_options) # ↑ 在这一步优化器已经运行完毕四、为什么编译型EP也需要图优化以 TensorRT 为例优化层级谁做作用图级优化ONNX Optimizer减少节点数简化结构层融合TensorRT垂直融合如ConvBNRelu内核选择TensorRT选择最优CUDA内核内存规划TensorRT显存复用如果图级优化没做TensorRT需要处理更复杂的图结构可能错过某些融合机会编译时间更长五、总结问题答案优化器对解释型EP有用吗有用减少节点数减少内核调用优化器对编译型EP有用吗有用简化图结构帮助编译型EP做更好优化优化器什么时候运行EP之前Session创建时编译型EP会重复优化吗会但接收优化后的图效果更好解释型EP是逐个算子调用优化器通过减少算子数量来加速编译型EP有自己的优化层但上游优化让它的工作更高效。两者是互补而非替代关系。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2466851.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!