onnxoptim.py 1.87 KB
Newer Older
zk's avatar
zk committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import onnx
import onnxoptimizer as optimizer

def optimize_onnx_model(input_onnx_path, output_onnx_path, fp16=False):
    """
    优化ONNX模型,支持基础优化+可选FP16量化
    :param input_onnx_path: 原始ONNX文件路径
    :param output_onnx_path: 优化后保存路径
    :param fp16: 是否开启FP16量化(需GPU支持,速度提升更明显)
    """
    # 1. 加载原始模型
    model = onnx.load(input_onnx_path)
    
    # 2. 定义优化策略(按需增减,下面是通用高效的组合)
    optimize_passes = [
        "eliminate_deadend",          # 删除无输出的节点
        "eliminate_identity",         # 移除Identity算子
        "eliminate_unused_initializer",# 删除未使用的初始化参数
        "fuse_bn_into_conv",          # 将BN融合到Conv中(核心优化)
        "fuse_consecutive_concats"   # 融合连续的Concat算子
    ]
    
    # 3. 执行基础优化
    optimized_model = optimizer.optimize(model, optimize_passes)
    
    # 4. 可选:FP16量化(GPU推理提速显著,精度损失可控)
    # if fp16:
    #     from onnxconverter_common import float16
    #     optimized_model = float16.convert_float_to_float16(
    #         optimized_model,
    #         keep_io_types=True,  # 保持输入输出为FP32,避免数据类型兼容问题
    #         disable_shape_infer=False
    #     )
    
    # 5. 检查优化后模型合法性并保存
    onnx.checker.check_model(optimized_model)
    onnx.save(optimized_model, output_onnx_path)
    print(f"优化后的模型已保存至:{output_onnx_path}")

# 调用示例
if __name__ == "__main__":
    # 替换为你的ONNX文件路径
    input_onnx = "weights/ground_simplified.onnx"
    output_onnx = "weights/ground_simoptim.onnx"
    # 建议先试False(FP32),GPU环境再开True(FP16)
    optimize_onnx_model(input_onnx, output_onnx, fp16=False)