【ONNX】删改

本文探讨了在深度学习模型部署中,对ONNX模型进行删改以提升性能、适应不同平台和保持准确性的重要性,介绍了关键步骤,如模型分析、策略制定和代码实战,以Resnet18为例展示了实际操作过程。
摘要由CSDN通过智能技术生成

在深度学习模型的部署过程中,对ONNX(Open Neural Network Exchange)模型进行删改是一个常见且重要的步骤。这个过程不仅关系到模型的推理性能和效率,还直接影响到最终部署的成功与否。以下是对ONNX模型进行删改的重要性以及进行这一过程时的重要步骤。

ONNX删改的意义

  1. 提高推理效率:通过删除模型中不必要的节点或层,减少推理过程中的计算量,从而加速模型的推理速度。

  2. 降低资源需求:删减模型可以减少对内存和计算资源的需求,使模型更加轻量,适合在资源受限的设备上运行。

  3. 适配特定平台:不同的推理引擎和硬件平台可能对模型的支持各不相同。通过删改,可以移除那些不被特定平台支持的操作或层,确保模型能够在目标平台上运行。

  4. 保证模型准确性:在模型转换或优化过程中,某些操作可能会引入精度损失。适当的删改有助于维护或提高模型的准确性。

ONNX删改重要步骤

  1. 模型分析:使用ONNX工具(如Netron或ONNX GraphSurgeon)可视化和分析模型结构,识别出可以删除或修改的节点和层。

  2. 确定删改策略:根据模型分析的结果和目标平台的需求,制定合理的删改策略。这可能包括删除不必要的层、替换特定操作以适配硬件特性,或者合并连续的操作以简化模型结构。

  3. 执行删改操作:利用ONNX提供的API或专门的模型编辑工具(如ONNX-Simplifier、ONNX GraphSurgeon)来实施删改策略。这可能包括节点删除、节点替换、属性修改等操作。

  4. 模型验证:在每次重大的删改后,使用ONNX Runtime或其他推理引擎验证模型的功能和性能,确保删改操作没有引入错误或降低模型精度。

  5. 性能测试:在目标硬件和推理引擎上进行性能测试,验证删改后模型的推理速度和资源消耗,确保优化目标达成。

  6. 迭代优化:根据测试结果反馈,可能需要多次迭代调整删改策略,直到模型达到满意的性能和准确度为止。

代码实战

对Resnet18的ONNX模型进行修改,使其在DLA上运行;

准备好Resnet18原始onnx文件,称为 resnet18.onnx

onnxsim
onnxsim resnet18.onnx resnet18.onnx // [简化 目标文件 简化后文件]

操作过程
import onnx
import onnx.helper as helper
resnet18_onnx = onnx.load("resnet18.onnx")

graph = resnet18_onnx.graph

node = graph.node

# 删除Flatten节点
for i in range(len(node)):
    if node[i].name == '/Flatten':
        node_rise = node[i]
        if node_rise.output[0] == '/Flatten_output_0':
            print(i)  # 查找节点ID

old_node = node[47]  # 定位到刚才检索到的算子
node.remove(old_node)   


# 只要不删节点,一个for训练遍历内,if修改节点信息的前后顺序可以任意调整
# 因为删除节点,会改变for循环遍历的 i 值
for i in range(len(node)):
    if node[i].name == '/fc/Gemm':
        # 修改节点类型
        node[i].op_type = 'TRT_FullyConnected'  
        # 添加节点属性
        channel = helper.make_attribute('channels', 1000)  
        node[i].attribute.append(channel)
        
    if node_rise.input[0] == '/Flatten_output_0':
        # 删除节点之后把模型再接起来
        node_rise.input[0] = '/avgpool/GlobalAveragePool_output_0'  
        print(i)

    if node[i].name == '/avgpool/GlobalAveragePool':
        # 更改算子类型
        node[i].op_type = 'AveragePool' 
        # 添加节点属性 
        kernel_shape_attr = helper.make_attribute('kernel_shape', [7, 7])  
        node[i].attribute.append(kernel_shape_attr)
# 保存
onnx.save(resnet18_onnx,'resnet18_orin.onnx')
效果展示

推理结果前后对比

ONNX模型的删改工作是一个涉及细致分析、策略规划和反复测试的过程。通过这一过程,可以使模型更加高效、轻量,并且兼容更广泛的部署环境,从而提高模型部署的成功率和实用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值