Skip to content

Latest commit

 

History

History
164 lines (106 loc) · 6.07 KB

DEPLOYMENT_GUIDE_ONNX_CN.md

File metadata and controls

164 lines (106 loc) · 6.07 KB

快速上手用Bolt部署Onnx模型

目录


    步骤1:简化onnx模型(推荐,可选)     步骤2:bolt部署     附:onnx部署     常见问题
        onnx-simplifier处理动态输入
        onnx-simplifier报错
        修改onnx模型输入维度
        给onnx模型增加输出节点
        修改onnx模型节点参数
        bolt转换和推理添加新算子

步骤1:简化onnx模型(推荐,可选)

应用onnx-simplifier简化onnx模型,输入旧的onnx模型,输出简化后的onnx模型。

步骤2:bolt部署

  • 下载和编译bolt项目

    请参考INSTALL.md

  • 使用X2bolt转换onnx格式模型到bolt格式模型

    详细请参考USER_HANDBOOK.md或者 --help

    • 示例:转换./example.onnx到./example_f32.bolt
    ./X2bolt -d ./ -m example -i FP32
  • 通用benchmark测试

    详细请参考USER_HANDBOOK.md或者 --help

    • 示例:CPU推理./example_f32.bolt,查看模型输入输出信息和推理时间。
    ./benchmark -m ./example_f32.bolt
  • C/C++/Java API开发

    详细请参考DEVELOPER.md

附:onnx部署

  • 使用onnx runtime推理

    onnx runtime 是onnx的推理引擎,bolt提供了一个简单的示例运行脚本inference/engine/tools/onnx_tools/benchmark.py,支持单输入/多输入,支持指定输入文件或输入文件夹。

    • 示例:全1输入测试
    python inference/engine/tools/onnx_tools/benchmark.py ./example.onnx
    • 示例:当前目录./下单txt文件输入,模型有1个输入,名字为input,input.txt是输入input的数据内容,用空格分割。
    python inference/engine/tools/onnx_tools/benchmark.py ./example.onnx ./input.txt
    • 示例:当前目录./下多txt文件输入,模型有2个输入,名字分别为input0和input1,input0.txt是输入input0的数据内容,用空格分割,input0.txt是输入input1的数据内容。
    python inference/engine/tools/onnx_tools/benchmark.py ./example.onnx ./
    • 示例:当前目录./下多txt文件输入,输入维度是动态的,模型有2个输入,名字分别为input0和input1,shape.txt记录实际推理输入维度,input0.txt是输入input0的数据内容,用空格分割,input0.txt是输入input1的数据内容。

    shape.txt内容:维度用空格分割

    input0 1 3 224 224
    input1 1 1 224 224
    python inference/engine/tools/onnx_tools/benchmark.py ./example.onnx ./

常见问题

  • onnx-simplifier处理动态输入

    onnx-simplifier参数支持 --dynamic-input-shape--input-shape,可以通过 --hep 查看。

    • 示例:通过 --input-shape 设置多输入大小。
    python -m onnxsim old.onnx new.onnx --input-shape input0:1,3,224,224 input1:1,1,224,224
  • onnx-simplifier报错

    onnx-simplifier 的shape inference错误可以用过使用 --skip-shape-inference 解决。

    其它错误可以通过 --help 查看是否有解决措施。

  • 修改onnx模型输入维度

    bolt提供了一个简单的示例运行脚本inference/engine/tools/onnx_tools/change_input_dim.py,通过shape.txt指定各个输入信息。

    • 示例:修改./old.onnx维度信息,保存到./new.onnx。old.onnx有两个输入,名字分别为input0和input1。

    shape.txt内容:维度用空格分割

    input0 1 3 224 224
    input1 1 1 224 224
    python3 inference/engine/tools/onnx_tools/change_input_dim.py ./old.onnx ./new.onnx ./shape.txt
  • 给onnx模型增加输出节点

    bolt提供了一个简单的示例运行脚本inference/engine/tools/onnx_tools/add_output.py

    • 示例:output3和output4是新添加的两个输出名字,多输出用逗号分隔。
    python inference/engine/tools/onnx_tools/add_output.py old.onnx new.onnx output3,output4
  • 修改onnx模型节点参数

    • 示例:修改层名为440和660的reshape算子参数
    #!/usr/bin/python
    
    import onnx
    import numpy as np
    
    model_name = "../old.onnx"
    model_name_new = "./new.onnx"
    layer_name = {"440", "660"}
    
    onnx_model = onnx.load(model_name)
    graph = onnx_model.graph
    for i in range(graph.initializer.__len__()):
        name = graph.initializer[i].name
        if (name in layer_name):
            graph.initializer.remove(graph.initializer[i])
            new_param = onnx.helper.make_tensor(name, onnx.TensorProto.INT64, [2], [-1, 512])
            graph.initializer.insert(i, new_param)
            print(graph.initializer[i])
    onnx.checker.check_model(onnx_model)
    onnx.save(onnx_model, model_name_new)
  • bolt转换和推理添加新算子

    详细请参考DEVELOPER.md