在深度学习模型的部署过程中,对ONNX(Open Neural Network Exchange)模型进行删改是一个常见且重要的步骤。这个过程不仅关系到模型的推理性能和效率,还直接影响到最终部署的成功与否。以下是对ONNX模型进行删改的重要性以及进行这一过程时的重要步骤。
ONNX删改的意义
-
提高推理效率:通过删除模型中不必要的节点或层,减少推理过程中的计算量,从而加速模型的推理速度。
-
降低资源需求:删减模型可以减少对内存和计算资源的需求,使模型更加轻量,适合在资源受限的设备上运行。
-
适配特定平台:不同的推理引擎和硬件平台可能对模型的支持各不相同。通过删改,可以移除那些不被特定平台支持的操作或层,确保模型能够在目标平台上运行。
-
保证模型准确性:在模型转换或优化过程中,某些操作可能会引入精度损失。适当的删改有助于维护或提高模型的准确性。
ONNX删改重要步骤
-
模型分析:使用ONNX工具(如Netron或ONNX GraphSurgeon)可视化和分析模型结构,识别出可以删除或修改的节点和层。
-
确定删改策略:根据模型分析的结果和目标平台的需求,制定合理的删改策略。这可能包括删除不必要的层、替换特定操作以适配硬件特性,或者合并连续的操作以简化模型结构。
-
执行删改操作:利用ONNX提供的API或专门的模型编辑工具(如ONNX-Simplifier、ONNX GraphSurgeon)来实施删改策略。这可能包括节点删除、节点替换、属性修改等操作。
-
模型验证:在每次重大的删改后,使用ONNX Runtime或其他推理引擎验证模型的功能和性能,确保删改操作没有引入错误或降低模型精度。
-
性能测试:在目标硬件和推理引擎上进行性能测试,验证删改后模型的推理速度和资源消耗,确保优化目标达成。
-
迭代优化:根据测试结果反馈,可能需要多次迭代调整删改策略,直到模型达到满意的性能和准确度为止。
代码实战
对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模型的删改工作是一个涉及细致分析、策略规划和反复测试的过程。通过这一过程,可以使模型更加高效、轻量,并且兼容更广泛的部署环境,从而提高模型部署的成功率和实用性。