10.模型简化和加速常用工具和方法 1.常见的和ONNX Simplifier相似的网络优化工具工具是否原生 PT优化方式输出格式对标 onnxsim 程度TorchScriptMobileOptimizer✅原生静态图离线优化.pt(TorchScript)⭐⭐⭐⭐⭐ 官方平替Torch-FX✅原生手动图改写.pth/.pt(权重)⭐⭐⭐⭐onnxsimonnx2tf❌中转 ONNX成熟图精简.pt/pt2⭐⭐⭐⭐⭐ 复用最强优化onnxoptimizer❌中转 ONNX细粒度自定义优化中转 onnx 再转 pt⭐⭐⭐⭐⭐torch.compile✅原生运行时即时优化无法离线存优化 pt⭐⭐⭐2.各工具的优化内容2.1 ONNX Simplifier1.适用场景ONNX Simplifier 本质是ONNX 计算图语法级轻量化工具核心做几类优化消除冗余节点恒等映射、未使用的中间张量、多余 Reshape/Unsqueeze/Squeeze、连续 ConvBN 融合、Dropout 去除、冗余 Cast 类型转换常量折叠把编译期就能算完的常量运算提前固化为权重减少运行时计算算子合并连续的矩阵乘 加、多段拼接、冗余分支裁剪清理导出残留PyTorch/TensorFlow 导出时自动插入的训练用算子、控制流占位节点。适合CNN、ResNet、YOLO、Transformer 视觉模型、常规检测 / 分割 / 分类、简单 LSTM 等静态拓扑、无动态控制流的模型2.不能优化 / 极易失败的几类模型1. 带动态控制流的模型最常见不支持场景ONNX Simplifier 对If、Loop、Scan等控制流算子支持很差循环推理的 RNN、GRU、LSTM 动态循环版本带条件分支的模型根据输入阈值选择不同分支动态循环解码的大模型如 RNN 语音识别、Seq2Seq 文本生成、GPT 类自回归解码 这类模型要么简化直接报错要么只能做局部优化无法全局裁剪冗余。2. 包含自定义算子Custom Op的模型PyTorch/TensorRT 自定义算子、算子插件、CUDA 扩展算子第三方库实现的算子如 MMDetection、TorchVision 自定义 RoI、Deformable Conv、可变形卷积、NMS 自定义实现 Simplifier 只能识别官方 ONNX 标准算子遇到未知自定义算子会跳过该子图只能优化其余部分无法整体优化严重时直接简化失败。3. 动态输入形状强依赖的复杂模型模型大量使用动态维度运算、动态 Reshape、动态 Gather、动态切片输入不固定尺寸的 NLP 模型、变长文本编码模型动态目标数量的检测模型动态 NMS、动态后处理 很多常量折叠需要固定维度推导动态维度下无法判定张量形状冗余节点无法识别优化效果极弱甚至无效。4. 非标准导出、带训练节点的复杂图保留梯度、BatchNorm 训练模式、随机算子RandomNormal、Dropout 训练模式未关闭混合精度导出、大量精度转换分支、多输出冗余绑定 部分节点无法判定是否冗余只能小幅度清理。5. 稀疏张量、量化模型、低精度压缩模型INT8/FP16 量化后的 ONNX 模型大量量化反量化算子、定点约束冗余节点很少Simplifier 优化收益极低强行简化还可能破坏量化对齐导致推理精度暴跌稀疏权重模型、结构化剪枝后的定制图拓扑经过修改常量折叠容易出错。6. 部分特殊大模型大尺寸 Transformer、ViT、LLM 类模型多头注意力、大量循环式矩阵运算、动态序列长度存在大量重复结构但属于必要计算几乎无可冗余节点可删 简化后模型体积、推理速度提升微乎其微仅能清理少量导出冗余。3.推荐优化链路逐级优化框架内先做推理模式固化model.eval()关闭 dropout、BN 训练模式再导出 ONNX使用 ONNX Simplifier 做计算图冗余清理、常量折叠再用onnxoptimizer做算子融合、常量优化补充量化场景使用 ONNX Runtime / TensorRT 做运行时算子融合 精度优化带控制流 / 自定义算子的模型需要手动重构推理图不能依赖自动简化。