Python模型保存为ONNX格式_跨平台推理部署与加速技巧
torch.onnx.export 导出失败主因是模型含动态结构或 ONNX 不支持算子需用 eval() 和 no_grad()、正确配置 dynamic_axes、替换不支持操作并验证 shape/数值一致性。torch.onnx.export 为什么导出失败常见报错和绕过方法导出失败大多卡在模型动态结构或不支持的算子上不是代码写错了而是 PyTorch 和 ONNX 的语义对不上。RuntimeError: Exporting the operator xxx to ONNX opset version xxx is not supported说明用了 ONNX 不认的自定义/高阶操作比如 torch.einsum、torch.scatter_reduce优先替换成等价的 torch.matmul torch.sum 或改用 opset_version18需 torch ≥ 2.1TypeError: forward() missing 1 required positional argument传给 torch.onnx.export 的 args 必须是 tuple哪怕只有一个输入也要写成 (x,)不是 x模型里有 if x.shape[0] 1: 这类依赖 tensor shape 的控制流ONNX 静态图无法表达得提前用 torch.jit.trace 或重写为 torch.whereexport 时要不要用 torch.no_grad() 和 eval()要而且必须显式调用否则训练态的 dropout/batchnorm 会被导出导致推理结果不一致甚至崩溃。model.eval() 关闭所有可训练层的特殊行为比如 BN 使用 running stats 而非 batch statstorch.no_grad() 不仅省显存还能防止某些 autograd-only 算子如 torch.autograd.grad意外混入计算图顺序很重要先 model.eval()再进 torch.no_grad() 块最后调用 torch.onnx.exportinput_names / output_names 和 dynamic_axes 怎么配才不出错名字本身不影响推理但 dynamic_axes 是 ONNX Runtime 加载时做 shape 推导的关键配错会导致运行时报 InvalidArgument。input_names[input] 和 output_names[output] 只是符号名和后续推理代码里的 binding 名字要对上但不强制一致dynamic_axes{input: {0: batch, 2: height}, output: {0: batch}}键必须是 input/output 名值 dict 的 key 是维度索引从 0 开始value 是该维度的逻辑名同一个逻辑名如 batch在多个 tensor 间共享才能被 ONNX Runtime 正确绑定如果某维固定为 1如 NLP 的 seq_len512就别放进 dynamic_axes否则 ONNX Runtime 会认为它可变反而限制部署灵活性导出后怎么快速验证 ONNX 模型能跑通别急着扔进生产环境先用 ONNX Runtime 做最小闭环验证重点看输出 shape 和数值是否合理。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521202.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!